Eu escrevi um pequeno script python que cuida desse problema. A lógica examina cada linha do arquivo package.accept_keywords
e atua apenas nas linhas que começam com =
ou <=
. Essas linhas têm uma versão limite máxima para que possamos verificar se são mais necessárias. As linhas sem um qualificador ou a >=
são deixadas como estão, pois não podemos saber se são obsoletas.
As linhas com as quais nos preocupamos são analisadas e a versão instalada do pacote é verificada. Se a versão instalada for mais recente que a versão com palavras-chave ou não estiver mais instalada, a palavra-chave será considerada obsoleta. Se o pacote instalado tiver a mesma versão da palavra-chave, o pacote instalado será verificado para ver se ainda está com a palavra-chave. Se tiver sido estabilizada, a linha será obsoleta, caso contrário, será mantida.
#!/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)
Isso imprimirá o novo arquivo de palavras-chave como padrão. Nota : não redirecione a saída de volta para /etc/portage/package.accept_keywords
você, ou você estraga o arquivo e perde tudo.
Isso ajudará bastante a limpar o arquivo de palavras-chave e, para outras preocupações, classificar o arquivo e examiná-lo em várias linhas para o mesmo pacote, ajudando a resolver a maior parte do que resta.