Добавлена процедура выявления автоматических зависимостей

parent d1532b29f5
commit dba4ec8d89

@ -20,6 +20,7 @@ import re
import sys
import time
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
@ -35,18 +36,22 @@ from calculate.lib.utils.files import (
from calculate.lib.utils.git import Git
from calculate.lib.utils.portage import (Layman, EmergeLog, EmergeLogNamedTask,
InstalledPackageInfo, EbuildInfoError,
EbuildInfo, ChrootEix,
EbuildInfo, ChrootEix, getRequires,
get_packages_files_directory,
get_manifest_files_directory)
get_manifest_files_directory,
PackageList, VDB_PATH,
LibraryProviders, EmergePackage)
from calculate.update.emerge_parser import (EmergeParser,
EmergeError, EmergeCommand, Chroot,
Linux32, CommandExecutor,
RevdepPercentBlock, EmergeCache)
from calculate.lib.cl_log import log
from calculate.update.update_tasks import EmergeMark
from .build_storage import Build
from calculate.update.update import Update
from calculate.install.distr import (Distributive, IsoDistributive,
DistributiveError)
import shutil
from functools import partial
import os
from os import path
@ -1324,3 +1329,78 @@ class Builder(Update):
self.endTask()
return True
def pretend_emerge_list(self, builder_path, *packages):
"""
Получить список устанавливаемых пакетов
:param builder_path:
:param packages:
:return:
"""
deo = self.get_default_emerge_opts()
logfile = self._get_log_file()
with EmergeParser(self.chrootize(builder_path, EmergeCommand(
["=%s" % x for x in packages] + ["@system"],
emerge_default_opts=deo,
extra_params=["-pKve"], logfile=logfile))) as emerge:
try:
emerge.question.action = lambda x: False
emerge.run()
for pkg in emerge.install_packages.list:
yield pkg
except EmergeError:
print emerge.prepare_error
def check_automagic(self, builder_path):
"""
Проверка на наличие неописанных автоматических зависимостей
:param builder_path:
:return:
"""
task = EmergeLog(EmergeLogNamedTask(EmergeMark.Automagic),
prefix=builder_path)
vdb_path = "var/db/.pkg"
real_vdb_path = path.join(builder_path, VDB_PATH)
hide_vdb_path = path.join(builder_path, vdb_path)
try:
shutil.move(real_vdb_path, hide_vdb_path)
except (IOError, OSError):
raise BuilderError(_("Failed to hide package database"))
lp = LibraryProviders(vdb_path="var/db/.pkg", prefix=builder_path)
automagic = {}
# task_list = task.list
task_list = []
for i in 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)))
try:
check_data = [(x,
list(set(filter(
None,
[lp.get(y) for y in
getRequires(x, vdb_path=vdb_path,
prefix=builder_path)]))))
for x in PackageList(task_list)]
check_data = {x: y for x, y in check_data if y}
for i, data in enumerate(check_data.items()):
package, required_pkgs = data
self.startTask("Check (%d of %d) %s" % (
i + 1, len(check_data), package))
for pkg in self.pretend_emerge_list(builder_path, package):
if pkg in required_pkgs:
required_pkgs.remove(pkg)
if required_pkgs:
automagic[package] = required_pkgs
finally:
try:
shutil.move(hide_vdb_path, real_vdb_path)
except (IOError, OSError):
raise BuilderError(_("Failed to unhide package database"))
if automagic:
for pkg, reqs in automagic.items():
self.printWARNING("Detect auto depends for %s package by %s" % (
pkg, ",".join(str(x) for x in reqs)))
return True

@ -319,13 +319,29 @@ class ClBuilderUpdateAction(Action):
],
'depend': Tasks.has("update_other")
},
{'name': 'update_world:check_automagic_group',
'group': __("Check for auto depends"),
'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)),
'decoration': 'Builder.update_task("%s")' %
EmergeMark.Automagic
},
]
},
{'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)'
}
},
] + [
{'name': 'failed',
'error': __("Failed to update the system"),

@ -1685,3 +1685,16 @@ class VariableClBuilderBinhostScanSet(Variable):
Сканировать или нет зеркала (переменная переключается во время действия)
"""
value = "off"
class VariableClBuilderCheckAutomagicSet(Variable):
"""
Выполнить проверку на наличие неописанных автоматических зависимостей
"""
type = "bool"
value = "off"
opt = ["--check-autodep"]
def init(self):
self.label = _("Check for auto depends")
self.help = _("check for auto depends")

@ -193,6 +193,7 @@ class Wsdl(WsdlBase):
'update.cl_update_skip_rb_set',
'update.cl_update_onedepth_set',
'update.cl_update_cleanpkg_set',
'builder.cl_builder_check_automagic_set',
'cl_builder_branch_data',
'cl_templates_locate',
'cl_verbose_set',
@ -214,6 +215,7 @@ class Wsdl(WsdlBase):
'update.cl_update_skip_rb_set',
'update.cl_update_onedepth_set',
'update.cl_update_cleanpkg_set',
'builder.cl_builder_check_automagic_set',
'cl_builder_branch_data',
'cl_templates_locate',
'cl_verbose_set',
@ -236,6 +238,7 @@ class Wsdl(WsdlBase):
'update.cl_update_skip_rb_set',
'update.cl_update_onedepth_set',
'update.cl_update_cleanpkg_set',
'builder.cl_builder_check_automagic_set',
'cl_builder_brief_branch_data',
),
next_label=_("Next"))],

Loading…
Cancel
Save