Come riordinare il file .keywords su un sistema gentoo?


10

È possibile selezionare i pacchetti di test su un gentoo stablesistema aggiungendo una riga con la seguente sintassi all'elenco delle parole chiave:

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

Questo file crescerà nel tempo e prima o poi non si può ricordare quali righe sono obsolete.

Come posso riordinare di tanto in tanto l'elenco con uno script?

Una riga dovrebbe essere eliminata,

  • se la versione di prova è già stabilizzata
  • > = è stato usato per lo stesso pacchetto
  • = è stato utilizzato per lo stesso pacchetto con un numero di versione più piccolo

Se stai ancora guardando questo, vedi la mia risposta.
eyoung100,

Risposte:


6

Ora esiste un pacchetto ufficiale per questa attività chiamato app-portage / portpeek .

Può

  • trovare flag USE obsoleti e
  • PAROLE CHIAVE obsolete e
  • pulire i file, se -f(correzione) viene aggiunto come parametro.

3

Ho scritto un piccolo script Python che si occupa di questo problema. La logica esamina ogni riga del file package.accept_keywordse agisce solo sulle righe che iniziano con =o <=. Queste righe hanno una versione con limite massimo in modo che possiamo verificare se sono più necessarie. Le linee senza qualificatore o a >=vengono lasciate così come sono, poiché non possiamo sapere se sono obsolete.

Le righe che ci interessano vengono quindi analizzate e viene verificata la versione installata del pacchetto. Se la versione installata è più recente della versione con parole chiave o non è più installata, la parola chiave viene considerata obsoleta. Se il pacchetto installato è la stessa versione della versione con parole chiave, il pacchetto installato viene controllato per vedere se è ancora con parole chiave. Se è stato stabilizzato, la linea è obsoleta, altrimenti viene mantenuta.

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

Questo stamperà il nuovo file delle parole chiave per lo standard out. Nota : non reindirizzare l'output in /etc/portage/package.accept_keywordsaltrimenti si ostruirà il file e si perderà tutto.

Ciò contribuirà notevolmente a ripulire il file delle parole chiave e per le altre preoccupazioni, ordinare il file e quindi esaminarlo per più righe per lo stesso pacchetto aiuterà a risolvere la maggior parte di ciò che resta.


1

Sai che puoi convertire il pacchetto. * File nelle directory, giusto?

Quindi puoi organizzare i tuoi atomi in diversi file, ad esempio, nel mio sistema ho ottenuto quanto segue (beh, non proprio, non sono al mio laptop ora. Ma hai l'idea):

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

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

eccetera.

L'ho trovato davvero utile per aiutarmi ad aggiornare i file.


0

Aggiungendo alla risposta di Ikraav:

Dopo l'uso eix -tT, rimuovere gli operatori di confronto e il numero di versione del pacchetto. Il tuo file può anche essere scritto come:

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

Ciò garantirà che otterrai sempre le versioni di prova di dev-python/ipythonepackage-cat/package


il ~amd64nella mia domanda potrebbe essere fuorviante. I numeri di versione dovrebbero rimanere intatti. Non voglio ottenere sempre l'ultima versione, ma trovare linee ridondanti.
Jonas Stein,

L'uso del pacchetto senza la versione rimuove le voci duplicate. Considera che il pacchetto A richiede> = Pacchetto C versione 1.0.0 e il pacchetto B richiede C versione 1.0.1. In pratica, i pacchetti A e B sono entrambi soddisfatti da qualsiasi versione maggiore di 1 e se tutte le versioni> 1.0.0 sono in ~ arch, i numeri di versione sono irrilevanti. L'unico altro modo per risolvere questo problema è mascherare tutte le versioni del pacchetto C, quindi smascherare la versione più grande dopo l'aggiornamento del mondo di portage.
eyoung100,

Sono vecchia scuola e modifico manualmente tutti i miei file di configurazione di Portage, principalmente perché ho imparato a farlo prima che il portage lo facesse automaticamente. Il motivo per cui hai duplicati è perché portage non rimuoverà la linea quando una versione più recente sostituisce una precedente.
eyoung100,

0

Ecco un piccolo script che filtra le voci dai file /etc/portage/package.* che non sono più installati. Inoltre rimuove tutte le righe di commento direttamente sopra la voce rimossa. (ad es. come generato dalla maschera automatica). Se i commenti sono separati da una riga vuota, rimuoveranno solo i commenti inferiori. Lo script non rimuove le voci duplicate.

Si prega di notare che portage-utils devono essere installati e il gancio postsync /etc/portage/postsync.d/q-reinitialize deve essere attivato al fine di ottenere questo lavoro script.

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

A partire da ora, il app-portage/eixpacchetto offre uno strumento utile chiamatoeix-test-obsolete . Una breve descrizione da 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.

Fornisce una panoramica abbastanza buona di tutte le voci ridondanti nei /etc/portage/package.*file. L'unica cosa che mi manca di persona è un'informazione sul file e sulla riga esatti che definiscono il ridondante smascheramento / uso / accetta / qualunque cosa. Tuttavia, grep -nraiuta in quel caso.

$ 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

Inizia con eix -tT. Installa app-portage/eixper ottenerlo.


Non capisco come eix -tT risolva questo. Puoi spiegarlo un po 'di più, per favore?
Jonas Stein,

Penso che dovresti incollare un po 'di output e puntare a numeri di riga di parti che non capisci.
lkraav,

Vorrei che ci fossero più informazioni . Questo porta a "trucchi e suggerimenti" e il link al post originale del blog è morto. Questo aiuta un po '. Il pacchetto è stato attivo di recente. Il link alla homepage punta a eix.berlios.de ma questo non esiste. Dove sono le manpage online (con tutte le opzioni)?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.