Existe um pacote oficial agora para esta tarefa chamado app-portage / portpeek .
Pode
- encontre sinalizadores de USE obsoletos e
- KEYWORDS obsoletos e
- limpe os arquivos, se
-f
(correção) for adicionado como parâmetro.
Você pode selecionar pacotes de testes em um sistema gentoo stable
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 crescerá dentro do tempo e, mais cedo ou mais tarde, não será possível lembrar quais linhas estão obsoletas.
Como posso organizar a lista com um script de tempos em tempos?
Uma linha deve ser excluída
Existe um pacote oficial agora para esta tarefa chamado app-portage / portpeek .
Pode
-f
(correção) for adicionado como parâmetro. Eu escrevi um pequeno script python que cuida desse problema. A lógica analisa cada linha no arquivo package.accept_keywords
e só atua nas linhas que começam com =
ou <=
. Essas linhas têm uma versão máxima vinculada para que possamos verificar se elas são mais necessárias. Linhas sem um qualificador ou >=
são deixadas no estado em que não podemos saber se estão obsoletas.
As linhas com as quais nos importamos 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 for da mesma versão que a versão com palavras-chave, o pacote instalado será verificado para verificar se ainda é uma palavra-chave. Se foi estabilizado, a linha está obsoleta, caso contrário, é retida.
#!/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_keywords
ou você vai destruir o arquivo e perder tudo.
Isso ajudará a limpar o arquivo de palavras-chave e, para as outras preocupações, classificar o arquivo e examiná-lo para várias linhas do mesmo pacote ajudará a resolver a maior parte do que resta.
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 eu tenho o seguinte (bem, não realmente, eu não estou no meu laptop agora. Mas você tem 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 muito útil para me ajudar a atualizar os arquivos.
Adicionando à resposta do Ikraav:
Depois de usar 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 obterá as versões de teste de dev-python/ipython
e package-cat/package
Aqui está um pequeno script que filtra entradas de arquivos /etc/portage/package.* que não estão mais instalados. Além disso, remove todas as linhas de comentários diretamente acima da entrada removida. (por exemplo, como gerado por autounmask). Se os comentários forem separados por uma linha em branco, apenas serão removidos os comentários mais baixos. O script não remove entradas duplicadas.
Por favor, note que portage-utils precisa ser instalado e o gancho postsync /etc/portage/postsync.d/q-reinitialize deve ser ativado para que esse 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 = []
A partir de agora, o pacote app-portage/eix
oferece uma ferramenta útil chamada eix-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 em /etc/portage/package.*
arquivos. A única coisa que eu pessoalmente sinto falta é uma informação sobre o arquivo e a linha exatos que definem o redundante unmask / use / accept / whatever. No entanto, grep -nr
ajuda 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
Comece com eix -tT
. Instale app-portage/eix
para conseguir isso.