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.