Ich habe ein kleines Python-Skript geschrieben, das sich um dieses Problem kümmert. Die Logik betrachtet jede Zeile in der Datei package.accept_keywords
und 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_keywords
Leiten 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.