Como arrumar o arquivo .keywords em um sistema gentoo?

10

Pode-se selecionar pacotes de teste em um gentoo stablesistema adicionando uma linha com a seguinte sintaxe à lista de palavras-chave:

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 arquivo aumentará dentro de algum tempo e, mais cedo ou mais tarde, não será possível lembrar quais linhas estão obsoletas.

Como posso arrumar a lista com um script de tempos em tempos?

Uma linha deve ser excluída,

  • se a versão de teste já estiver estabilizada
  • > = foi usado para o mesmo pacote
  • = foi usado para o mesmo pacote com número de versão menor
Jonas Stein
fonte
Se você ainda está assistindo isso, veja minha resposta.
precisa saber é o seguinte

Respostas:

6

Agora existe um pacote oficial para esta tarefa chamada app-portage / portpeek .

Pode

  • encontre sinalizadores de USO obsoletos e
  • PALAVRAS-CHAVE obsoletas e
  • limpe os arquivos, se -f(correção) for adicionado como parâmetro.
Jonas Stein
fonte
3

Eu escrevi um pequeno script python que cuida desse problema. A lógica examina cada linha do arquivo package.accept_keywordse atua apenas nas linhas que começam com =ou <=. Essas linhas têm uma versão limite máxima para que possamos verificar se são mais necessárias. As linhas sem um qualificador ou a >=são deixadas como estão, pois não podemos saber se são obsoletas.

As linhas com as quais nos preocupamos são analisadas e a versão instalada do pacote é verificada. Se a versão instalada for mais recente que a versão com palavras-chave ou não estiver mais instalada, a palavra-chave será considerada obsoleta. Se o pacote instalado tiver a mesma versão da palavra-chave, o pacote instalado será verificado para ver se ainda está com a palavra-chave. Se tiver sido estabilizada, a linha será obsoleta, caso contrário, será mantida.

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

Isso imprimirá o novo arquivo de palavras-chave como padrão. Nota : não redirecione a saída de volta para /etc/portage/package.accept_keywordsvocê, ou você estraga o arquivo e perde tudo.

Isso ajudará bastante a limpar o arquivo de palavras-chave e, para outras preocupações, classificar o arquivo e examiná-lo em várias linhas para o mesmo pacote, ajudando a resolver a maior parte do que resta.

Casey
fonte
1

Você sabe que pode converter os arquivos package. * Em diretórios, certo?

Então você pode organizar seus átomos em vários arquivos, por exemplo, no meu sistema, obtive o seguinte (bem, na verdade não, não estou no meu laptop agora. Mas você entendeu a idéia):

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

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

etc.

Achei isso realmente útil para me ajudar a atualizar os arquivos.

Alberto
fonte
0

Adicionando à resposta de Ikraav:

Após o uso eix -tT, remova os operadores de comparação e o número da versão do pacote. Seu arquivo também pode ser escrito como:

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

Isso garantirá que você sempre obtenha as versões de teste dev-python/ipythonepackage-cat/package

eyoung100
fonte
o ~amd64na minha pergunta pode ser enganoso. Os números da versão devem permanecer intocados. Não quero obter sempre a versão mais recente, mas encontrar linhas redundantes.
Jonas Stein
O uso do pacote sem a versão remove as entradas duplicadas. Considere o Pacote A requer> = Pacote C Versão 1.0.0 e o Pacote B requer C Versão 1.0.1. Na prática, os pacotes A e B são satisfeitos por qualquer versão maior que 1 e, se todas as versões> 1.0.0 estiverem em ~ arch, os números de versão serão irrelevantes. A única outra maneira de corrigir isso é mascarar todas as versões do Pacote C e desmascarar a melhor versão após a atualização mundial do portage.
eyoung100
Eu sou da velha escola e edito manualmente todos os meus arquivos de configuração do Portage, principalmente porque aprendi como fazer isso antes do portage fazer automaticamente. O motivo de você duplicar é porque o portage não remove a linha quando uma versão mais nova substitui a anterior.
eyoung100
0

Aqui está um pequeno script que filtra as entradas dos arquivos /etc/portage/package.* que não estão mais instalados. Além disso, remove todas as linhas de comentário diretamente acima da entrada removida. (por exemplo, conforme gerado pelo autounmask). Se os comentários forem separados por uma linha em branco, apenas os comentários inferiores serão removidos. O script não remove entradas duplicadas.

Observe que o portage-utils precisa ser instalado e o gancho postsync /etc/portage/postsync.d/q-reinitialize deve ser ativado 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 = []
Até Schäfer
fonte
0

A partir de agora, o app-portage/eixpacote oferece uma ferramenta útil chamadaeix-test-obsolete . Uma breve descrição 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.

Ele fornece uma boa visão geral de todas as entradas redundantes nos /etc/portage/package.*arquivos. A única coisa que estou sentindo falta pessoalmente é de informações sobre o arquivo e a linha exatos que definem o desmascaramento redundante / use / accept / qualquer coisa. No entanto, grep -nrajuda nesse 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
fonte
-1

Comece com eix -tT. Instale app-portage/eixpara conseguir isso.

lkraav
fonte
Eu não entendo como eix -tT resolve isso. Você pode explicar um pouco mais, por favor?
Jonas Stein
Eu acho que você teria que colar alguma saída e apontar para o número da linha de peças que você não entende.
22614 lkraav
Eu gostaria que houvesse mais informações . Isso leva a "dicas e truques" e o link para a postagem original do blog está morto. Isso ajuda um pouco. O pacote esteve ativo recentemente. O link da página inicial aponta para eix.berlios.de, mas isso não existe. Onde estão as páginas de manual para isso online (com todas as opções)?