젠투 시스템에서 .keywords 파일을 정리하는 방법?


10

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

이 파일은 시간이 지남에 따라 증가하며 조만간 어떤 행이 사용되지 않는지 기억할 수 없습니다.

때때로 스크립트를 사용하여 목록을 정리하는 방법은 무엇입니까?

줄을 삭제해야합니다.

  • 테스트 버전이 이미 안정화 된 경우
  • > = 동일한 패키지에 사용되었습니다
  • = 더 작은 버전 번호를 가진 동일한 패키지에 사용되었습니다

그래도이 내용을보고 있으면 내 답변을 참조하십시오.
eyoung100

답변:


6

app-portage / portpeek 이라는이 작업을위한 공식 패키지가 있습니다 .

그것은 할 수 있습니다

  • 더 이상 사용되지 않는 USE 플래그 찾기
  • 더 이상 사용되지 않는 키워드 및
  • -f(수정)이 매개 변수로 추가 된 경우 파일을 정리하십시오 .

3

이 문제를 해결하는 작은 파이썬 스크립트를 작성했습니다. 이 논리는 파일의 각 줄을보고 또는로 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파일이 손상되어 모든 것을 잃게됩니다.

이것은 키워드 파일을 정리하고 다른 문제를 해결하기 위해 먼 길을 갈 것입니다. 파일을 정렬 한 다음 동일한 패키지에 대해 여러 줄로 검사하면 남아있는 대부분의 문제를 해결하는 데 도움이됩니다.


1

디렉토리에서 package. * 파일을 변환 할 수 있다는 것을 알고 있습니까?

그런 다음 원자를 여러 파일로 구성 할 수 있습니다. 예를 들어, 내 시스템에서 다음과 같은 결과를 얻었습니다.

/etc/portage/package.keywords:
  package.keywords
  qt5.keywords
  xfce.keywords

/etc/portage/package.use:
  package.use
  qt5.use
  xfce.use

기타

파일을 업데이트하는 데 도움이되는 것이 실제로 유용하다는 것을 알았습니다.


0

Ikraav의 답변에 추가 :

를 사용한 후 eix -tT비교 연산자와 패키지 버전 번호를 제거하십시오. 파일은 다음과 같이 쓸 수도 있습니다 :

dev-python/ipython ~amd64
# and many lines later
package-cat/package ~arch

이를 통해 항상 테스트 버전 dev-python/ipythonpackage-cat/package


~amd64내 문제는 오해의 소지가 될 수 있습니다. 버전 번호는 그대로 유지해야합니다. 항상 최신 버전을 얻고 싶지 않지만 중복 줄을 찾으십시오.
Jonas Stein

버전없이 패키지를 사용하면 중복 항목이 제거됩니다. 패키지 A에는> = 패키지 C 버전 1.0.0이 필요하고 패키지 B에는 C 버전 1.0.1이 필요합니다. 실제로, 패키지 A와 B는 모두 1보다 큰 모든 버전에서 만족되며, 1.0.0 이상의 모든 버전이 ~ arch 인 경우 버전 번호는 관련이 없습니다. 이 문제를 해결하는 유일한 다른 방법은 패키지 C의 모든 버전을 마스킹 한 다음 포티지 월드 업데이트 후 가장 큰 버전을 마스킹 해제하는 것입니다.
eyoung100

나는 구식이며 모든 포티지 구성 파일을 수동으로 편집합니다. 주로 포티지가 자동으로 수행하기 전에 수행하는 방법을 배웠기 때문입니다. 복제본이있는 이유는 최신 버전이 이전 버전을 대체 할 때 포티지가 해당 라인을 제거하지 않기 때문입니다.
eyoung100

0

다음은 더 이상 설치되지 않은 /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 = []

0

현재이 app-portage/eix패키지는라는 편리한 도구를eix-test-obsolete 제공합니다 . 간단한 설명 eix-test-obsolete -h:

Usage: eix-test-obsolete [options] detail|brief|quick
  This is a wrapper script for eix (eix 0.33.5).

It calls eix -tTc several times with various variable settings in order to
display missing packages or packages with obsolete entries in
/etc/portage/package.* in a more organized manner than eix -tTc would do alone.

/etc/portage/package.*파일 의 모든 중복 항목에 대한 훌륭한 개요를 제공 합니다. 내가 개인적으로 놓친 유일한 것은 중복 unmask / use / accept / what를 정의하는 정확한 파일과 라인에 대한 정보입니다. 그러나이 경우 grep -nr도움이됩니다.

$ eix-test-obsolete -c
No non-matching entries in /etc/portage/package.keywords
No non-matching entries in /etc/portage/package.accept_keywords
No non-matching entries in /etc/portage/package.mask
No non-matching entries in /etc/portage/package.unmask
No non-matching or empty entries in /etc/portage/package.use
No non-matching or empty entries in /etc/portage/package.env
No non-matching or empty entries in /etc/portage/package.license
No non-matching or empty entries in /etc/portage/package.accept_restrict
No non-matching or empty entries in /etc/portage/package.cflags
The names of all installed packages are in the database.

Redundant in /etc/portage/package.{,accept_}keywords:

... considered as REDUNDANT_IF_NO_CHANGE
[I] app-accessibility/at-spi2-core (2.26.2(2)@11/30/2018): D-Bus accessibility specifications and registration daemon
[I] app-emulation/runc (1.0.0_rc5_p20180509@11/29/2018): runc container cli tools
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset
[I] sys-process/tini (0.18.0@11/29/2018): A tiny but valid init for containers
[1] "go-overlay" /var/db/repos/go-overlay

Found 4 matches


Not installed but in /etc/portage/package.{,accept_}keywords:
[N] app-emulation/wine-staging ((~)3.21(3.21)): Free implementation of Windows(tm) on Unix, with Wine-Staging patchset

No  redundant  entries in /etc/portage/package.mask
No uninstalled entries in /etc/portage/package.mask
No  redundant  entries in /etc/portage/package.unmask
No uninstalled entries in /etc/portage/package.unmask
Skipping check:  redundant  entries in /etc/portage/package.use
Skipping check: uninstalled entries in /etc/portage/package.use
Skipping check:  redundant  entries in /etc/portage/package.env
Skipping check: uninstalled entries in /etc/portage/package.env
No  redundant  entries in /etc/portage/package.license
No uninstalled entries in /etc/portage/package.license
No  redundant  entries in /etc/portage/package.accept_restrict
No uninstalled entries in /etc/portage/package.accept_restrict
Skipping check:  redundant  entries in /etc/portage/package.cflags
Skipping check: uninstalled entries in /etc/portage/package.cflags

Installed packages with a version not in the database (or masked):
[U] www-client/firefox (60.3.0-r1@12/01/2018 -> 60.4.0^d): Firefox Web Browser

-1

로 시작하십시오 eix -tT. 설치 app-portage/eix하려면 설치하십시오 .


eix -tT가 어떻게 이것을 해결하는지 이해하지 못합니다. 좀 더 설명해 주시겠습니까?
Jonas Stein

나는 당신이 일부 출력을 pastebin해야하고 이해하지 못하는 부분의 라인 번호를 가리켜 야한다고 생각합니다.
lkraav

더 많은 정보 가 있었으면 좋겠다 . 이로 인해 "팁과 트릭"이 발생하고 원래 블로그 게시물에 대한 링크가 작동하지 않습니다. 이것은 조금 도움 됩니다. 패키지는 최근에 활성화되고있다. 홈페이지 링크는 eix.berlios.de를 가리 키지 만 존재하지 않습니다. 온라인에 대한 맨 페이지는 어디에 있습니까 (모든 옵션 포함)?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.