Gentoo sisteminde .keywords dosyasını nasıl düzenleyebilirim?


10

gentoo stableAnahtar kelimeler listesine aşağıdaki sözdizimine sahip bir satır ekleyerek sistemdeki test paketlerini seçebilirsiniz :

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

Bu dosya zaman içinde büyüyecek ve er ya da geç hangi satırların eskimiş olduğunu hatırlayamıyorum.

Listeyi zaman zaman bir senaryo ile nasıl düzenleyebilirim?

Bir satır silinmeli,

  • test versiyonu zaten stabil ise
  • > = aynı paket için kullanıldı
  • = daha küçük sürüm numarasına sahip aynı paket için kullanıldı

Bunu hala izliyorsanız Cevabımı görün.
eyoung100

Yanıtlar:


6

Artık bu görev için app-portage / portpeek adlı resmi bir paket var .

Yapabilir

  • eski USE bayrakları bulmak ve
  • eski ANAHTAR KELİMELER ve
  • -fparametre olarak (fix) eklenmişse dosyaları temizleyin .

3

Ben bu sorunu halleder küçük bir python komut dosyası yazdı. Mantık, dosyadaki her satıra bakar package.accept_keywordsve yalnızca =veya ile başlayan satırlara etki eder <=. Bu satırların maksimum bağlı bir sürümü vardır, böylece artık gerekli olup olmadığını kontrol edebiliriz. Bir niteleyici veya a olmayan satırlar >=olduğu gibi bırakılır, çünkü eski olup olmadıklarını bilemeyiz.

Daha sonra önem verdiğimiz satırlar ayrıştırılır ve paketin kurulu sürümü kontrol edilir. Yüklü sürüm, anahtar sözcüklü sürümden daha yeniyse veya artık yüklenmemişse, anahtar kelime eski kabul edilir. Yüklü paket, anahtar sözcüklü sürümle aynı sürümdeyse, yüklenen paketin hala anahtar sözcük olup olmadığını kontrol eder. Stabilize edilmişse, hat kullanılmaz, aksi takdirde korunur.

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

Bu işlem, yeni anahtar kelimeler dosyasını standart çıktıya yazdırır. Not : Çıktıyı yeniden yönlendirmeyin, /etc/portage/package.accept_keywordsaksi takdirde dosyayı tıklayıp her şeyi kaybedersiniz.

Bu, anahtar kelimeler dosyanızı temizlemeye ve diğer endişelerinize, dosyayı sıralamaya ve daha sonra aynı paket için birden fazla satır için incelemeye doğru uzun bir yol kat edecektir.


1

Paket. * Dosyalarını dizinlerde dönüştürebileceğinizi biliyorsunuz, değil mi?

Sonra atomlarınızı çeşitli dosyalarda düzenleyebilirsiniz, örneğin, sistemimde aşağıdakileri aldım (aslında, aslında değil, şimdi dizüstü bilgisayarımda değilim.

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

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

vb.

Dosyaları güncellememe yardımcı olmak için bunu gerçekten yararlı buldum.


0

Ikraav'ın cevabına ek olarak:

Kullandıktan sonra eix -tTkarşılaştırma işleçlerini ve paket sürüm numarasını kaldırın. Dosyanız ayrıca şu şekilde de yazılabilir:

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

Bu, her zaman dev-python/ipythonvepackage-cat/package


~amd64Soruma yanıltıcı olabilir. Sürüm numaralarına dokunulmamalıdır. Her zaman en son sürümü almak istemiyorum, ancak gereksiz satırlar buluyorum.
Jonas Stein

Paketi sürüm olmadan kullanmak, yinelenen girişleri kaldırır. Paket A için> = Paket C Sürüm 1.0.0 ve Paket B için C Sürüm 1.0.1 gerektirir. Uygulamada, Paket A ve B'nin her ikisi de 1'den büyük herhangi bir sürümden memnun ve tüm sürümler> 1.0.0 ise bu durumda sürüm numaraları önemsizdir. Bunu düzeltmenin diğer tek yolu, Paket C'nin tüm sürümlerini maskelemek ve daha sonra portage dünya güncellemesinden sonra en büyük Sürümü maskelemektir.
eyoung100

Ben eski okulum ve tüm portage yapılandırma dosyalarımı elle düzenliyorum, çünkü portage otomatik olarak yapmadan önce nasıl yapılacağını öğrendim. Çoğaltmanızın nedeni, daha yeni bir sürüm eski bir sürümün yerini aldığında portage'ın satırı kaldırmamasıdır.
eyoung100

0

İşte artık yüklü olmayan /etc/portage/package.* dosyalarından girdileri filtreleyen küçük bir komut dosyası. Ayrıca, kaldırılan girişin hemen üzerindeki tüm yorum satırlarını kaldırır. (örneğin, otomatik unmask tarafından oluşturulan şekilde). Yorumlar boş bir satırla ayrılırsa, yalnızca alt yorumları kaldıracaktır. Komut dosyası, yinelenen girişleri kaldırmaz.

Unutmayın ki portage'ye utils yüklü olması ve postsync kanca ihtiyaç /etc/portage/postsync.d/q-reinitialize etkinleştirilmelidir Bu komut çalışma almak için.

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

Şu andan itibaren app-portage/eixpaket adlı kullanışlı bir araçeix-test-obsolete sunuyor . Kısa bir açıklama 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.*Dosyalardaki tüm gereksiz girişlere oldukça iyi bir genel bakış sağlar. Kişisel olarak eksik olduğum tek şey, gereksiz dosyayı / satırı / use / accept / neyse tanımlayan tam dosya ve satır hakkında bilgi. Ancak, grep -nrbu durumda yardımcı olur.

$ 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

İle başlayın eix -tT. app-portage/eixBunu almak için yükleyin .


Eix -tT'nin bunu nasıl çözdüğünü anlamıyorum. Biraz daha açıklayabilir misiniz lütfen?
Jonas Stein

Sanırım bazı çıktıları yapıştırmanız ve anlamadığınız parçaların satır numaralarını göstermeniz gerekecek.
lkraav

Keşke daha fazla bilgi olsaydı . Bu "ipuçları ve püf noktaları" yol açar ve orijinal blog yazısı bağlantısı öldü. Bu biraz yardımcı olur. Paket son zamanlarda aktif olmuştur. Ana sayfa bağlantısı eix.berlios.de'yi gösteriyor ancak bu mevcut değil. Bunun için çevrimiçi seçenekler (tüm seçeneklerle) nerede?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.