diff --git a/pym/update/emerge_parser.py b/pym/update/emerge_parser.py index 27d0302..0d13a88 100644 --- a/pym/update/emerge_parser.py +++ b/pym/update/emerge_parser.py @@ -594,7 +594,6 @@ class InstallingPackage(NotifierInformationBlock): binary = None token = ">>> Installing " - #TODO \033 - unicode symbol? probably gonna have to fix this re_block = re.compile( "Installing \({c}(\d+){c} " "of {c}(\d+){c}\) {c}([^\s\033]+){c}".format(c=_color_block)) @@ -640,7 +639,6 @@ class RevdepPercentBlock(NotifierInformationBlock): token = "Collecting system binaries" end_token = [re.compile("Assigning files to packages|" "All prepared. Starting rebuild")] - # re_block = re.compile("\[\s(\d+)%\s\]") re_block = re.compile("\[\s(\d+)%\s\]") action = None diff --git a/pym/update/update.py b/pym/update/update.py index 0f8a972..26e6f00 100644 --- a/pym/update/update.py +++ b/pym/update/update.py @@ -1501,18 +1501,16 @@ class Update(MethodsInterface): class Reason(): Success = 0 - LevelWrong = 1 - BadSign = 2 - Outdated = 3 + BadSign = 1 + Outdated = 2 + LevelWrong = 3 Skip = 4 Updating = 5 WrongBinhost = 6 BadEnv = 7 EnvNotFound = 8 SkipSlower = 9 - UnknownError = 10 - - + UnknownError = 10 @staticmethod def humanReadable(reason): @@ -1528,7 +1526,7 @@ class Update(MethodsInterface): Update.Reason.SkipSlower: "", Update.Reason.Success: "", #TODO formulate better - # Update.Reason.LevelWrong: "FAILED (binhost level is wrong)" + Update.Reason.LevelWrong: "FAILED (binhost level is low)" }.get(reason,reason) def _get_binhost_logger(self): @@ -1590,6 +1588,8 @@ class Update(MethodsInterface): else: # SUCCESS + if self.compare_update_level(binhost.level) < 0: + reason = self.Reason.LevelWrong if not binhost.downgraded or stabilization: host = "-> %s" % host reason = self.Reason.Success @@ -1613,7 +1613,10 @@ class Update(MethodsInterface): timestamp=binhost.timestamp, reason=Update.Reason.humanReadable(reason))) if not retval: - if actual_reason is self.Reason.BadSign: + if actual_reason is self.Reason.LevelWrong: + #TODO translate + raise UpdateError(_("Failed to find the reliable server with appropriate level")) + elif actual_reason is self.Reason.BadSign: raise UpdateError(_("Failed to find the reliable server with appropriate updates")) elif actual_reason in (self.Reason.Outdated, self.Reason.Skip, @@ -1680,7 +1683,8 @@ class Update(MethodsInterface): "are older than local").format(binhost_url)) elif not ignore_level and not self.is_binhost_level_valid(binhost): # self.stash_binhost(binhost_url) - self.set_migration_mode(True) + if self.compare_update_level(binhost.level) > 0: + self.set_migration_mode(True) #TODO translate raise UpdateError( _("Current binhost {} has a wrong update level. Current level: {} Binhost level: {}").\ @@ -1737,19 +1741,31 @@ class Update(MethodsInterface): retval or Variable.EmptyTable, force=True) if not ignore_level: - best_binhost_level = int(self.clVars.Get("update.cl_update_binhost_level")[0]) - + best_binhost_level = int(sorted(self.clVars.Get("update.cl_update_binhost_level"), key=int)[-1]) + # int(self.clVars.Get("update.cl_update_binhost_level")[0]) + if not current_level_is_valid: self._set_update_level(best_binhost_level) - - elif self.compare_update_level(best_binhost_level) != 0: - self.set_migration_mode(True) - #TODO reformulate, add translation - raise UpdateError(_("Update server's level is higher than local level")) - + else: + cmpr = self.compare_update_level(best_binhost_level) + if cmpr > 0: + self.set_migration_mode(True) + #TODO reformulate, add translation + raise UpdateError(_("Current level: {} Binhosts highest level: {}".\ + format(self.clVars.Get("update.cl_update_level"), best_binhost_level))) + if cmpr < 0: + # self.clVars.Delete('update.cl_update_binhost_host', location="system") + #self.clVars.Get("update.cl_update_binhost_host") + self.delete_binhost() + # raise UpdateError(_("Failed to find binhost with level equal or higher than local level")) + return False self.endTask() return True + #нужен так как detect_best_binhost не essential, ошибка не останавливает + def interrupt_on_no_leveled_binhost(self): + raise UpdateError(_("Failed to find binhost with level equal or higher than local level")) + def set_migration_mode(self, val=True): val_to_write = Variable.On if val else Variable.Off # self.clVars.Write("cl_update_use_migration_host", val_to_write, location="system") @@ -1848,24 +1864,6 @@ class Update(MethodsInterface): self.printWARNING(str(e)) return True - # #TODO rename - # def action_to_do_when_migr_is_set(self): - # print("DEBUG") - # dv = self.clVars - # git = self.getGit() - # repname = "calculate"#TODO check if there's a var for this - # url, rpath, revision = ( - # dv.Select(["cl_update_rep_url", "cl_update_rep_path", - # "cl_update_rep_rev"], - # where="cl_update_rep_name", eq=repname, limit=1)) - # ref_type = git.reference_type(rpath, revision) - # tag_cr = git.getCommit(rpath, revision) - # cr = git.getCurrentCommit(rpath) - # if ref_type == Git.Reference.Branch: - # pass #TODO - - # return True - def save_portage_state_hash(self): """ Сохранить состояние diff --git a/pym/update/utils/cl_update.py b/pym/update/utils/cl_update.py index 0052d3e..1d0a5f0 100644 --- a/pym/update/utils/cl_update.py +++ b/pym/update/utils/cl_update.py @@ -85,6 +85,14 @@ def get_synchronization_tasks(object_name): AllTasks.success_all("sync_reps"))), 'condition': lambda Get: Get('update.cl_update_use_migration_host') == 'off' }, + {'name': 'interrupt_on_no_leveled_binhost', + 'method': Object("interrupt_on_no_leveled_binhost()"), + 'essential': True, + 'depend': (Tasks.success() & ~AllTasks.has_any("not_use_search") & + (~AllTasks.success_one_of("check_current_binhost")) & + AllTasks.failed_all("detect_best_binhost")), + 'condition': lambda Get: Get('update.cl_update_use_migration_host') == 'off' + }, {'name': 'set_migration_binhost', 'method': Object('set_migration_host()'), 'depend': (Tasks.success() & ~AllTasks.has_any("not_use_search")|