J'ai écrit un petit script python qui s'occupe de ce problème. La logique examine chaque ligne du fichier package.accept_keywords
et n'agit que sur les lignes commençant par =
ou <=
. Ces lignes ont une version liée maximale afin que nous puissions vérifier si elles sont plus nécessaires. Les lignes sans qualificatif ou sans >=
sont laissées telles quelles car nous ne pouvons pas savoir si elles sont obsolètes.
Les lignes qui nous intéressent sont ensuite analysées et la version installée du package est vérifiée. Si la version installée est plus récente que la version avec mot clé, ou n'est plus installée du tout, le mot clé est considéré comme obsolète. Si le package installé est la même version que la version avec mot-clé, le package installé est vérifié pour voir s'il est toujours avec mot-clé. S'il a été stabilisé, la ligne est obsolète, sinon elle est conservée.
#!/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)
Cela imprimera le nouveau fichier de mots clés en sortie standard. Remarque : ne redirigez pas la sortie vers /etc/portage/package.accept_keywords
ou vous encombrerez le fichier et perdrez tout.
Cela ira un long chemin vers le nettoyage de votre fichier de mots-clés et pour vos autres préoccupations, trier le fichier et ensuite l'examiner pour plusieurs lignes pour le même package aidera à résoudre la plupart de ce qui reste.