|
|
|
@ -13,6 +13,7 @@
|
|
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
# See the License for the specific language governing permissions and
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
from collections import OrderedDict
|
|
|
|
|
|
|
|
|
|
from itertools import chain
|
|
|
|
|
|
|
|
|
@ -20,13 +21,11 @@ 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, SystemIni
|
|
|
|
|
from calculate.lib.datavars import DataVars, Variable
|
|
|
|
|
from calculate.lib.utils.colortext import (TextState, get_color_print,
|
|
|
|
|
convert_console_to_xml)
|
|
|
|
|
from calculate.lib.utils.colortext import (TextState, get_color_print)
|
|
|
|
|
from calculate.lib.utils.common import CmdlineParams
|
|
|
|
|
from calculate.lib.utils.files import (
|
|
|
|
|
pathJoin, PercentProgress, getProgPath, process, STDOUT, removeDir,
|
|
|
|
@ -40,9 +39,9 @@ from calculate.lib.utils.portage import (Layman, EmergeLog, EmergeLogNamedTask,
|
|
|
|
|
get_packages_files_directory,
|
|
|
|
|
get_manifest_files_directory,
|
|
|
|
|
PackageList, VDB_PATH,
|
|
|
|
|
hide_package, unhide_package,
|
|
|
|
|
LibraryProviders, EmergePackage,
|
|
|
|
|
getInstalledAtom)
|
|
|
|
|
hide_packages, unhide_packages,
|
|
|
|
|
LibraryProviders,
|
|
|
|
|
PackageError, getInstalledAtom)
|
|
|
|
|
from calculate.update.emerge_parser import (EmergeParser,
|
|
|
|
|
EmergeError, EmergeCommand, Chroot,
|
|
|
|
|
Linux32, CommandExecutor,
|
|
|
|
@ -88,6 +87,8 @@ class Builder(Update):
|
|
|
|
|
self.update_map = {}
|
|
|
|
|
self.color_print = get_color_print()
|
|
|
|
|
self.emerge_cache = EmergeCache()
|
|
|
|
|
self.pkgnum = None
|
|
|
|
|
self.pkgnummax = None
|
|
|
|
|
|
|
|
|
|
def mount_target(self, target):
|
|
|
|
|
dir_distro = target.convertToDirectory()
|
|
|
|
@ -1365,7 +1366,8 @@ class Builder(Update):
|
|
|
|
|
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)]))
|
|
|
|
|
for x in readLinesFile(cache_list,
|
|
|
|
|
grab=True)]))
|
|
|
|
|
task_list = list(task.list) + task_list
|
|
|
|
|
|
|
|
|
|
vdb_path = "var/db/.pkg"
|
|
|
|
@ -1376,7 +1378,7 @@ class Builder(Update):
|
|
|
|
|
except (IOError, OSError):
|
|
|
|
|
raise BuilderError(_("Failed to hide package database"))
|
|
|
|
|
|
|
|
|
|
automagic = {}
|
|
|
|
|
automagic = OrderedDict()
|
|
|
|
|
automagic_waste = {}
|
|
|
|
|
automagic_skip = {}
|
|
|
|
|
try:
|
|
|
|
@ -1393,13 +1395,20 @@ class Builder(Update):
|
|
|
|
|
|
|
|
|
|
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 x["CATEGORY"] != "virtual"}
|
|
|
|
|
|
|
|
|
|
for i, data in enumerate(check_data.items()):
|
|
|
|
|
for i, data in enumerate(sorted(check_data.items(),
|
|
|
|
|
key=lambda x:x[0])):
|
|
|
|
|
package, required_pkgs = data
|
|
|
|
|
|
|
|
|
|
self.startTask("Check (%d of %d) %s" % (
|
|
|
|
|
i + 1, len(check_data), package))
|
|
|
|
|
|
|
|
|
|
if not required_pkgs:
|
|
|
|
|
self.endTask(True)
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
pretend = list(self.pretend_emerge_list(builder_path, package))
|
|
|
|
|
if not pretend:
|
|
|
|
|
self.endTask(False)
|
|
|
|
@ -1432,6 +1441,18 @@ class Builder(Update):
|
|
|
|
|
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)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def _report_automagic(self, automagic, automagic_skip, automagic_waste):
|
|
|
|
|
"""
|
|
|
|
|
Сообщить информацию о вычисленных автоматических зависимостей
|
|
|
|
|
:param automagic:
|
|
|
|
|
:param automagic_skip:
|
|
|
|
|
:param automagic_waste:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
if automagic:
|
|
|
|
|
for pkg, reqs in automagic.items():
|
|
|
|
|
skip_req_pkgs = automagic_skip.get(pkg, [])
|
|
|
|
@ -1449,29 +1470,68 @@ class Builder(Update):
|
|
|
|
|
"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:
|
|
|
|
|
def _rebuild_automagic(self, automagic, automagic_skip, builder_path):
|
|
|
|
|
"""
|
|
|
|
|
Пересобрать пакеты с автоматическими зависимостями
|
|
|
|
|
:param automagic:
|
|
|
|
|
:param automagic_skip:
|
|
|
|
|
:param builder_path:
|
|
|
|
|
:return:
|
|
|
|
|
"""
|
|
|
|
|
automagic_log_dn = "/var/log/calculate/automagic"
|
|
|
|
|
makeDirectory(automagic_log_dn)
|
|
|
|
|
self.pkgnum = 0
|
|
|
|
|
self.pkgnummax = len(automagic)
|
|
|
|
|
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 remerge %s package") % pkg)
|
|
|
|
|
self.printWARNING(
|
|
|
|
|
_("Skip ({num} of {nummax}) remerge "
|
|
|
|
|
"{package} package").format(num=self.pkgnum,
|
|
|
|
|
nummax=self.pkgnummax,
|
|
|
|
|
package=str(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)
|
|
|
|
|
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:
|
|
|
|
|
try:
|
|
|
|
|
unhide_packages(prefix=builder_path, force=True)
|
|
|
|
|
except PackageError as e:
|
|
|
|
|
raise BuilderError(str(e))
|
|
|
|
|
finally:
|
|
|
|
|
self.pkgnummax = None
|
|
|
|
|
self.pkgnum = None
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|