Wie räume ich die .keywords-Datei auf einem Gentoo-System auf?

10

Sie können Testpakete auf einem gentoo stableSystem auswählen, indem Sie der Schlüsselwortliste eine Zeile mit der folgenden Syntax hinzufügen:

cat /etc/portage/package.keywords

=dev-python/ipython-0.13.2 ~amd64
# and many lines later
=dev-python/ipython-0.14.1 ~amd64
# and many lines later
>=dev-python/ipython-0.13.4 ~amd64

Diese Datei wächst mit der Zeit und früher oder später kann man sich nicht erinnern, welche Zeilen veraltet sind.

Wie kann ich die Liste von Zeit zu Zeit mit einem Skript aufräumen?

Eine Zeile sollte gelöscht werden,

  • wenn die Testversion bereits stabilisiert ist
  • > = wurde für dasselbe Paket verwendet
  • = wurde für dasselbe Paket mit kleinerer Versionsnummer verwendet
Jonas Stein
quelle
Wenn Sie dies immer noch sehen, sehen Sie meine Antwort.
eyoung100

Antworten:

6

Für diese Aufgabe gibt es jetzt ein offizielles Paket namens app-portage / portpeek .

Es kann

  • Finden Sie veraltete USE-Flags und
  • veraltete KEYWORDS und
  • Bereinigen Sie die Dateien, wenn -f(Fix) als Parameter hinzugefügt wird.
Jonas Stein
quelle
3

Ich habe ein kleines Python-Skript geschrieben, das sich um dieses Problem kümmert. Die Logik betrachtet jede Zeile in der Datei package.accept_keywordsund wirkt nur auf Zeilen, die mit =oder beginnen <=. Diese Zeilen haben eine maximal gebundene Version, sodass wir prüfen können, ob sie nicht mehr benötigt werden. Zeilen ohne Qualifier oder a >=bleiben unverändert, da wir nicht wissen können, ob sie veraltet sind.

Die Zeilen, die uns wichtig sind, werden dann analysiert und die installierte Version des Pakets wird überprüft. Wenn die installierte Version neuer als die Version mit Schlüsselwörtern ist oder überhaupt nicht mehr installiert wird, gilt das Schlüsselwort als veraltet. Wenn das installierte Paket dieselbe Version wie die Version mit Schlüsselwörtern hat, wird das installierte Paket überprüft, um festzustellen, ob es noch mit Schlüsselwörtern versehen ist. Wenn es stabilisiert wurde, ist die Linie veraltet, andernfalls bleibt sie erhalten.

#!/bin/env python

import re
import portage

vartree = portage.db[portage.root]['vartree']

with open('/etc/portage/package.accept_keywords') as f:
    for x in f:
        # eat newline
        x = x.rstrip()
        # we only want lines with a bounded max version
        if re.match('^(=|<=)',x):
            # get the package cpv atom -- strip the =|<= and the trailing keyword(s)
            cpv_masked = re.sub('[<=]','',x.split(' ',1)[0])
            cat, pkg, ver, rev = portage.catpkgsplit(cpv_masked)
            # get cpv for all installed versions of the package
            cpv_installed = vartree.dep_match(cat+'/'+pkg)
            for cpv in cpv_installed:
                cmp = portage.pkgcmp(portage.pkgsplit(cpv), portage.pkgsplit(cpv_masked))
                # if the installed version is not newer than the masked version
                if (cmp <= 0):
                    # check if this version is still keyworded
                    cpv_keywords = vartree.dbapi.aux_get(cpv, ['KEYWORDS'])
                    # keep keyword if the package has no keywords (**)
                    if not cpv_keywords[0]:
                        print(x)
                        break
                    # check if the installed package is still keyworded
                    for cpv_keyword in cpv_keywords[0].split(' '):
                        if cpv_masked_keyword == cpv_keyword:
                            # it is, keep the atom and move on to the next one
                            print(x)
                            break                    
        else:
            # keep atoms that have an unbounded max version
            print(x)

Dadurch wird die neue Schlüsselwortdatei standardmäßig gedruckt. Hinweis : /etc/portage/package.accept_keywordsLeiten Sie die Ausgabe nicht zurück , da sonst die Datei überlastet wird und alles verloren geht.

Dies trägt wesentlich zur Bereinigung Ihrer Keyword-Datei und Ihrer anderen Probleme bei. Wenn Sie die Datei sortieren und dann auf mehrere Zeilen für dasselbe Paket untersuchen, können Sie die meisten verbleibenden Probleme lösen.

Casey
quelle
1

Sie wissen, dass Sie das Paket konvertieren können. * Dateien in Verzeichnissen, richtig?

Dann können Sie Ihre Atome in mehreren Dateien organisieren, z. B. in meinem System habe ich Folgendes (nun, nicht wirklich, ich bin jetzt nicht an meinem Laptop. Aber Sie haben die Idee):

/etc/portage/package.keywords:
  package.keywords
  qt5.keywords
  xfce.keywords

/etc/portage/package.use:
  package.use
  qt5.use
  xfce.use

etc.

Ich fand das sehr nützlich, um die Dateien aktualisieren zu können.

Alberto
quelle
0

Hinzufügen zu Ikraavs Antwort:

eix -tTEntfernen Sie nach der Verwendung die Vergleichsoperatoren und die Versionsnummer des Pakets. Ihre Datei kann auch wie folgt geschrieben werden:

dev-python/ipython ~amd64
# and many lines later
package-cat/package ~arch

Dies garantiert, dass Sie immer die Testversionen von dev-python/ipythonund erhaltenpackage-cat/package

eyoung100
quelle
Das ~amd64in meiner Frage könnte irreführend sein. Die Versionsnummern sollten unberührt bleiben. Ich möchte nicht immer die neueste Version bekommen, sondern redundante Leitungen finden.
Jonas Stein
Wenn Sie das Paket ohne die Version verwenden, werden die doppelten Einträge entfernt. Angenommen, Paket A erfordert> = Paket C Version 1.0.0, und Paket B erfordert C Version 1.0.1. In der Praxis werden Paket A und B von jeder Version größer als 1 erfüllt. Wenn sich alle Versionen> 1.0.0 in ~ arch befinden, sind die Versionsnummern irrelevant. Die einzige andere Möglichkeit, dies zu beheben, besteht darin, alle Versionen von Paket C zu maskieren und dann die größte Version nach dem Portage World-Update zu entlarven.
eyoung100
Ich bin altmodisch und bearbeite alle meine Portage-Konfigurationsdateien manuell, hauptsächlich, weil ich gelernt habe, wie man das macht, bevor Portage es automatisch gemacht hat. Der Grund, warum Sie Duplikate haben, ist, dass Portage die Zeile nicht entfernt, wenn eine neuere Version eine ältere ersetzt.
eyoung100
0

Hier ist ein kleines Skript, das Einträge aus /etc/portage/package.* Dateien filtert, die nicht mehr installiert sind. Außerdem werden alle Kommentarzeilen direkt über dem entfernten Eintrag entfernt. (zB wie durch Autounmaske erzeugt). Wenn Kommentare durch eine Leerzeile getrennt sind, werden nur die unteren Kommentare entfernt. Das Skript entfernt keine doppelten Einträge.

Bitte beachten Sie, dass Portage- Utils installiert sein müssen und der postsync-Hook /etc/portage/postsync.d/q-reinitialize aktiviert sein muss, damit dieses Skript funktioniert.

#!/usr/bin/env python3

import argparse
import sys
import os
from subprocess import call
import contextlib

if __name__ != '__main__':
    raise Exception("ust be used as a main module with a parameter as the input file")

parser = argparse.ArgumentParser(description="cleanup /etc/portage/package.* files")
parser.add_argument("infile", help="an input file to clean")
parser.add_argument("--out", dest="outfile", help="the output is written to this file. if not specified, the output is written to stdout.")
parser.add_argument("--inplace", action='store_true', help="overwrite the in file. if specified, --out is ignored.")

args = parser.parse_args()

def checkInstalled(package):
    with open(os.devnull, 'w') as devnull:
        status = call('qlist -IC "' + str(package.split()[0].strip()) + '"', shell=True, stdout=devnull)
        return status == 0

@contextlib.contextmanager
def getOutFile(args):
    if args.inplace:
        fh = open(args.infile, 'w')
    elif args.outfile != None:
        fh = open(args.outfile, 'w')
    else:
        fh = sys.stdout
    try:
        yield fh
    finally:
        if fh is not sys.stdout:
            fh.close()

commentBuffer = []
lines = []

with open(args.infile, 'r') as f:
    lines = f.readlines()

with getOutFile(args) as out:
    for line in lines: 
        if line.lstrip().startswith("#"):
            commentBuffer.append(line)
        else:
            if line.strip() == "" or checkInstalled(line):
                if  commentBuffer:
                    out.write("".join(commentBuffer))
                out.write(line)
            commentBuffer = []
Bis Schäfer
quelle
0

Ab sofort bietet das app-portage/eixPaket ein praktisches Tool namenseix-test-obsolete . Eine kurze Beschreibung von eix-test-obsolete -h:

Usage: eix-test-obsolete [options] detail|brief|quick
  This is a wrapper script for eix (eix 0.33.5).

It calls eix -tTc several times with various variable settings in order to
display missing packages or packages with obsolete entries in
/etc/portage/package.* in a more organized manner than eix -tTc would do alone.

Es gibt einen ziemlich guten Überblick über alle redundanten Einträge in /etc/portage/package.*Dateien. Das einzige, was mir persönlich fehlt, ist eine Information über die genaue Datei und Zeile, die die redundante Demaskierung / Verwendung / Akzeptieren / Was auch immer definiert. Allerdings grep -nrhilft in diesem Fall.

$ eix-test-obsolete -c
No non-matching entries in /etc/portage/package.keywords
No non-matching entries in /etc/portage/package.accept_keywords
No non-matching entries in /etc/portage/package.mask
No non-matching entries in /etc/portage/package.unmask
No non-matching or empty entries in /etc/portage/package.use
No non-matching or empty entries in /etc/portage/package.env
No non-matching or empty entries in /etc/portage/package.license
No non-matching or empty entries in /etc/portage/package.accept_restrict
No non-matching or empty entries in /etc/portage/package.cflags
The names of all installed packages are in the database.

Redundant in /etc/portage/package.{,accept_}keywords:

... considered as REDUNDANT_IF_NO_CHANGE
[I] app-accessibility/at-spi2-core (2.26.2(2)@11/30/2018): D-Bus accessibility specifications and registration daemon
[I] app-emulation/runc (1.0.0_rc5_p20180509@11/29/2018): runc container cli tools
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset
[I] sys-process/tini (0.18.0@11/29/2018): A tiny but valid init for containers
[1] "go-overlay" /var/db/repos/go-overlay

Found 4 matches


Not installed but in /etc/portage/package.{,accept_}keywords:
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset

No  redundant  entries in /etc/portage/package.mask
No uninstalled entries in /etc/portage/package.mask
No  redundant  entries in /etc/portage/package.unmask
No uninstalled entries in /etc/portage/package.unmask
Skipping check:  redundant  entries in /etc/portage/package.use
Skipping check: uninstalled entries in /etc/portage/package.use
Skipping check:  redundant  entries in /etc/portage/package.env
Skipping check: uninstalled entries in /etc/portage/package.env
No  redundant  entries in /etc/portage/package.license
No uninstalled entries in /etc/portage/package.license
No  redundant  entries in /etc/portage/package.accept_restrict
No uninstalled entries in /etc/portage/package.accept_restrict
Skipping check:  redundant  entries in /etc/portage/package.cflags
Skipping check: uninstalled entries in /etc/portage/package.cflags

Installed packages with a version not in the database (or masked):
[U] www-client/firefox (60.3.0-r1@12/01/2018 -> 60.4.0^d): Firefox Web Browser
hoefling
quelle
-1

Beginnen Sie mit eix -tT. Installieren Sie app-portage/eix, um das zu bekommen.

lkraav
quelle
Ich verstehe nicht, wie eix -tT dies löst. Können Sie es bitte etwas näher erläutern?
Jonas Stein
Ich denke, Sie müssten einige Ausgaben einfügen und auf die Zeilennummern von Teilen zeigen, die Sie nicht verstehen.
lkraav
Ich wünschte, es gäbe mehr Informationen . Dies führt zu "Tipps und Tricks" und der Link zum ursprünglichen Blog-Beitrag ist tot. Das hilft ein bisschen. Das Paket war kürzlich aktiv. Der Homepage-Link verweist auf eix.berlios.de, existiert aber nicht. Wo sind die Manpages dafür online (mit allen Optionen)?