Добавлена пересборка пакетов с автоматическими зависимостями

Изменён вывод новостей
parent 57b83ad72a
commit 9d3dc8abcc

@ -23,7 +23,7 @@ import stat
import glob
from calculate.core.server.gen_pid import search_worked_process2
from calculate.core.setup_package import ChainProgressTemplate
from calculate.lib.cl_template import templateFunction
from calculate.lib.cl_template import templateFunction, SystemIni
from calculate.lib.datavars import DataVars, Variable
from calculate.lib.utils.colortext import (TextState, get_color_print,
convert_console_to_xml)
@ -40,7 +40,9 @@ from calculate.lib.utils.portage import (Layman, EmergeLog, EmergeLogNamedTask,
get_packages_files_directory,
get_manifest_files_directory,
PackageList, VDB_PATH,
LibraryProviders, EmergePackage)
hide_package, unhide_package,
LibraryProviders, EmergePackage,
getInstalledAtom)
from calculate.update.emerge_parser import (EmergeParser,
EmergeError, EmergeCommand, Chroot,
Linux32, CommandExecutor,
@ -715,13 +717,12 @@ class Builder(Update):
:return:
"""
eselect_command = "/usr/bin/eselect"
p = self.chroot_process(builder_path, eselect_command, "--colour=yes",
p = self.chroot_process(builder_path, eselect_command, "--colour=no",
"news", "list", stderr=STDOUT)
self.printPre(convert_console_to_xml(
p.read()).replace(" ", "  "))
p = self.chroot_process(builder_path, eselect_command, "--colour=yes",
"news", "read", "new", stderr=STDOUT)
return p.success()
re_new = re.compile(r"^\s+\[\d+\]\s+N?\s+(\S+)\s+(.*)$", re.M)
for date, title in reversed(re_new.findall(p.read())[-3:]):
self.printSUCCESS("{date} {title}".format(date=date, title=title))
return True
def check_obsolete(self, builder_path):
"""
@ -1018,9 +1019,11 @@ class Builder(Update):
deo = self.get_default_emerge_opts()
extra_params = [x for x in params if x.startswith("-")]
packages = [x for x in params if not x.startswith("-")]
logfile = self._get_log_file()
with EmergeParser(self.chrootize(builder_path, EmergeCommand(
packages, emerge_default_opts=deo,
extra_params=extra_params, use=use))) as emerge:
extra_params=extra_params, use=use,
logfile=logfile))) as emerge:
try:
emerge.question.action = lambda x: False
emerge.run()
@ -1358,6 +1361,13 @@ class Builder(Update):
"""
task = EmergeLog(EmergeLogNamedTask(EmergeMark.Automagic),
prefix=builder_path)
cache_list = ("/var/calculate/tmp/%s.checkdep" %
self.clVars.Get("cl_builder_id_path"))
task_list = list(chain(*[list(getInstalledAtom(x, prefix=builder_path))
for x in readLinesFile(cache_list)]))
task_list = list(task.list) + task_list
vdb_path = "var/db/.pkg"
real_vdb_path = path.join(builder_path, VDB_PATH)
hide_vdb_path = path.join(builder_path, vdb_path)
@ -1367,14 +1377,11 @@ class Builder(Update):
raise BuilderError(_("Failed to hide package database"))
automagic = {}
# task_list = task.list
task_list = []
for i in sorted(glob.glob(path.join(builder_path, vdb_path, "*/*"))):
pf = path.basename(i)
category = path.basename(path.dirname(i))
task_list.append(EmergePackage("%s/%s" % (category, pf)))
automagic_waste = {}
automagic_skip = {}
try:
lp = LibraryProviders(vdb_path="var/db/.pkg", prefix=builder_path)
system_ini = SystemIni(self.clVars.Get('cl_builder_linux_datavars'))
lp = LibraryProviders(vdb_path=vdb_path, prefix=builder_path)
def get_check_data():
for pkg in PackageList(task_list):
@ -1385,7 +1392,8 @@ class Builder(Update):
yield tuple(lp[arch][lib])
yield pkg, list(set(get_all_reqs(pkg)))
check_data = {x:y for x,y in get_check_data() if y}
check_data = {x: y for x, y in get_check_data() if y}
for i, data in enumerate(check_data.items()):
package, required_pkgs = data
@ -1399,8 +1407,25 @@ class Builder(Update):
else:
required_pkgs = [x for x in required_pkgs
if all(y not in pretend for y in x)]
if required_pkgs:
automagic[package] = required_pkgs
required_pkgs = list(set(chain(*required_pkgs)))
skip_req_pkgs = filter(
None, [x.strip() for x in system_ini.getVar(
"automagic-allowed",
package["CATEGORY/PN"]).split(",")])
waste_pkgs = [x for x in skip_req_pkgs if
all(y["CATEGORY/PN"] != x
for y in required_pkgs)]
if waste_pkgs:
automagic_waste[package] = waste_pkgs
automagic[package] = []
automagic_skip[package] = []
for pkg in required_pkgs:
if any(x == pkg["CATEGORY/PN"] for x in skip_req_pkgs):
automagic_skip[package].append(pkg)
else:
automagic[package].append(pkg)
if automagic[package]:
self.endTask(False)
finally:
try:
@ -1409,7 +1434,44 @@ class Builder(Update):
raise BuilderError(_("Failed to unhide package database"))
if automagic:
for pkg, reqs in automagic.items():
reqs = list(set(str(x) for x in chain(*reqs)))
self.printWARNING("Detect auto depends for %s package by %s" % (
pkg, ",".join(reqs)))
skip_req_pkgs = automagic_skip.get(pkg, [])
waste_pkgs = automagic_waste.get(pkg, [])
if reqs:
self.printWARNING(
"Detect auto depends for %s package by %s" % (
pkg, ",".join(str(x) for x in reqs)))
if skip_req_pkgs:
self.printWARNING(
"Auto depends for %s package by %s will be used" % (
pkg, ",".join(str(x) for x in skip_req_pkgs)))
if waste_pkgs:
self.printWARNING(
"Auto depends for %s package by %s obsoleted" % (
pkg, ",".join(waste_pkgs)))
for pkg, reqs in automagic.items():
hidden_pkgs = []
skip_req_pkgs = automagic_skip.get(pkg, [])
try:
if not reqs:
if skip_req_pkgs:
self.printWARNING(_("Skip remerge %s package") % pkg)
continue
for req in reqs:
hide_package(req, prefix=builder_path)
hidden_pkgs.append(req)
self.emerge(builder_path, "-O", "=%s" % pkg)
rebuild_log_file = ("/var/log/calculate/automagic-%s.log" %
self.clVars.Get("cl_builder_id_path"))
with open(rebuild_log_file, 'a') as f:
f.write("{package}, hidden: {hidden_pkgs}\n".format(
package=pkg,
hidden_pkgs=",".join(str(x) for x in hidden_pkgs)
))
finally:
for unhidepkg in reversed(hidden_pkgs):
unhide_package(unhidepkg, prefix=builder_path)
return True

@ -324,20 +324,23 @@ class ClBuilderUpdateAction(Action):
'tasks': [
{'name': 'check_automagic',
'method': 'Builder.check_automagic(cl_builder_path)',
'condition': lambda Get:
Get('builder.cl_builder_check_automagic_set') == 'on',
# TODO: emerge.log check
# and
#BuilderConditions.was_installed(
# '.*', EmergeMark.Automagic)(Get)),
'condition': lambda Get: (
Get('builder.cl_builder_check_automagic_set') == 'on'
and BuilderConditions.was_installed(
'.*', EmergeMark.Automagic)(Get)),
'decoration': 'Builder.update_task("%s")' %
EmergeMark.Automagic
},
]
},
{'name': 'update_other:reading_news',
'method': 'Builder.reading_news(cl_builder_path)',
'essential': False
{'name': 'update_other:reading_news_group',
'group': __("Last news:"),
'tasks': [
{'name': 'update_other:reading_news',
'method': 'Builder.reading_news(cl_builder_path)',
'essential': False
},
]
},
{'name': 'update_other:check_obsolete',
'method': 'Builder.check_obsolete(cl_builder_path)'

@ -1686,6 +1686,7 @@ class VariableClBuilderBinhostScanSet(Variable):
"""
value = "off"
class VariableClBuilderCheckAutomagicSet(Variable):
"""
Выполнить проверку на наличие неописанных автоматических зависимостей
@ -1698,9 +1699,3 @@ class VariableClBuilderCheckAutomagicSet(Variable):
def init(self):
self.label = _("Check for auto depends")
self.help = _("check for auto depends")
def get(self):
if self.GetBool('cl_builder_binary_set'):
return "off"
else:
return "on"

Loading…
Cancel
Save