Làm cách nào để dọn dẹp tệp .keywords trên hệ thống gentoo?


10

Người ta có thể chọn các gói thử nghiệm trên một gentoo stablehệ thống bằng cách thêm một dòng với cú pháp sau vào danh sách từ khóa:

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

Tập tin này sẽ phát triển trong thời gian và sớm hay muộn người ta không thể nhớ những dòng nào đã lỗi thời.

Thỉnh thoảng tôi có thể thu dọn danh sách bằng một tập lệnh?

Một dòng nên được xóa,

  • nếu phiên bản thử nghiệm đã ổn định
  • > = đã được sử dụng cho cùng một gói
  • = đã được sử dụng cho cùng một gói với số phiên bản nhỏ hơn

Nếu bạn vẫn đang xem này, hãy xem Câu trả lời của tôi.
Eyoung100

Câu trả lời:


6

Hiện tại có một gói chính thức cho nhiệm vụ này được gọi là app-portage / portpeek .

Nó có thể

  • tìm cờ USE lỗi thời và
  • TỪ KHÓA lỗi thời và
  • làm sạch các tập tin, nếu -f(sửa chữa) được thêm vào như là tham số.

3

Tôi đã viết một kịch bản python nhỏ chăm sóc vấn đề này. Logic nhìn vào từng dòng trong tệp package.accept_keywordsvà chỉ hoạt động trên các dòng bắt đầu bằng =hoặc <=. Những dòng này có phiên bản ràng buộc tối đa để chúng tôi có thể kiểm tra xem chúng có cần thiết nữa không. Các dòng không có vòng loại hoặc a >=được để nguyên như chúng ta không thể biết nếu chúng bị lỗi thời.

Các dòng mà chúng tôi quan tâm sau đó được phân tích cú pháp và phiên bản cài đặt của gói được kiểm tra. Nếu phiên bản đã cài đặt mới hơn phiên bản từ khóa hoặc hoàn toàn không được cài đặt, từ khóa sẽ bị coi là lỗi thời. Nếu gói đã cài đặt là phiên bản giống với phiên bản được từ khóa thì gói đã cài đặt sẽ được kiểm tra để xem liệu nó có còn bị khóa không. Nếu nó đã được ổn định, dòng bị lỗi thời, nếu không nó được giữ lại.

#!/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)

Điều này sẽ in các tập tin từ khóa mới để chuẩn ra. Lưu ý : không chuyển hướng đầu ra trở lại /etc/portage/package.accept_keywordshoặc bạn sẽ ghi đè tệp và mất mọi thứ.

Điều này sẽ đi một chặng đường dài để làm sạch tệp từ khóa của bạn và cho các mối quan tâm khác của bạn, sắp xếp tệp và sau đó kiểm tra nó cho nhiều dòng cho cùng một gói sẽ giúp giải quyết hầu hết những gì còn lại.


1

Bạn biết bạn có thể chuyển đổi gói. * Tập tin trong thư mục, phải không?

Sau đó, bạn có thể sắp xếp các nguyên tử của mình trong một số tệp, ví dụ: trong hệ thống của tôi, tôi đã nhận được những điều sau đây (tốt, không thực sự, tôi không ở máy tính xách tay của tôi bây giờ. Nhưng bạn đã có ý tưởng):

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

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

Vân vân.

Tôi thấy điều này thực sự hữu ích để giúp tôi cập nhật các tập tin.


0

Thêm vào câu trả lời của Ikraav:

Sau khi sử dụng eix -tT, loại bỏ các toán tử so sánh và số phiên bản gói. Tệp của bạn cũng có thể được viết là:

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

Điều này sẽ đảm bảo rằng bạn sẽ luôn nhận được các phiên bản thử nghiệm của dev-python/ipythonpackage-cat/package


các ~amd64câu hỏi của tôi có thể gây hiểu lầm. Các số phiên bản nên được giữ nguyên. Tôi không muốn luôn luôn có phiên bản mới nhất, nhưng tìm dòng dư thừa.
Jonas Stein

Sử dụng gói không có phiên bản sẽ loại bỏ các mục trùng lặp. Xem xét Gói A yêu cầu> = Gói C Phiên bản 1.0.0 và Gói B yêu cầu Phiên bản C 1.0.1. Trong thực tế, Gói A và B đều được thỏa mãn bởi bất kỳ phiên bản nào lớn hơn 1 và nếu tất cả các phiên bản> 1.0.0 đều ở ~ vòm thì số phiên bản không liên quan. Cách duy nhất khác để khắc phục điều này là che dấu tất cả các phiên bản của Gói C sau đó vạch mặt Phiên bản lớn nhất sau khi cập nhật thế giới portage.
Eyoung100

Tôi là trường học cũ và tôi chỉnh sửa thủ công tất cả các tệp cấu hình Portage của mình, chủ yếu là vì tôi đã học được cách thực hiện trước khi portage tự động thực hiện. Lý do bạn có các bản sao là vì portage sẽ không xóa dòng khi phiên bản mới hơn thay thế phiên bản cũ hơn.
Eyoung100

0

Đây là một tập lệnh nhỏ lọc các mục từ /etc/portage/package.* các tệp không được cài đặt nữa. Ngoài ra, nó loại bỏ tất cả các dòng bình luận trực tiếp trên mục bị loại bỏ. (ví dụ như được tạo bởi autounmask). Nếu các bình luận được phân tách bằng một dòng trống, nó sẽ chỉ xóa các bình luận thấp hơn. Kịch bản không loại bỏ các mục trùng lặp.

Xin lưu ý rằng các tiện ích portage cần phải được cài đặt và hookync /etc/portage/postsync.d/q-reinitialize phải được kích hoạt để kịch bản này hoạt động.

#!/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

Cho đến nay, app-portage/eixgói cung cấp một công cụ tiện dụng có têneix-test-obsolete . Mô tả ngắn gọn từ 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.

Nó cung cấp một cái nhìn tổng quan khá tốt về tất cả các mục dư thừa trong /etc/portage/package.*các tệp. Điều duy nhất tôi cá nhân thiếu là một thông tin về tệp và dòng chính xác xác định unmask / use / accept / sao lưu dự phòng. Tuy nhiên, grep -nrgiúp trong trường hợp đó.

$ 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

Bắt đầu với eix -tT. Cài đặt app-portage/eixđể có được điều đó.


Tôi không hiểu làm thế nào eix -tT giải quyết điều này. Bạn có thể giải thích thêm một chút không?
Jonas Stein

Tôi nghĩ rằng bạn phải ghi lại một số đầu ra và chỉ ra số dòng của các phần bạn không hiểu.
lkraav

Tôi muốn có thêm thông tin . Điều này dẫn đến "mẹo và thủ thuật" và liên kết đến bài đăng trên blog ban đầu đã chết. Điều này giúp một chút. Các gói đã hoạt động gần đây. Liên kết trang chủ trỏ đến eix.berlios.de nhưng điều này không tồn tại. Các trang hướng dẫn trực tuyến đó ở đâu (với tất cả các tùy chọn)?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.