Gentooシステムで.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 14

回答:


6

現在、app-portage / portpeekと呼ばれるこのタスクの公式パッケージがあります。

できる

  • 時代遅れのUSEフラグを見つけ、
  • 廃止されたキーワードと
  • -f(修正)がパラメーターとして追加されている場合は、ファイルをクリーンアップします。

3

私はこの問題を処理する小さなpythonスクリプトを書きました。ロジックはファイルの各行を調べ、orまたは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すると、ファイルが破壊され、すべてが失われます。

これは、キーワードファイルのクリーンアップやその他の懸念事項の解決に大いに役立ちます。ファイルを並べ替え、同じパッケージの複数行を調べることで、残っているほとんどの問題を解決できます。


1

あなたはディレクトリ内のpackage。*ファイルを変換できることを知っていますよね?

それから、アトムをいくつかのファイルに整理できます。たとえば、私のシステムでは次のようになりました(まあ、実際にはそうではありませんが、今はラップトップにいません。ただし、アイデアはわかります)。

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

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

これは、ファイルを更新するのに非常に役立つことがわかりました。


0

イクラフの答えに追加:

を使用した後eix -tT、比較演算子とパッケージのバージョン番号を削除します。ファイルは次のように書くこともできます:

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

これによりdev-python/ipython、とのテストバージョンが常に取得されることが保証されます。package-cat/package


~amd64私の質問では、誤解を招くかもしれません。バージョン番号は変更しないでください。常に最新バージョンを入手したくありませんが、冗長な行を見つけます。
Jonas Stein 2014

バージョンなしでパッケージを使用すると、重複したエントリが削除されます。パッケージAにはパッケージCバージョン1.0.0以上が必要であり、パッケージBにはCバージョン1.0.1が必要であることを考慮してください。実際には、パッケージAとBはどちらも1より大きいすべてのバージョンで満足しています。1.0.0を超えるすべてのバージョンが〜archにある場合、バージョン番号は関係ありません。これを修正する他の唯一の方法は、パッケージCのすべてのバージョンをマスクし、Portage Worldの更新後に最大のバージョンのマスクを解除することです。
eyoung100 14

私は古い学校で、Portageの設定ファイルをすべて手動で編集しています。これは、Portageが自動的に行う前に、その方法を学んだことが主な理由です。重複している理由は、新しいバージョンが古いバージョンに取って代わっても、Portageがその行を削除しないためです。
eyoung100 14

0

以下は、インストールされなくなった/etc/portage/package.*ファイルからのエントリーをフィルターする小さなスクリプトです。さらに、削除されたエントリのすぐ上にあるすべてのコメント行を削除します。(例えば、autounmaskによって生成されたもの)。コメントが空白行で区切られている場合は、下のコメントのみが削除されます。スクリプトは重複するエントリを削除しません。

このスクリプトを機能させるには、portage-utilsをインストールし、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 / whateverを定義する正確なファイルと行に関する情報です。ただし、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がこれを解決する方法がわかりません。もう少し説明してもらえますか?
ジョナススタイン

私はあなたがいくつかの出力をペーストビンし、あなたが理解していない部分の行番号を指す必要があると思います。
lkraav 14

もっと情報があればいいのに。これは「ヒントとコツ」につながり、元のブログ投稿へのリンクは無効です。これは少し役立ちます。パッケージは、最近活躍しています。ホームページのリンクはeix.berlios.deを指していますが、これは存在しません。そのオンラインのマンページはどこにありますか(すべてのオプション付き)?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.