จะจัดระเบียบไฟล์. keywords บนระบบ gentoo ได้อย่างไร


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

มีแพคเกจอย่างเป็นทางการในขณะนี้สำหรับงานนี้เรียกว่าการตรวจสอบการขนส่ง / portpeek

มันสามารถ

  • ค้นหา USE ที่ล้าสมัยและ
  • KEYWORDS ที่ล้าสมัยและ
  • ทำความสะอาดไฟล์หาก-f(แก้ไข) ถูกเพิ่มเป็นพารามิเตอร์

3

ฉันเขียนสคริปต์หลามขนาดเล็กที่ดูแลปัญหานี้ ตรรกะลักษณะที่แต่ละบรรทัดในแฟ้ม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

คุณรู้หรือไม่ว่าคุณสามารถแปลงแพ็คเกจ * ไฟล์ในไดเรกทอรีใช่มั้ย

จากนั้นคุณสามารถจัดระเบียบอะตอมของคุณในไฟล์หลาย ๆ ไฟล์เช่นในระบบของฉันฉันได้รับสิ่งต่อไปนี้ (ไม่จริง ๆ ฉันไม่ได้อยู่ที่แล็ปท็อปของฉันตอนนี้ แต่คุณคิดไว้):

/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/ipythonและpackage-cat/package


~amd64ในคำถามของฉันอาจจะทำให้เข้าใจผิด หมายเลขเวอร์ชันควรไม่ถูกแตะต้อง ฉันไม่ต้องการรับรุ่นล่าสุดเสมอ แต่ค้นหาบรรทัดที่ซ้ำซ้อน
Jonas Stein

การใช้แพ็คเกจที่ไม่มีเวอร์ชันจะลบรายการที่ซ้ำกันออก พิจารณาแพ็คเกจ A ต้องการ> = แพ็คเกจ C เวอร์ชัน 1.0.0 และแพ็คเกจ B ต้องการ C เวอร์ชัน 1.0.1 ในทางปฏิบัติแพ็คเกจ A และ B ต่างก็พอใจกับรุ่นใด ๆ ที่มากกว่า 1 และถ้าทุกรุ่น> 1.0.0 อยู่ใน ~ arch แล้วหมายเลขเวอร์ชันจะไม่เกี่ยวข้อง อีกวิธีหนึ่งในการแก้ไขปัญหานี้คือการปิดบัง Package ทุกเวอร์ชันแล้วเปิดโปงเวอร์ชั่นที่ยิ่งใหญ่ที่สุดหลังจากการอัพเดทโลกพอร์เทจ
eyoung100

ฉันเป็นโรงเรียนเก่าและฉันแก้ไขไฟล์กำหนดค่าของพอร์เทจทั้งหมดด้วยตนเองส่วนใหญ่เป็นเพราะฉันเรียนรู้วิธีการทำก่อนที่พอร์เทจจะทำมันโดยอัตโนมัติ เหตุผลที่คุณมีข้อมูลซ้ำซ้อนคือเนื่องจากการย้ายไม่ได้ลบบรรทัดเมื่อรุ่นที่ใหม่กว่าแทนที่รุ่นเก่า
eyoung100

0

นี่คือสคริปต์ขนาดเล็กที่กรองรายการจากไฟล์ /etc/portage/package.* ที่ไม่ได้ติดตั้งอีกต่อไป นอกจากนี้จะลบบรรทัดความคิดเห็นทั้งหมดเหนือรายการที่ถูกลบโดยตรง (เช่นสร้างโดย autounmask) หากความคิดเห็นถูกคั่นด้วยบรรทัดว่างระบบจะลบความคิดเห็นที่ต่ำกว่า สคริปต์ไม่ได้ลบรายการที่ซ้ำกัน

โปรดทราบว่าการขนส่ง-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 / redundant อย่างไรก็ตาม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

ฉันคิดว่าคุณต้องแปะเอาท์พุทและชี้ไปที่หมายเลขบรรทัดของชิ้นส่วนที่คุณไม่เข้าใจ
lkraav

ฉันต้องการมีมากขึ้นข้อมูล สิ่งนี้นำไปสู่ ​​"เคล็ดลับและกลเม็ด" และลิงก์ไปยังโพสต์บล็อกดั้งเดิมนั้นตายไปแล้ว มันช่วยได้นิดหน่อย แพคเกจได้รับการใช้งานเมื่อเร็ว ๆ นี้ ลิงก์หน้าแรกชี้ไปที่ eix.berlios.de แต่ไม่มีอยู่ manpages ของออนไลน์นั้นอยู่ที่ไหน (พร้อมตัวเลือกทั้งหมด)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.