我写了一个小的python脚本来解决这个问题。该逻辑查看文件中的每一行,package.accept_keywords
并且仅作用于以=
或开头的行<=
。这些行具有最大绑定版本,因此我们可以检查是否需要它们。没有限定符或a >=
的行将保持原样,因为我们不知道它们是否已过时。
然后解析我们关心的行,并检查软件包的安装版本。如果安装的版本比关键字的版本新,或者根本不再安装,则认为该关键字已过时。如果已安装的软件包与关键字版本是同一版本,则将检查已安装的软件包以查看其是否仍是关键字。如果已稳定,则该线已过时,否则将保留。
#!/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)
这将把新的关键字文件打印为标准输出。 注意:请勿将输出重定向回,/etc/portage/package.accept_keywords
否则将破坏文件并丢失所有内容。
这对于清理关键字文件和其他问题大有帮助,对文件进行排序,然后检查同一包的多行内容将有助于解决剩下的大部分问题。