gentoo stable
키워드 목록에 다음 구문이 포함된 행을 추가하여 시스템의 테스트 패키지를 선택할 수 있습니다.
cat /etc/portage/package.keywords
=dev-python/ipython-0.13.2 ~amd64
# and many lines later
=dev-python/ipython-0.14.1 ~amd64
# and many lines later
>=dev-python/ipython-0.13.4 ~amd64
파일은 시간이 지남에 따라 커지며 조만간 사람들은 어떤 줄이 오래된 것인지 기억하지 못하게 될 것입니다.
스크립트로 수시로 목록을 정리하려면 어떻게 해야 하나요?
행을 삭제해야 합니다.
- 테스트 버전이 이미 안정적인 경우
- >= 동일한 패키지의 경우
- = 버전 번호가 더 작은 동일한 패키지의 경우
답변1
이제 이 작업을 위한 공식 패키지가 있습니다.애플리케이션 포티지/포트픽.
그것은 할 수 있다
- 쓸모없는 USE 플래그를 찾고
- 오래된 키워드와
-f
인수로 추가(수정)하면 파일이 정리됩니다.
답변2
이 문제를 해결하기 위해 작은 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
그렇지 않으면 파일이 손상되고 모든 콘텐츠가 손실됩니다.
이는 키워드 파일을 정리하는 데 큰 도움이 되며, 다른 문제의 경우 파일을 정렬한 다음 동일한 패키지에 대해 여러 줄을 확인하면 나머지 문제 대부분을 해결하는 데 도움이 됩니다.
답변3
package.* 파일을 디렉터리로 변환할 수 있다는 것을 알고 계시죠?
그런 다음 원자를 여러 파일로 구성할 수 있습니다. 예를 들어 내 시스템에서 다음과 같은 정보를 얻었습니다.
/etc/portage/package.keywords:
package.keywords
qt5.keywords
xfce.keywords
/etc/portage/package.use:
package.use
qt5.use
xfce.use
등.
나는 이것이 내 파일을 업데이트하는 데 매우 유용하다는 것을 알았습니다.
답변4
이것은 더 이상 설치되지 않은 /etc/portage/package.* 파일의 항목을 필터링하는 작은 스크립트입니다. 또한 삭제된 항목 바로 위에 있는 모든 주석 줄을 제거합니다. (예: 자동 마스크 해제로 생성됨) 주석을 빈 줄로 구분하면 하위 주석만 제거됩니다. 스크립트는 중복 항목을 제거하지 않습니다.
참고하세요포티지 유틸리티postsync 후크를 설치해야 합니다./etc/portage/postsync.d/q-reinitialize활성화되어야 합니다.이 스크립트를 작동시키려면.
#!/usr/bin/env python3
import argparse
import sys
import os
from subprocess import call
import contextlib
if __name__ != '__main__':
raise Exception("ust be used as a main module with a parameter as the input file")
parser = argparse.ArgumentParser(description="cleanup /etc/portage/package.* files")
parser.add_argument("infile", help="an input file to clean")
parser.add_argument("--out", dest="outfile", help="the output is written to this file. if not specified, the output is written to stdout.")
parser.add_argument("--inplace", action='store_true', help="overwrite the in file. if specified, --out is ignored.")
args = parser.parse_args()
def checkInstalled(package):
with open(os.devnull, 'w') as devnull:
status = call('qlist -IC "' + str(package.split()[0].strip()) + '"', shell=True, stdout=devnull)
return status == 0
@contextlib.contextmanager
def getOutFile(args):
if args.inplace:
fh = open(args.infile, 'w')
elif args.outfile != None:
fh = open(args.outfile, 'w')
else:
fh = sys.stdout
try:
yield fh
finally:
if fh is not sys.stdout:
fh.close()
commentBuffer = []
lines = []
with open(args.infile, 'r') as f:
lines = f.readlines()
with getOutFile(args) as out:
for line in lines:
if line.lstrip().startswith("#"):
commentBuffer.append(line)
else:
if line.strip() == "" or checkInstalled(line):
if commentBuffer:
out.write("".join(commentBuffer))
out.write(line)
commentBuffer = []