Як виправити файл .keywords в системі gentoo?


10

Можна вибрати тестові пакети в gentoo stableсистемі, додавши до списку ключових слів рядок із наступним синтаксисом:

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

Цей файл буде рости протягом часу, і рано чи пізно не можна згадати, які рядки застаріли.

Як я можу час від часу прибирати список зі сценарієм?

Рядок слід видалити,

  • якщо версія для тестування вже стабілізована
  • > = використовувався для одного пакету
  • = використовувався для одного пакету з меншим номером версії

Якщо ви все ще спостерігаєте за цим, дивіться мій відповідь.
eyoung100

Відповіді:


6

Зараз існує офіційний пакет цього завдання під назвою app-portage / portpeek .

Це може

  • знайти застарілі прапори USE та
  • застарілі KEYWORDS і
  • очистіть файли, якщо -fв якості параметра додано (fix).

3

Я написав невеликий сценарій python, який опікується цією проблемою. Логіка розглядає кожен рядок у файлі package.accept_keywordsі діє лише на рядки, які починаються з =або <=. Ці рядки мають максимально обмежену версію, тому ми можемо перевірити, чи потрібні вони більше. Рядки без класифікатора або а >=залишаються такими, якими ми не можемо знати, чи вони застаріли.

Потім аналізуються рядки, які нас цікавлять, і перевіряється встановлена ​​версія пакета. Якщо встановлена ​​версія є новішою, ніж ключова версія, або взагалі більше не встановлюється, ключове слово вважається застарілим. Якщо встановлений пакет є тією ж версією, що і ключова версія, тоді встановлений пакет перевіряється, чи є він ще ключовим словом. Якщо вона була стабілізована, лінія застаріла, інакше вона утримується.

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

Це надрукує новий файл ключових слів для стандартного виходу. Примітка : не переадресовуйте вихідний результат назад, /etc/portage/package.accept_keywordsабо ви заблокуєте файл і втратите все.

Це піде на довгий шлях до очищення файлу ваших ключових слів, а також для інших ваших проблем: сортування файлу та вивчення його кількох рядків для одного пакету допоможе вирішити більшість того, що залишилося.


1

Ви знаєте, що можете конвертувати пакет. * Файли в каталогах, правда?

Тоді ви можете організувати свої атоми в декілька файлів, наприклад, в моїй системі я отримав наступне (ну, не дуже, я зараз не на своєму ноутбуці. Але ви зрозуміла ідея):

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

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

тощо.

Я вважаю це дійсно корисним, щоб допомогти мені оновлювати файли.


0

Додавання до відповіді Ікраава:

Після використання eix -tTвийміть оператори порівняння та номер версії пакета. Ваш файл також може бути записаний так:

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

Це гарантує, що ви завжди отримаєте тестові версії dev-python/ipythonтаpackage-cat/package


~amd64в моєму питанні може ввести в оману. Номери версій повинні залишатися недоторканими. Я не хочу отримувати завжди останню версію, але знаходжу зайві рядки.
Йонас Штейн

Використання пакета без версії видаляє повторювані записи. Розглянемо, що для пакету A потрібно> = пакет C версії 1.0.0, а для пакета B потрібна версія C 1.0.1. На практиці пакет A і B задовольняються будь-якою версією, що перевищує 1, і якщо всі версії> 1.0.0 знаходяться в ~ арці, то номери версій не мають значення. Єдиний інший спосіб це виправити - це замаскувати всі версії пакета C, а потім розкрити найбільшу версію після оновлення світу Portage.
eyoung100

Я стара школа, і я вручну редагую всі мої файли конфігурацій Portage, головним чином тому, що я навчився робити це до того, як Portage зробив це автоматично. Причина виникнення дублікатів полягає в тому, що портаж не видалить рядок, коли новіша версія замінює старішу.
eyoung100

0

Ось невеликий сценарій, який фільтрує записи з файлів /etc/portage/package.*, які вже не встановлені. Крім того, він видаляє всі рядки коментарів безпосередньо над видаленим записом. (наприклад, створено автомаскою). Якщо коментарі розділені порожнім рядком, вони видалять лише нижні коментарі. Сценарій не видаляє повторювані записи.

Зверніть увагу, що portage-утилі потрібно встановити, і щоб активувати цей скрипт, потрібно активувати гак postsync /etc/portage/postsync.d/q-reinitialize .

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

На сьогоднішній день app-portage/eixпакет пропонує зручний інструмент з назвоюeix-test-obsolete . Короткий опис від 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.

Це дає досить хороший огляд усіх зайвих записів у /etc/portage/package.*файлах. Єдине, чого мені особисто не вистачає, - це інформація про точний файл та рядок, що визначають надлишкову маскування / використання / прийняття / будь-що. Однак grep -nrдопомагає в цьому випадку.

$ 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

Почніть з eix -tT. Встановіть, app-portage/eixщоб отримати це.


Я не розумію, як це вирішує eix -tT. Чи можете ви пояснити це трохи більше, будь ласка?
Йонас Штейн

Я думаю, вам доведеться вставити деякий вихід і вказати на рядкові номери деталей, які ви не розумієте.
lkraav

Я б хотів, щоб було більше інформації . Це призводить до "порад та підказок", а посилання на оригінальну публікацію блогу є мертвою. Це трохи допомагає. Пакет був активний в останній час . Посилання на домашній сторінці вказує на eix.berlios.de, але цього не існує. Де ви знайдете підручники для цього Інтернету (з усіма параметрами)?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.