Как привести в порядок файл .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 и
  • устаревшие ключевые слова и
  • очистите файлы, если -f(исправление) добавлено в качестве параметра.
Джонас Стейн
источник
3

Я написал небольшой скрипт на python, который решает эту проблему. Логика просматривает каждую строку в файле package.accept_keywordsи действует только на строки, начинающиеся с =или <=. Эти строки имеют максимальную версию, поэтому мы можем проверить, нужны ли они больше. Строки без квалификатора или a >=остаются как есть, так как мы не можем знать, устарели ли они.

Затем анализируются строки, которые нас интересуют, и проверяется установленная версия пакета. Если установленная версия новее ключевой версии или больше не установлена, ключевое слово считается устаревшим. Если установленный пакет имеет ту же версию, что и версия с ключами, то установленный пакет проверяется, чтобы определить, является ли он еще ключевым. Если он был стабилизирован, линия устаревает, в противном случае она сохраняется.

#!/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файл, иначе вы закроете файл и потеряете все.

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

Casey
источник
1

Вы знаете, что можете конвертировать файлы пакета. * В каталогах, верно?

Затем вы можете организовать ваши атомы в несколько файлов, например, в моей системе я получил следующее (ну, не совсем, я сейчас не на своем ноутбуке. Но вы поняли идею):

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

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

и т.п.

Я нашел это действительно полезным, чтобы помочь мне обновить файлы.

Alberto
источник
0

Добавляем к ответу Икраава:

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

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

Это гарантирует, что вы всегда получите тестовые версии dev-python/ipythonиpackage-cat/package

eyoung100
источник
~amd64в моем вопросе может ввести в заблуждение. Номера версий должны оставаться нетронутыми. Я не хочу всегда получать последнюю версию, но нахожу лишние строки.
Джонас Стейн
Использование пакета без версии удаляет дубликаты записей. Рассмотрим, что для пакета A требуется> = пакет C версии 1.0.0, а для пакета B требуется версия C 1.0.1. На практике, Пакет A и B удовлетворяются любой версией, большей 1, и если все версии> 1.0.0 находятся в ~ arch, то номера версий не имеют значения. Единственный способ исправить это - замаскировать все версии пакета C, а затем снять маску с самой лучшей версией после обновления мира portage.
eyoung100
Я старая школа, и я вручную редактирую все свои файлы конфигурации Portage, главным образом потому, что я научился делать это до того, как portage сделал это автоматически. Причина, по которой у вас есть дубликаты, заключается в том, что portage не удалит строку, если более новая версия заменяет старую.
eyoung100
0

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

Пожалуйста, обратите внимание, что portage-utils должен быть установлен, и для запуска этого сценария должна быть активирована перехватка 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.*файлах. Единственное, чего мне не хватает, - это информации о точном файле и строке, определяющей лишнюю маску / use / accept / что угодно. Тем не менее, 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чтобы получить это.

lkraav
источник
Я не понимаю, как eix -tT решает это. Можете ли вы объяснить это немного больше, пожалуйста?
Джонас Стейн
Я думаю, вам нужно вставить несколько выводов и указать номера строк частей, которые вы не понимаете.
Икра
Я хотел бы, чтобы было больше информации . Это приводит к «советам и хитростям», а ссылка на оригинальный пост в блоге устарела. Это немного помогает. Пакет был активен в последнее время . Ссылка на домашнюю страницу указывает на eix.berlios.de, но ее не существует. Где справочные страницы для этого онлайн (со всеми вариантами)?