¿Cómo ordenar el archivo .keywords en un sistema gentoo?

10

Se pueden seleccionar paquetes de prueba en un gentoo stablesistema agregando una línea con la siguiente sintaxis a la lista de palabras clave:

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

Este archivo crecerá en el tiempo y, tarde o temprano, uno no puede recordar qué líneas son obsoletas.

¿Cómo puedo ordenar la lista con un script de vez en cuando?

Se debe eliminar una línea,

  • si la versión de prueba ya está estabilizada
  • > = se usó para el mismo paquete
  • = se usó para el mismo paquete con un número de versión más pequeño
Jonas Stein
fuente
Si todavía estás viendo esto, mira mi respuesta.
eyoung100

Respuestas:

6

Ahora hay un paquete oficial para esta tarea llamado app-portage / portpeek .

Puede

  • encontrar banderas de USO obsoletas y
  • PALABRAS CLAVE obsoletas y
  • limpie los archivos, si -fse agrega (corregir) como parámetro.
Jonas Stein
fuente
3

Escribí un pequeño script de Python que se encarga de este problema. La lógica analiza cada línea del archivo package.accept_keywordsy solo actúa en las líneas que comienzan con =o <=. Estas líneas tienen una versión enlazada máxima para que podamos verificar si ya son necesarias. Las líneas sin un calificador o a >=se dejan como están, ya que no podemos saber si son obsoletas.

Las líneas que nos interesan se analizan y se verifica la versión instalada del paquete. Si la versión instalada es más nueva que la versión con palabras clave, o ya no está instalada, la palabra clave se considera obsoleta. Si el paquete instalado es la misma versión que la versión con palabras clave, entonces el paquete instalado se verifica para ver si todavía tiene palabras clave. Si se ha estabilizado, la línea queda obsoleta, de lo contrario se conserva.

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

Esto imprimirá el nuevo archivo de palabras clave para estandarizar. Nota : no redirija la salida nuevamente /etc/portage/package.accept_keywordso tropezará con el archivo y perderá todo.

Esto contribuirá en gran medida a limpiar su archivo de palabras clave y, para sus otras preocupaciones, ordenar el archivo y luego examinarlo en busca de varias líneas para el mismo paquete ayudará a resolver la mayor parte de lo que queda.

casey
fuente
1

Sabes que puedes convertir el paquete. * Archivos en directorios, ¿verdad?

Luego, puede organizar sus átomos en varios archivos, por ejemplo, en mi sistema obtuve lo siguiente (bueno, en realidad no, no estoy en mi computadora portátil ahora. Pero entiende la idea):

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

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

etc.

Encontré esto realmente útil para ayudarme a tener los archivos actualizados.

Alberto
fuente
0

Agregando a la respuesta de Ikraav:

Después de usar eix -tT, elimine los operadores de comparación y el número de versión del paquete. Su archivo también se puede escribir como:

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

Esto garantizará que siempre obtenga las versiones de prueba dev-python/ipythonypackage-cat/package

eyoung100
fuente
El ~amd64en mi pregunta puede ser engañoso. Los números de versión deben permanecer intactos. No quiero obtener siempre la última versión, pero encuentro líneas redundantes.
Jonas Stein
El uso del paquete sin la versión elimina las entradas duplicadas. Considere que el Paquete A requiere> = Paquete C Versión 1.0.0, y el Paquete B requiere C Versión 1.0.1. En la práctica, los paquetes A y B están satisfechos con cualquier versión superior a 1, y si todas las versiones> 1.0.0 están en ~ arch, entonces los números de versión son irrelevantes. La única otra forma de solucionar esto es enmascarar todas las versiones del paquete C y luego desenmascarar la mejor versión después de la actualización de portage world.
eyoung100
Soy de la vieja escuela y edito manualmente todos mis archivos de configuración de Portage, principalmente porque aprendí cómo hacerlo antes de que Portage lo hiciera automáticamente. La razón por la que tiene duplicados es porque el portage no eliminará la línea cuando una versión más nueva sustituya a una anterior.
eyoung100
0

Aquí hay un pequeño script que filtra las entradas de los archivos /etc/portage/package.* que ya no están instalados. Además, elimina todas las líneas de comentarios directamente encima de la entrada eliminada. (por ejemplo, según lo generado por autounmask). Si los comentarios están separados por una línea en blanco, solo eliminará los comentarios inferiores. El script no elimina entradas duplicadas.

Tenga en cuenta que es necesario instalar portage-utils y el gancho postsync /etc/portage/postsync.d/q-reinitialize debe estar activado para que este script funcione.

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

A partir de ahora, el app-portage/eixpaquete ofrece una herramienta útil llamadaeix-test-obsolete . Una breve descripción de 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.

Ofrece una visión general bastante buena de todas las entradas redundantes en los /etc/portage/package.*archivos. Lo único que me falta personalmente es una información sobre el archivo exacto y la línea que define la máscara / uso / aceptar / lo que sea redundante. Sin embargo, grep -nrayuda en ese 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
hoefling
fuente
-1

Comenzar con eix -tT. Instalar app-portage/eixpara conseguir eso.

lkraav
fuente
No entiendo cómo eix -tT resuelve esto. ¿Puedes explicarlo un poco más por favor?
Jonas Stein
Creo que tendrías que pegar algunos resultados y señalar números de línea de partes que no entiendes.
lkraav
Desearía que hubiera más información . Esto lleva a "consejos y trucos" y el enlace a la publicación original del blog está muerto. Esto ayuda un poco. El paquete ha estado activo recientemente. El enlace de la página de inicio apunta a eix.berlios.de pero esto no existe. ¿Dónde están las páginas de manual para eso en línea (con todas las opciones)?