Ben bu sorunu halleder küçük bir python komut dosyası yazdı. Mantık, dosyadaki her satıra bakar package.accept_keywords
ve 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_keywords
aksi 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.