Comment ranger le fichier .keywords sur un système gentoo?

10

On peut sélectionner des packages de test sur un gentoo stablesystème en ajoutant une ligne avec la syntaxe suivante à la liste des mots clés:

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

Ce fichier va grandir dans le temps et tôt ou tard, on ne peut pas se rappeler quelles lignes sont obsolètes.

Comment puis-je ranger la liste avec un script de temps en temps?

Une ligne doit être supprimée,

  • si la version de test est déjà stabilisée
  • > = a été utilisé pour le même package
  • = a été utilisé pour le même package avec un numéro de version plus petit
Jonas Stein
la source
Si vous regardez toujours cela, consultez ma réponse.
eyoung100

Réponses:

6

Il existe maintenant un package officiel pour cette tâche appelé app-portage / portpeek .

Ça peut

  • trouver des drapeaux USE obsolètes et
  • MOTS CLÉS obsolètes et
  • nettoyer les fichiers, si -f(fix) est ajouté comme paramètre.
Jonas Stein
la source
3

J'ai écrit un petit script python qui s'occupe de ce problème. La logique examine chaque ligne du fichier package.accept_keywordset n'agit que sur les lignes commençant par =ou <=. Ces lignes ont une version liée maximale afin que nous puissions vérifier si elles sont plus nécessaires. Les lignes sans qualificatif ou sans >=sont laissées telles quelles car nous ne pouvons pas savoir si elles sont obsolètes.

Les lignes qui nous intéressent sont ensuite analysées et la version installée du package est vérifiée. Si la version installée est plus récente que la version avec mot clé, ou n'est plus installée du tout, le mot clé est considéré comme obsolète. Si le package installé est la même version que la version avec mot-clé, le package installé est vérifié pour voir s'il est toujours avec mot-clé. S'il a été stabilisé, la ligne est obsolète, sinon elle est conservée.

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

Cela imprimera le nouveau fichier de mots clés en sortie standard. Remarque : ne redirigez pas la sortie vers /etc/portage/package.accept_keywordsou vous encombrerez le fichier et perdrez tout.

Cela ira un long chemin vers le nettoyage de votre fichier de mots-clés et pour vos autres préoccupations, trier le fichier et ensuite l'examiner pour plusieurs lignes pour le même package aidera à résoudre la plupart de ce qui reste.

casey
la source
1

Vous savez que vous pouvez convertir les fichiers du package. * Dans des répertoires, non?

Ensuite, vous pouvez organiser vos atomes dans plusieurs fichiers, par exemple, dans mon système, j'ai obtenu ce qui suit (enfin, pas vraiment, je ne suis pas sur mon ordinateur portable maintenant. Mais vous avez l'idée):

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

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

etc.

J'ai trouvé cela très utile pour m'aider à mettre à jour les fichiers.

Alberto
la source
0

Ajoutant à la réponse d'Ikraav:

Après utilisation eix -tT, supprimez les opérateurs de comparaison et le numéro de version du package. Votre dossier peut également être écrit comme:

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

Cela garantira que vous obtiendrez toujours les versions de test de dev-python/ipythonetpackage-cat/package

eyoung100
la source
le ~amd64dans ma question pourrait être trompeur. Les numéros de version ne doivent pas être modifiés. Je ne veux pas toujours obtenir la dernière version, mais je trouve des lignes redondantes.
Jonas Stein
L'utilisation du package sans la version supprime les entrées en double. Considérez que le package A nécessite> = package C version 1.0.0, et le package B nécessite C version 1.0.1. Dans la pratique, les packages A et B sont tous deux satisfaits par toute version supérieure à 1, et si toutes les versions> 1.0.0 sont en ~ arch, les numéros de version ne sont pas pertinents. La seule autre façon de résoudre ce problème est de masquer toutes les versions du package C, puis de démasquer la meilleure version après la mise à jour de Portage World.
eyoung100
Je suis de la vieille école et j'édite manuellement tous mes fichiers de configuration Portage, principalement parce que j'ai appris à le faire avant que portage ne le fasse automatiquement. La raison pour laquelle vous avez des doublons est que portage ne supprimera pas la ligne lorsqu'une version plus récente remplace une version plus ancienne.
eyoung100
0

Voici un petit script qui filtre les entrées des fichiers /etc/portage/package.* qui ne sont plus installés. De plus, il supprime toutes les lignes de commentaires directement au-dessus de l'entrée supprimée. (par exemple, tel que généré par le masque automatique). Si les commentaires sont séparés par une ligne vierge, seuls les commentaires inférieurs seront supprimés. Le script ne supprime pas les entrées en double.

Veuillez noter que portage-utils doit être installé et que le hook postsync /etc/portage/postsync.d/q-reinitialize doit être activé pour que ce script fonctionne.

#!/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 = []
Till Schäfer
la source
0

À partir de maintenant, le app-portage/eixpackage propose un outil pratique nomméeix-test-obsolete . Une brève description 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.

Il donne un assez bon aperçu de toutes les entrées redondantes dans les /etc/portage/package.*fichiers. La seule chose qui me manque personnellement est une information sur le fichier exact et la ligne définissant le démasquer / utiliser / accepter / quoi que ce soit redondant. Cependant, grep -nraide dans ce cas.

$ 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
la source
-1

Commencez par eix -tT. Installez app-portage/eixpour l'obtenir.

lkraav
la source
Je ne comprends pas comment eix -tT résout ce problème. Pouvez-vous l'expliquer un peu plus s'il vous plaît?
Jonas Stein
Je pense qu'il faudrait coller quelques sorties et pointer vers les numéros de ligne des parties que vous ne comprenez pas.
lkraav
Je souhaite qu'il y ait plus d' informations . Cela conduit à des "trucs et astuces" et le lien vers le blog d'origine est mort. Cela aide un peu. Le package a été activé récemment. Le lien de la page d'accueil pointe vers eix.berlios.de mais cela n'existe pas. Où sont les pages de manuel pour cela en ligne (avec toutes les options)?