Jak uporządkować plik .ke words w systemie Gentoo?


10

Można wybrać pakiety testowe w gentoo stablesystemie, dodając do listy słów kluczowych wiersz o następującej składni:

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

Z czasem plik ten wzrośnie i prędzej czy później nie można sobie przypomnieć, które linie są przestarzałe.

Jak od czasu do czasu mogę uporządkować listę za pomocą skryptu?

Linia powinna zostać usunięta,

  • jeśli wersja testowa jest już ustabilizowana
  • > = użyto dla tego samego pakietu
  • = użyto dla tego samego pakietu o mniejszym numerze wersji

Jeśli nadal to oglądasz, zobacz moją odpowiedź.
eyoung100,

Odpowiedzi:


6

Istnieje teraz oficjalny pakiet dla tego zadania o nazwie app-portage / portpeek .

To może

  • znajdź przestarzałe flagi USE i
  • przestarzałe SŁOWA KLUCZOWE i
  • wyczyść pliki, jeśli -f(parametr) zostanie dodany jako parametr.

3

Napisałem mały skrypt Pythona, który zajmuje się tym problemem. Logika sprawdza każdą linię w pliku package.accept_keywordsi działa tylko na linie rozpoczynające się od =lub <=. Linie te mają wersję z maksymalnym powiązaniem, dzięki czemu możemy sprawdzić, czy są już potrzebne. Linie bez kwalifikatora lub a >=są bez zmian, ponieważ nie wiemy, czy są przestarzałe.

Linie, na których nam zależy, są następnie analizowane i sprawdzana jest zainstalowana wersja pakietu. Jeśli zainstalowana wersja jest nowsza niż wersja ze słowami kluczowymi lub w ogóle nie jest już zainstalowana, słowo kluczowe jest uważane za przestarzałe. Jeśli zainstalowany pakiet jest tej samej wersji, co wersja ze słowami kluczowymi, wówczas zainstalowany pakiet jest sprawdzany, aby sprawdzić, czy nadal zawiera słowa kluczowe. Jeśli został ustabilizowany, linia jest przestarzała, w przeciwnym razie zostaje zachowana.

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

Spowoduje to wydrukowanie nowego pliku słów kluczowych na standardowe wyjście. Uwaga : nie przekierowuj danych wyjściowych z powrotem do /etc/portage/package.accept_keywordspliku, ponieważ spowoduje to zatkanie pliku i utratę wszystkiego.

Pomoże to w oczyszczeniu pliku słów kluczowych, a w przypadku innych problemów sortowanie pliku, a następnie sprawdzenie go pod kątem wielu wierszy dla tego samego pakietu pomoże rozwiązać większość z pozostałych.


1

Wiesz, że możesz przekonwertować pliki pakietu. * W katalogach, prawda?

Następnie możesz uporządkować swoje atomy w kilku plikach, np. W moim systemie otrzymałem następujące informacje (cóż, nie bardzo, nie mam teraz laptopa. Ale masz pomysł):

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

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

itp.

Uważam, że to bardzo przydatne, aby pomóc mi zaktualizować pliki.


0

Dodając do odpowiedzi Ikraava:

Po użyciu eix -tTusuń operatory porównania i numer wersji pakietu. Twój plik można również zapisać jako:

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

To zagwarantuje, że zawsze otrzymasz wersje testowe dev-python/ipythonipackage-cat/package


~amd64na moje pytanie może być mylące. Numery wersji powinny pozostać nietknięte. Nie chcę zawsze otrzymywać najnowszej wersji, ale znajduję nadmiarowe linie.
Jonas Stein,

Korzystanie z pakietu bez wersji usuwa zduplikowane wpisy. Rozważ pakiet A wymaga> = pakiet C wersja 1.0.0, a pakiet B wymaga wersji C 1.0.1. W praktyce zarówno pakiet A, jak i B są satysfakcjonujące dla dowolnej wersji większej niż 1, a jeśli wszystkie wersje> 1.0.0 znajdują się w archiwum, numery wersji są nieistotne. Jedynym innym sposobem na rozwiązanie tego jest maskowanie wszystkich wersji Pakietu C, a następnie zdemaskowanie najlepszej wersji po aktualizacji Portage World.
eyoung100,

Jestem oldschoolowy i ręcznie edytuję wszystkie moje pliki konfiguracyjne Portage, głównie dlatego, że nauczyłem się, jak to zrobić, zanim Portage zrobił to automatycznie. Powodem, dla którego masz duplikaty, jest to, że portage nie usuwa linii, gdy nowsza wersja zastępuje starszą.
eyoung100,

0

Oto mały skrypt, który filtruje wpisy z plików /etc/portage/package.*, które nie są już instalowane. Dodatkowo usuwa wszystkie wiersze komentarza bezpośrednio nad usuniętym wpisem. (np. wygenerowane przez autounmask). Jeśli komentarze są oddzielone pustą linią, usuwa tylko dolne komentarze. Skrypt nie usuwa zduplikowanych wpisów.

Pamiętaj, że portage-utils musi zostać zainstalowany, a hak Postync /etc/portage/postsync.d/q-reinitialize musi zostać aktywowany , aby skrypt działał.

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

Na razie app-portage/eixpakiet oferuje przydatne narzędzie o nazwieeix-test-obsolete . Krótki opis z 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.

Daje całkiem dobry przegląd wszystkich nadmiarowych wpisów w /etc/portage/package.*plikach. Jedyne, czego osobiście mi brakuje, to informacje o dokładnym pliku i linii definiującej zbędne zdemaskowanie / use / accept / cokolwiek. Jednak grep -nrpomaga w takim przypadku.

$ 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

Zacznij od eix -tT. Zainstaluj, app-portage/eixaby to uzyskać.


Nie rozumiem, jak eix -tT rozwiązuje to. Czy możesz to trochę wyjaśnić?
Jonas Stein

Myślę, że będziesz musiał wkleić trochę danych wyjściowych i wskazać numery wierszy części, których nie rozumiesz.
lkraav

Chciałbym, żeby było więcej informacji . Prowadzi to do „porad i wskazówek”, a link do oryginalnego postu na blogu jest martwy. To trochę pomaga. Pakiet był aktywny w ostatnim czasie. Link do strony głównej wskazuje na eix.berlios.de, ale to nie istnieje. Gdzie są strony tego online (ze wszystkimi opcjami)?
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.