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