Изменён работа с автоматическими зависмостями

3.5.1_beta7
parent 9ddaa621c0
commit b9588ddade

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

Loading…
Cancel
Save