이 문제를 해결하는 작은 파이썬 스크립트를 작성했습니다. 이 논리는 파일의 각 줄을보고 또는로 package.accept_keywords
시작하는 줄에서만 작동합니다 . 이 라인은 최대 바운드 버전을 가지므로 더 이상 필요한지 확인할 수 있습니다. 한정 자나가없는 줄 은 그대로 남겨둔다.=
<=
>=
우리가 관심을 갖는 줄을 파싱하고 설치된 버전의 패키지를 확인합니다. 설치된 버전이 키워드 버전보다 최신이거나 더 이상 설치되지 않은 경우 해당 키워드는 사용되지 않는 것으로 간주됩니다. 설치된 패키지가 키워드 버전과 동일한 버전 인 경우 설치된 패키지가 키워드인지 여전히 확인합니다. 안정화 된 경우 해당 라인은 더 이상 사용되지 않으며 유지되지 않습니다.
#!/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
파일이 손상되어 모든 것을 잃게됩니다.
이것은 키워드 파일을 정리하고 다른 문제를 해결하기 위해 먼 길을 갈 것입니다. 파일을 정렬 한 다음 동일한 패키지에 대해 여러 줄로 검사하면 남아있는 대부분의 문제를 해결하는 데 도움이됩니다.