|
|
|
@ -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
|
|
|
|
|