Bagaimana cara merapikan file .keywords di sistem gentoo?

10

Seseorang dapat memilih paket pengujian pada gentoo stablesistem dengan menambahkan baris dengan sintaksis berikut ke daftar kata kunci:

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

File ini akan tumbuh dalam waktu dan cepat atau lambat orang tidak dapat mengingat baris mana yang usang.

Bagaimana saya bisa merapikan daftar dengan skrip dari waktu ke waktu?

Baris harus dihapus,

  • jika versi pengujian sudah stabil
  • > = digunakan untuk paket yang sama
  • = digunakan untuk paket yang sama dengan nomor versi yang lebih kecil
Jonas Stein
sumber
Jika Anda masih menonton ini, lihat Jawaban saya.
eyoung100

Jawaban:

6

Sekarang ada paket resmi untuk tugas ini bernama app-portage / portpeek .

Bisa

  • menemukan flag USE usang dan
  • KATA KUNCI usang dan
  • bersihkan file, jika -f(fix) ditambahkan sebagai parameter.
Jonas Stein
sumber
3

Saya menulis skrip python kecil yang menangani masalah ini. Logika terlihat pada setiap baris dalam file package.accept_keywordsdan hanya bertindak pada baris yang dimulai dengan =atau <=. Baris-baris ini memiliki versi terikat maksimum sehingga kami dapat memeriksa apakah diperlukan lagi. Garis tanpa kualifikasi atau a >=dibiarkan apa adanya karena kita tidak bisa tahu apakah itu usang.

Baris-baris yang kita pedulikan kemudian diurai dan versi paket yang terinstal diperiksa. Jika versi yang terinstal lebih baru dari versi yang dikata, atau tidak diinstal sama sekali, kata kunci dianggap usang. Jika paket yang diinstal adalah versi yang sama dengan versi kata kunci maka paket yang diinstal diperiksa untuk melihat apakah masih kata kunci. Jika telah distabilkan, saluran sudah usang, jika tidak dipertahankan.

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

Ini akan mencetak file kata kunci baru ke standar keluar. Catatan : jangan mengarahkan kembali output ke /etc/portage/package.accept_keywordsatau Anda akan merusak file dan kehilangan segalanya.

Ini akan sangat membantu membersihkan file kata kunci Anda dan untuk masalah Anda yang lain, mengurutkan file dan kemudian memeriksanya untuk beberapa baris untuk paket yang sama akan membantu menyelesaikan sebagian besar dari apa yang tersisa.

casey
sumber
1

Anda tahu Anda dapat mengonversi paket. * File dalam direktori, bukan?

Kemudian Anda dapat mengatur atom-atom Anda dalam beberapa file, misalnya, di sistem saya, saya mendapatkan yang berikut (well, tidak benar-benar, saya tidak di laptop saya sekarang. Tapi Anda tahu):

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

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

dll.

Saya menemukan ini sangat berguna untuk membantu saya memperbarui file.

Alberto
sumber
0

Menambahkan ke jawaban Ikraav:

Setelah menggunakan eix -tT, hapus operator perbandingan dan nomor versi paket. File Anda juga dapat ditulis sebagai:

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

Ini akan menjamin bahwa Anda akan selalu mendapatkan versi pengujian dev-python/ipythondanpackage-cat/package

eyoung100
sumber
yang ~amd64dalam pertanyaan saya mungkin menyesatkan. Nomor versi harus tetap tidak tersentuh. Saya tidak ingin selalu mendapatkan versi terbaru, tetapi menemukan garis yang berlebihan.
Jonas Stein
Menggunakan paket tanpa versi menghapus entri duplikat. Pertimbangkan Paket A membutuhkan> = Paket C Versi 1.0.0, dan Paket B membutuhkan C Versi 1.0.1. Dalam praktiknya, Paket A dan B keduanya Puas dengan versi apa pun yang lebih besar dari 1, dan jika semua versi> 1.0.0 dalam ~ arch maka nomor versi tidak relevan. Satu-satunya cara untuk memperbaikinya adalah dengan menutupi semua versi Paket C kemudian membuka kedok Versi terbesar setelah pembaruan dunia portage.
eyoung100
Saya jadul, dan saya secara manual mengedit semua file konfigurasi Portage saya, terutama karena saya belajar cara melakukannya sebelum portage melakukannya secara otomatis. Alasan Anda memiliki duplikat adalah karena portage tidak akan menghapus baris ketika versi yang lebih baru menggantikan yang lebih lama.
eyoung100
0

Berikut ini adalah skrip kecil yang memfilter entri dari file /etc/portage/package.* yang tidak diinstal lagi. Selain itu menghapus semua baris komentar langsung di atas entri yang dihapus. (mis. seperti yang dihasilkan oleh autounmask). Jika komentar dipisahkan oleh baris kosong, itu hanya akan menghapus komentar yang lebih rendah. Script tidak menghapus entri duplikat.

Harap dicatat bahwa portage-utils perlu diinstal dan kait postsync /etc/portage/postsync.d/q-reinitialize harus diaktifkan agar skrip ini berfungsi.

#!/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 = []
Sampai Schäfer
sumber
0

Sampai sekarang, app-portage/eixpaket menawarkan alat yang berguna bernamaeix-test-obsolete . Deskripsi singkat dari 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.

Ini memberikan gambaran yang cukup bagus dari semua entri yang berlebihan dalam /etc/portage/package.*file. Satu-satunya hal yang secara pribadi saya lewatkan adalah info tentang file yang tepat dan baris yang mendefinisikan unmask / use / accept / redundant redundant. Namun, grep -nrmembantu dalam hal itu.

$ 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
hoefling
sumber
-1

Mulai dengan eix -tT. Instal app-portage/eixuntuk mendapatkannya.

lkraav
sumber
Saya tidak mengerti bagaimana eix -tT memecahkan ini. Bisakah Anda jelaskan lebih banyak?
Jonas Stein
Saya pikir Anda harus menempelkan beberapa output dan menunjuk ke nomor baris bagian yang tidak Anda mengerti.
lkraav
Saya berharap ada lebih banyak info . Ini mengarah ke "tips dan trik" dan tautan ke posting blog asli sudah mati. Ini sedikit membantu. The paket telah aktif baru-baru ini. Tautan beranda menunjuk ke eix.berlios.de tetapi ini tidak ada. Di mana manual untuk online itu (dengan semua opsi)?