|
|
|
@ -27,6 +27,7 @@ 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)
|
|
|
|
|
from calculate.lib.utils.common import CmdlineParams
|
|
|
|
|
from calculate.lib.utils.portage import BinaryPackage, get_binary_file
|
|
|
|
|
from calculate.lib.utils.files import (
|
|
|
|
|
pathJoin, PercentProgress, getProgPath, process, STDOUT, removeDir,
|
|
|
|
|
makeDirectory, writeFile, readLinesFile, chmod, chown, FilePermission,
|
|
|
|
@ -1381,7 +1382,7 @@ class Builder(Update):
|
|
|
|
|
|
|
|
|
|
automagic = OrderedDict()
|
|
|
|
|
automagic_waste = {}
|
|
|
|
|
automagic_skip = {}
|
|
|
|
|
automagic_clear = {}
|
|
|
|
|
try:
|
|
|
|
|
system_ini = SystemIni(self.clVars.Get('cl_builder_linux_datavars'))
|
|
|
|
|
lp = LibraryProviders(vdb_path=vdb_path, prefix=builder_path)
|
|
|
|
@ -1415,38 +1416,38 @@ class Builder(Update):
|
|
|
|
|
self.endTask(False)
|
|
|
|
|
self.printERROR("Failed to receive package list")
|
|
|
|
|
else:
|
|
|
|
|
# получаем список пакетов которые необходимых для работы
|
|
|
|
|
required_pkgs = [x for x in required_pkgs
|
|
|
|
|
if all(y not in pretend for y in x)]
|
|
|
|
|
required_pkgs = list(set(chain(*required_pkgs)))
|
|
|
|
|
|
|
|
|
|
skip_req_pkgs = filter(
|
|
|
|
|
clear_req_pkgs = filter(
|
|
|
|
|
None, [x.strip() for x in system_ini.getVar(
|
|
|
|
|
"automagic-allowed",
|
|
|
|
|
"automagic-clear",
|
|
|
|
|
package["CATEGORY/PN"]).split(",")])
|
|
|
|
|
waste_pkgs = [x for x in skip_req_pkgs if
|
|
|
|
|
waste_pkgs = [x for x in clear_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] = []
|
|
|
|
|
automagic_clear[package] = []
|
|
|
|
|
for pkg in required_pkgs:
|
|
|
|
|
if any(x == pkg["CATEGORY/PN"] for x in skip_req_pkgs):
|
|
|
|
|
automagic_skip[package].append(pkg)
|
|
|
|
|
if any(x == pkg["CATEGORY/PN"] for x in clear_req_pkgs):
|
|
|
|
|
automagic_clear[package].append(pkg)
|
|
|
|
|
else:
|
|
|
|
|
automagic[package].append(pkg)
|
|
|
|
|
if automagic[package]:
|
|
|
|
|
self.endTask(False)
|
|
|
|
|
self.endTask(True)
|
|
|
|
|
finally:
|
|
|
|
|
try:
|
|
|
|
|
shutil.move(hide_vdb_path, real_vdb_path)
|
|
|
|
|
except (IOError, OSError):
|
|
|
|
|
raise BuilderError(_("Failed to unhide package database"))
|
|
|
|
|
self._report_automagic(automagic, automagic_skip, automagic_waste)
|
|
|
|
|
self._rebuild_automagic(automagic, automagic_skip, builder_path)
|
|
|
|
|
self._report_automagic(automagic, automagic_clear, automagic_waste)
|
|
|
|
|
self._rebuild_automagic(automagic, automagic_clear, builder_path)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def _report_automagic(self, automagic, automagic_skip, automagic_waste):
|
|
|
|
|
def _report_automagic(self, automagic, automagic_clear, automagic_waste):
|
|
|
|
|
"""
|
|
|
|
|
Сообщить информацию о вычисленных автоматических зависимостей
|
|
|
|
|
:param automagic:
|
|
|
|
@ -1454,24 +1455,23 @@ class Builder(Update):
|
|
|
|
|
:param automagic_waste:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if automagic:
|
|
|
|
|
for pkg, reqs in automagic.items():
|
|
|
|
|
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)))
|
|
|
|
|
|
|
|
|
|
def _rebuild_automagic(self, automagic, automagic_skip, builder_path):
|
|
|
|
|
for pkg, reqs in automagic.items():
|
|
|
|
|
if reqs:
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
"Auto depends for %s package by %s will be used" % (
|
|
|
|
|
pkg, ",".join(str(x) for x in reqs)))
|
|
|
|
|
for pkg, clear_req_pkgs in automagic_clear.items():
|
|
|
|
|
if clear_req_pkgs:
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
"Auto depends for %s package by %s will be clear" % (
|
|
|
|
|
pkg, ",".join(str(x) for x in clear_req_pkgs)))
|
|
|
|
|
for pkg, waste_pkgs in automagic_waste.items():
|
|
|
|
|
if waste_pkgs:
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
"Specified depends for %s package by %s obsoleted" % (
|
|
|
|
|
pkg, ",".join(waste_pkgs)))
|
|
|
|
|
|
|
|
|
|
def _rebuild_automagic(self, automagic, automagic_clear, builder_path):
|
|
|
|
|
"""
|
|
|
|
|
Пересобрать пакеты с автоматическими зависимостями
|
|
|
|
|
:param automagic:
|
|
|
|
@ -1482,55 +1482,67 @@ class Builder(Update):
|
|
|
|
|
automagic_log_dn = "/var/log/calculate/automagic"
|
|
|
|
|
makeDirectory(automagic_log_dn)
|
|
|
|
|
self.pkgnum = 0
|
|
|
|
|
self.pkgnummax = len(automagic)
|
|
|
|
|
self.pkgnummax = sum(1 for k, v in automagic.items()
|
|
|
|
|
if v or automagic_clear[k])
|
|
|
|
|
work_dn = '/var/calculate/tmp/xpak-%s' % self.clVars.Get(
|
|
|
|
|
'cl_builder_id_path')
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
for pkg, reqs in automagic.items():
|
|
|
|
|
skip_req_pkgs = automagic_skip.get(pkg, [])
|
|
|
|
|
self.pkgnum += 1
|
|
|
|
|
if not reqs:
|
|
|
|
|
if skip_req_pkgs:
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
_("Skip ({num} of {nummax}) remerge "
|
|
|
|
|
"{package} package").format(num=self.pkgnum,
|
|
|
|
|
nummax=self.pkgnummax,
|
|
|
|
|
package=str(pkg)))
|
|
|
|
|
clear_req_pkgs = automagic_clear.get(pkg, [])
|
|
|
|
|
if not reqs and not clear_req_pkgs:
|
|
|
|
|
continue
|
|
|
|
|
try:
|
|
|
|
|
hide_packages(*reqs, prefix=builder_path)
|
|
|
|
|
|
|
|
|
|
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 reqs)))
|
|
|
|
|
except EmergeError:
|
|
|
|
|
old_logfile = self._get_log_file()
|
|
|
|
|
pkg_path = str(pkg).replace("/", "_")
|
|
|
|
|
new_logfile = '%s/%s-%s.log' % (
|
|
|
|
|
automagic_log_dn, self.clVars.Get('cl_builder_id_path'),
|
|
|
|
|
pkg_path)
|
|
|
|
|
try:
|
|
|
|
|
os.rename(old_logfile, new_logfile)
|
|
|
|
|
except (OSError, IOError) as e:
|
|
|
|
|
self.printERROR("{message}: {error}".format(
|
|
|
|
|
message=_("Failed to save build log"),
|
|
|
|
|
error=str(e)))
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("Failed to merge {package} without "
|
|
|
|
|
"{hidden_pkgs}").format(
|
|
|
|
|
package=str(pkg),
|
|
|
|
|
hidden_pkgs=",".join(str(x) for x in reqs)))
|
|
|
|
|
raise
|
|
|
|
|
except PackageError as e:
|
|
|
|
|
raise BuilderError(str(e))
|
|
|
|
|
finally:
|
|
|
|
|
|
|
|
|
|
self.pkgnum += 1
|
|
|
|
|
if clear_req_pkgs:
|
|
|
|
|
try:
|
|
|
|
|
unhide_packages(prefix=builder_path, force=True)
|
|
|
|
|
hide_packages(*clear_req_pkgs, prefix=builder_path)
|
|
|
|
|
|
|
|
|
|
self.emerge(builder_path, "-O", "=%s" % pkg)
|
|
|
|
|
except EmergeError:
|
|
|
|
|
old_logfile = self._get_log_file()
|
|
|
|
|
pkg_path = str(pkg).replace("/", "_")
|
|
|
|
|
new_logfile = '%s/%s-%s.log' % (
|
|
|
|
|
automagic_log_dn,
|
|
|
|
|
self.clVars.Get('cl_builder_id_path'), pkg_path)
|
|
|
|
|
try:
|
|
|
|
|
os.rename(old_logfile, new_logfile)
|
|
|
|
|
except (OSError, IOError) as e:
|
|
|
|
|
self.printERROR("{message}: {error}".format(
|
|
|
|
|
message=_("Failed to save build log"),
|
|
|
|
|
error=str(e)))
|
|
|
|
|
self.printERROR(
|
|
|
|
|
_("Failed to merge {package} without "
|
|
|
|
|
"{hidden_pkgs}").format(
|
|
|
|
|
package=str(pkg),
|
|
|
|
|
hidden_pkgs=",".join(str(x) for x in reqs)))
|
|
|
|
|
raise
|
|
|
|
|
except PackageError as e:
|
|
|
|
|
raise BuilderError(str(e))
|
|
|
|
|
finally:
|
|
|
|
|
try:
|
|
|
|
|
unhide_packages(prefix=builder_path, force=True)
|
|
|
|
|
except PackageError as e:
|
|
|
|
|
raise BuilderError(str(e))
|
|
|
|
|
if reqs:
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
_("({num} of {nummax}) Inject dependences for "
|
|
|
|
|
"{package} package").format(num=self.pkgnum,
|
|
|
|
|
nummax=self.pkgnummax,
|
|
|
|
|
package=str(pkg)))
|
|
|
|
|
pkg_fn = get_binary_file(
|
|
|
|
|
pkg, self.clVars.Get('cl_builder_linux_pkgdir'))
|
|
|
|
|
bp = BinaryPackage(pkg_fn, work_dn)
|
|
|
|
|
try:
|
|
|
|
|
bp["RDEPEND"] = "{oldpkgs} {newpkgs}".format(
|
|
|
|
|
oldpkgs=bp["RDEPEND"],
|
|
|
|
|
newpkgs=" ".join("%s:%s" % (
|
|
|
|
|
x["CATEGORY/PN"], x["SLOT"]) for x in reqs))
|
|
|
|
|
bp["autodeps"] = "\n".join("%s:%s" % (
|
|
|
|
|
x["CATEGORY/PN"], x["SLOT"]) for x in reqs)
|
|
|
|
|
bp.save()
|
|
|
|
|
finally:
|
|
|
|
|
bp.clear()
|
|
|
|
|
finally:
|
|
|
|
|
self.pkgnummax = None
|
|
|
|
|
self.pkgnum = None
|
|
|
|
|