Escribí un pequeño script de Python que se encarga de este problema. La lógica analiza cada línea del archivo package.accept_keywords
y solo actúa en las líneas que comienzan con =
o <=
. Estas líneas tienen una versión enlazada máxima para que podamos verificar si ya son necesarias. Las líneas sin un calificador o a >=
se dejan como están, ya que no podemos saber si son obsoletas.
Las líneas que nos interesan se analizan y se verifica la versión instalada del paquete. Si la versión instalada es más nueva que la versión con palabras clave, o ya no está instalada, la palabra clave se considera obsoleta. Si el paquete instalado es la misma versión que la versión con palabras clave, entonces el paquete instalado se verifica para ver si todavía tiene palabras clave. Si se ha estabilizado, la línea queda obsoleta, de lo contrario se conserva.
#!/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)
Esto imprimirá el nuevo archivo de palabras clave para estandarizar. Nota : no redirija la salida nuevamente /etc/portage/package.accept_keywords
o tropezará con el archivo y perderá todo.
Esto contribuirá en gran medida a limpiar su archivo de palabras clave y, para sus otras preocupaciones, ordenar el archivo y luego examinarlo en busca de varias líneas para el mismo paquete ayudará a resolver la mayor parte de lo que queda.