From 2fbafa7f680c446dd7deff5ff990871e1e079e52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A5=D0=B8=D1=80=D0=B5=D1=86=D0=BA=D0=B8=D0=B9=20=D0=9C?= =?UTF-8?q?=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Fri, 27 Jan 2017 17:43:25 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9C=D0=BD=D0=BE=D0=B6=D0=B5=D1=81=D1=82?= =?UTF-8?q?=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавлена поддержка Packages.xz. Изменёны сообщения при синхронизации репозиториев --- pym/update/update.py | 33 +++++++++++----- pym/update/utils/cl_update.py | 33 +++++++++++----- pym/update/utils/cl_update_profile.py | 3 +- pym/update/variables/update.py | 57 +++++++++++++++++++++++++++ pym/update/wsdl_update.py | 2 +- 5 files changed, 108 insertions(+), 20 deletions(-) diff --git a/pym/update/update.py b/pym/update/update.py index dffe451..2274dbe 100644 --- a/pym/update/update.py +++ b/pym/update/update.py @@ -32,6 +32,7 @@ from calculate.lib.utils.colortext import get_color_print from calculate.update.emerge_parser import RevdepPercentBlock from calculate.update.datavars import DataVarsUpdate from calculate.update.update_info import UpdateInfo +from calculate.lib.utils.binhosts import fetch_packages from calculate.lib.cl_log import log import re import shutil @@ -154,7 +155,7 @@ class Update(MethodsInterface): return getProgPath(program_name) def _syncRepository(self, name, url, rpath, revision, - cb_progress=None, clean=False): + cb_progress=None, clean=False, notask=False): """ Синхронизировать репозитори """ @@ -167,6 +168,10 @@ class Update(MethodsInterface): try: self.stash_cache(rpath, name) if not git.checkExistsRep(rpath): + if not notask: + self.startTask(_("Syncing the {rep} repository").format( + rep=name.capitalize())) + self.addProgress() git.cloneTagRepository(url, rpath, revision, cb_progress=cb_progress) info_outdated = True @@ -177,10 +182,7 @@ class Update(MethodsInterface): tag_cr = git.getCommit(rpath, revision) cr = git.getCurrentCommit(rpath) ref_type = git.reference_type(rpath, revision) - if git.isNeedUnpack(rpath): - need_update = True - clean = True - elif tag_cr != cr or ref_type == Git.Reference.Branch: + if tag_cr != cr or ref_type == Git.Reference.Branch: need_update = True elif clean: status = git.getStatusInfo(rpath) @@ -189,6 +191,10 @@ class Update(MethodsInterface): except GitError: need_update = True if need_update: + if not notask: + self.startTask(_("Syncing the {rep} repository").format( + rep=name.capitalize())) + self.addProgress() git.updateTagRepository(url, rpath, revision, cb_progress=cb_progress, clean=clean) @@ -300,7 +306,8 @@ class Update(MethodsInterface): return True @variable_module("update") - def syncRepositories(self, repname, clean_on_error=True): + def syncRepositories(self, repname, fallback_sync=False, + clean_on_error=True): """ Синхронизировать репозитории """ @@ -321,7 +328,6 @@ class Update(MethodsInterface): rpath_orig = rpath else: rpath_orig = rpath[len(chroot_path):] - self.addProgress() mtime = MTimeKeeper(path.join(rpath, "profiles/updates")) mtime.save() @@ -336,7 +342,8 @@ class Update(MethodsInterface): layman.add(repname, url, rpath_orig) if not self._syncRepository(repname, url, rpath, revision, cb_progress=self.setProgress, - clean=check_status): + clean=check_status, + notask=fallback_sync): return "skip" return True except GitError as e: @@ -353,7 +360,8 @@ class Update(MethodsInterface): try: self._syncRepository(repname, url, rpath_new, revision, cb_progress=self.setProgress, - clean=check_status) + clean=check_status, + notask=fallback_sync) removeDir(rpath) shutil.move(rpath_new, rpath) except OSError as e: @@ -1200,6 +1208,7 @@ class Update(MethodsInterface): if write_binhost: if hosts[0] != self.clVars.Get('update.cl_update_binhost'): self.refresh_binhost = True + self.clVars.Set('cl_update_package_cache_set', 'on') self.clVars.Write('cl_update_binhost', hosts[0], location="system") new_ts = self.clVars.Get("update.cl_update_binhost_timestamp") if new_ts: @@ -1266,3 +1275,9 @@ class Update(MethodsInterface): dv.Set('update.cl_update_branch_name', revs) dv.Invalidate('update.cl_update_rep_rev') return True + + def download_packages(self, url_binhost, packages_fn): + fetch_packages(url_binhost, packages_fn) + return True + + diff --git a/pym/update/utils/cl_update.py b/pym/update/utils/cl_update.py index 441d5db..a51d7df 100644 --- a/pym/update/utils/cl_update.py +++ b/pym/update/utils/cl_update.py @@ -18,6 +18,7 @@ import sys from calculate.core.server.func import Action, Tasks from calculate.lib.cl_lang import setLocalTranslate, getLazyLocalTranslate from calculate.lib.cl_template import TemplatesError +from calculate.lib.utils.binhosts import BinhostError from calculate.lib.utils.files import FilesError from calculate.update.update import UpdateError from calculate.update.emerge_parser import EmergeError @@ -54,7 +55,7 @@ class ClUpdateAction(Action): """ # ошибки, которые отображаются без подробностей native_error = (FilesError, UpdateError, - TemplatesError, + TemplatesError, BinhostError, GitError, EmergeError) successMessage = None @@ -183,7 +184,7 @@ class ClUpdateAction(Action): 'foreach': 'cl_update_sync_rep', 'message': __("Fallback syncing the {eachvar:capitalize} repository"), - 'method': 'Update.syncRepositories(eachvar)', + 'method': 'Update.syncRepositories(eachvar,True)', 'condition': lambda Get: ("getbinpkg" in Get('cl_features') and not Get('cl_update_binhost_data')[0]) }, @@ -195,7 +196,7 @@ class ClUpdateAction(Action): }, {'name': 'sync_reps', 'foreach': 'cl_update_sync_rep', - 'message': __("Syncing the {eachvar:capitalize} repository"), + 'message': __("Checking {eachvar:capitalize} updates"), 'method': 'Update.syncRepositories(eachvar)', 'condition': lambda Get: Get('cl_update_sync_rep') }, @@ -257,10 +258,19 @@ class ClUpdateAction(Action): {'name': 'sync_reps:cleanpkg', 'message': __("Removing obsolete distfiles and binary packages"), 'method': 'Update.cleanpkg()', - 'condition': (lambda Get: Get('cl_update_cleanpkg_set') == 'on' and - Get('cl_update_outdate_set') == 'on'), + 'condition': ( + lambda Get: Get('cl_update_cleanpkg_set') == 'on' and + Get('cl_update_outdate_set') == 'on'), 'essential': False }, + {'name': 'update_packages_cache', + 'message': __("Update packages index"), + 'method': 'Update.download_packages(cl_update_portage_binhost,' + 'cl_update_package_cache)', + 'condition': lambda Get: ( + Get('cl_update_outdate_set') == 'on' or + Get('cl_update_package_cache_set') == 'on') + }, # сообщение удачного завершения при обновлении репозиториев {'name': 'success_syncrep', 'message': __("Synchronization finished"), @@ -268,7 +278,7 @@ class ClUpdateAction(Action): "sync_other_reps", "emerge_metadata", "eix_update")), - } + } ] }, {'name': 'reps_synchronization', @@ -278,13 +288,18 @@ class ClUpdateAction(Action): 'message': __("Fixing the settings"), 'method': 'Update.applyTemplates(install.cl_source,' 'cl_template_clt_set,True,None,False)', - 'condition': lambda Get: Get('cl_templates_locate') + 'condition': lambda Get: (Get('cl_templates_locate') and + (Get('cl_update_outdate_set') == 'on' or + Get('cl_update_force_fix_set') == 'on')) + }, {'name': 'dispatch_conf', 'message': __("Updating configuration files"), - 'method':'Update.dispatchConf()', + 'method': 'Update.dispatchConf()', 'condition': lambda Get: (Get('cl_dispatch_conf') != 'skip' and - Get('cl_update_pretend_set') == 'off') + Get('cl_update_pretend_set') == 'off' and + (Get('cl_update_outdate_set') == 'on' or + Get('cl_update_force_fix_set') == 'on')) }, {'name': 'binhost_changed', 'method': 'Update.message_binhost_changed()' diff --git a/pym/update/utils/cl_update_profile.py b/pym/update/utils/cl_update_profile.py index 5899508..3d99722 100644 --- a/pym/update/utils/cl_update_profile.py +++ b/pym/update/utils/cl_update_profile.py @@ -18,6 +18,7 @@ import sys from calculate.core.server.func import Action, Tasks from calculate.lib.cl_lang import setLocalTranslate, getLazyLocalTranslate from calculate.lib.cl_template import TemplatesError +from calculate.lib.utils.binhosts import BinhostError from calculate.lib.utils.files import FilesError from calculate.update.update import UpdateError from calculate.lib.utils.git import GitError @@ -33,7 +34,7 @@ class ClUpdateProfileAction(Action): """ # ошибки, которые отображаются без подробностей native_error = (FilesError, - TemplatesError, + TemplatesError, BinhostError, UpdateError, GitError) successMessage = __("The profile was successfully updated") diff --git a/pym/update/variables/update.py b/pym/update/variables/update.py index 5e38c4e..8b060ce 100644 --- a/pym/update/variables/update.py +++ b/pym/update/variables/update.py @@ -40,6 +40,7 @@ from calculate.lib.variables import linux as lib_linux from calculate.lib.variables import env from calculate.update.update_info import UpdateInfo from itertools import chain +from urlparse import urlparse import time _ = lambda x: x @@ -1631,6 +1632,20 @@ class VariableClUpdateCheckRepSet(Variable): self.help = _("check and fix the repositories integrity") +class VariableClUpdateForceFixSet(Variable): + """ + Удлять лишние файлы из репозиториев (например созданные пользователем) + """ + type = "bool" + value = "off" + + opt = ["--force-fix"] + + def init(self): + self.label = _("Force fix the settings") + self.help = _("force fix the settings") + + class VariableClUpdateOnedepthSet(Variable): """ Удлять лишние файлы из репозиториев (например созданные пользователем) @@ -1655,3 +1670,45 @@ class VariableClUpdateEixRepositories(ReadonlyVariable): x.capitalize() for x in chain( self.Get('update.cl_update_rep_name'), self.Get('update.cl_update_other_rep_name'))) + + +class VariableClUpdatePortageBinhost(ReadonlyVariable): + """ + Прописываемый в /etc/portage/make.conf/binhost репозиторий + """ + value_format = "{update.cl_update_binhost}/grp/{os_arch_machine}" + + +class VariableClUpdatePackageCache(ReadonlyVariable): + """ + Путь кэшированного Packages + """ + def get(self): + cache_path = "var/cache/edb" + chroot_path = self.Get('cl_chroot_path') + base_url = self.Get('cl_update_portage_binhost') + parsed_url = urlparse(base_url) + host = parsed_url.netloc + port = parsed_url.port + user = None + passwd = None + user_passwd = "" + if "@" in host: + user, host = host.split("@", 1) + user_passwd = user + "@" + if ":" in user: + user, passwd = user.split(":", 1) + if port is not None: + port_str = ":%s" % (port,) + if host.endswith(port_str): + host = host[:-len(port_str)] + return os.path.join(chroot_path, cache_path, "binhost", + host, parsed_url.path.lstrip("/"), + "Packages") + +class VariableClUpdatePackageCacheSet(Variable): + """ + Необходимость обновить Packages + """ + type = "bool" + value = "off" diff --git a/pym/update/wsdl_update.py b/pym/update/wsdl_update.py index f95dfd1..7467141 100644 --- a/pym/update/wsdl_update.py +++ b/pym/update/wsdl_update.py @@ -68,7 +68,6 @@ class Wsdl(WsdlBase): 'cl_update_binhost_stable_opt_set', 'cl_update_binhost_recheck_set', ), - expert=( 'cl_update_sync_only_set', 'cl_update_other_set', @@ -76,6 +75,7 @@ class Wsdl(WsdlBase): 'cl_update_sync_rep', 'cl_update_emergelist_set', 'cl_update_check_rep_set', + 'cl_update_force_fix_set', 'cl_update_world', 'cl_update_egencache_force', 'cl_update_eixupdate_force',