Napisałem mały skrypt Pythona, który zajmuje się tym problemem. Logika sprawdza każdą linię w pliku package.accept_keywords
i działa tylko na linie rozpoczynające się od =
lub <=
. Linie te mają wersję z maksymalnym powiązaniem, dzięki czemu możemy sprawdzić, czy są już potrzebne. Linie bez kwalifikatora lub a >=
są bez zmian, ponieważ nie wiemy, czy są przestarzałe.
Linie, na których nam zależy, są następnie analizowane i sprawdzana jest zainstalowana wersja pakietu. Jeśli zainstalowana wersja jest nowsza niż wersja ze słowami kluczowymi lub w ogóle nie jest już zainstalowana, słowo kluczowe jest uważane za przestarzałe. Jeśli zainstalowany pakiet jest tej samej wersji, co wersja ze słowami kluczowymi, wówczas zainstalowany pakiet jest sprawdzany, aby sprawdzić, czy nadal zawiera słowa kluczowe. Jeśli został ustabilizowany, linia jest przestarzała, w przeciwnym razie zostaje zachowana.
#!/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)
Spowoduje to wydrukowanie nowego pliku słów kluczowych na standardowe wyjście. Uwaga : nie przekierowuj danych wyjściowych z powrotem do /etc/portage/package.accept_keywords
pliku, ponieważ spowoduje to zatkanie pliku i utratę wszystkiego.
Pomoże to w oczyszczeniu pliku słów kluczowych, a w przypadku innych problemów sortowanie pliku, a następnie sprawdzenie go pod kątem wielu wierszy dla tego samego pakietu pomoże rozwiązać większość z pozostałych.