Package-Management

如何整理 gentoo 系統上的 .keywords 文件?

  • December 14, 2018

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

該文件將在一段時間內增長,遲早會忘記哪些行已過時。

我如何不時用腳本整理列表?

應該刪除一行,

  • 如果測試版本已經穩定
  • >= 用於同一個包
  • = 用於具有較小版本號的相同包

這個任務現在有一個名為app-portage/portpeek的官方包。

它可以

  • 查找過時的 USE 標誌和
  • 過時的關鍵字和
  • 清理文件,如果-f(修復)被添加為參數。

我寫了一個小python腳本來解決這個問題。邏輯查看文件中的每一行,並且只對以orpackage.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否則您將破壞文件並失去所有內容。

這將大大有助於清理您的關鍵字文件,並且對於您的其他問題,對文件進行排序然後檢查同一包的多行將有助於解決剩下的大部分問題。

引用自:https://unix.stackexchange.com/questions/144084