Parcourir la source

Множественные исправления:

Исправлен вывод списка пакетов в режиме verbose
Изменен вывод сообщения при синхронизации репозитория
Изменен вывод списка обновляемых пакетов (- -> *)
К списку обновляемых пакетов добавлен вывод удаляемых пакетов
Изменено сообщение Emerge world на Calculating dependencies
Исправлена работа с кэшем (актуализация кэша в конце обновления)
Добавлен параметр --sync-onc --pretend
Удален параметр --pre-check
Изменены метки в emerge.log (добавлено Calculate:)
Исправлено обновление модулей x11 и ядра
Исправлно взаимодействие с eix-sync
В список проверок добавлены /var/lib/portage/{world,world_sets}
Испавлена реакция на ошибку emerge при получении файла
Исправлено получение размера пакета в списке обновлений
Пакет -bin отображаются как бинарные даже если собираются из исходников
master3.3 3.2.0_alpha4
Mike khiretskiy il y a 8 ans
Parent
révision
4a67cc8d7e
  1. 2
      data/cl-git-wrapper
  2. 4
      update/emerge_parser.py
  3. 12
      update/package_tools.py
  4. 120
      update/update.py
  5. 31
      update/utils/cl_update.py
  6. 38
      update/variables/update.py
  7. 3
      update/wsdl_update.py

2
data/cl-git-wrapper

@ -22,7 +22,7 @@ native_reps=,$(/usr/sbin/cl-core --method core_variables_show \
if echo $native_reps | grep -q ,${repo_name},
then
# отбновить репозиторий через утилиты Calculate
/usr/sbin/cl-core --method update $repo_name --skip-update-metadata --skip-eix-update --update-rev=off
/usr/sbin/cl-core --method update $repo_name --sync-only on --skip-update-metadata --skip-eix-update --update-rev=off
else
# выполнить обновление через git
/usr/bin/git $*

4
update/emerge_parser.py

@ -22,7 +22,7 @@ import sys
from calculate.lib.utils.colortext.palette import TextState
from calculate.lib.utils.tools import ignore
from package_tools import EmergePackage, PackageList, EmergeUpdateInfo, \
UnmergePackage, EmergeRemoveInfo, Git, GitError
EmergeRemoveInfo, Git, GitError
Colors = TextState.Colors
import pexpect
@ -550,6 +550,8 @@ class EmergeCache(object):
# список файлов проверяемый по mtime на изменения
check_list = [MtimeCheckvalue('/etc/make.conf',
'/etc/portage',
'/var/lib/portage/world',
'/var/lib/portage/world_sets',
'/etc/make.profile')]
def __init__(self):

12
update/package_tools.py

@ -661,7 +661,7 @@ class EmergeUpdateInfo(Mapping):
atom_info = r"\S+"
use_info = 'USE="[^"]+"'
prev_version = "\[([^\]]+)\]"
pkg_size = r"\d+ \w+"
pkg_size = r"[\d,]+ \w+"
attrs = ['binary', 'REPLACING_VERSIONS', 'SIZE']
@ -707,7 +707,9 @@ class EmergeUpdateInfo(Mapping):
return self._package == version
def __contains__(self, item):
return item in self._package
if not self._info:
self._parseData()
return item in self.attrs or item in self._package
def __repr__(self):
return "EmergeUpdateInfo(%s/%s,%s)" % (
@ -831,7 +833,7 @@ class EmergeLogNamedTask(EmergeLogTask):
"""
Получить маркер начала задачи
"""
return "Started {taskname} on: {date}".format(
return "Calculate: Started {taskname} on: {date}".format(
taskname=self.taskname,
date=datetime.datetime.now().strftime(self.date_format))
@ -839,7 +841,7 @@ class EmergeLogNamedTask(EmergeLogTask):
"""
Получить маркер завершения задачи
"""
return "*** Finished %s" % self.taskname
return " *** Calculate: Finished %s" % self.taskname
class EmergeLog:
@ -902,7 +904,7 @@ class EmergeLog:
def _set_marker(self, text_marker):
with open(self.emerge_log, 'a') as f:
f.write("{0:.0f}: {1}\n".format(time.time(), text_marker))
f.write("{0:.0f}: {1}\n".format(time.time(), text_marker))
def mark_begin_task(self):
"""

120
update/update.py

@ -24,7 +24,7 @@ import pexpect
from package_tools import Git, Layman,\
EmergeLogNamedTask, EmergeLog, GitError, \
PackageInformation
PackageInformation, PackageList
Colors = TextState.Colors
from calculate.lib.utils.files import (getProgPath, STDOUT, removeDir,
@ -225,6 +225,20 @@ class Update:
raise UpdateError(_("Failed to update eix cache"), addon=p.read())
return True
def is_binary_pkg(self, pkg, binary=None):
"""
Является ли пакет бинарным
"""
if binary:
return True
if 'PN' in pkg and pkg['PN'].endswith('-bin'):
return True
if binary is not None:
return binary
if "binary" in pkg and pkg['binary']:
return True
return False
def _printEmergePackage(self, pkg, binary=False, num=1, max_num=1):
self.endTask()
_print = self.color_print
@ -234,7 +248,7 @@ class Update:
part = " (%s of %s)" % (one, two)
else:
part = ""
if binary:
if self.is_binary_pkg(pkg,binary):
_print = _print.foreground(Colors.PURPLE)
else:
_print = _print.foreground(Colors.GREEN)
@ -244,7 +258,7 @@ class Update:
def _printInstallPackage(self, pkg, binary=False):
self.endTask()
_print = self.color_print
if binary:
if self.is_binary_pkg(pkg,binary):
_print = _print.foreground(Colors.PURPLE)
else:
_print = _print.foreground(Colors.GREEN)
@ -276,7 +290,11 @@ class Update:
try:
emerge.run()
except EmergeError:
self.printPre(self._emerge_translate(emerge.emerging_error.log))
if emerge.emerging_error:
self.printPre(
self._emerge_translate(emerge.emerging_error.log))
else:
self.printPre(self._emerge_translate(emerge.prepare_error))
raise
return True
@ -294,7 +312,7 @@ class Update:
if remove_list:
pkgcolor = _print.foreground(remove_color)
else:
if pkg['binary']:
if self.is_binary_pkg(pkg):
pkgcolor = _print.foreground(binary_color)
else:
pkgcolor = _print.foreground(ebuild_color)
@ -304,25 +322,30 @@ class Update:
size = " (%s)" % pkg["SIZE"]
else:
size = ""
self.printDefault(" - {fullname} {shortname}{size}".format(
fullname=fullname, shortname=shortname, size=size))
mult = _print.bold("*")
self.printDefault(" {mult} {fullname} {shortname}{size}".format(
mult=mult, fullname=fullname, shortname=shortname, size=size))
def _display_install_package(self, emerge):
"""
Отобразить список устанавливаемых пакетов
"""
# подробный список пакетов
_print = self.color_print
if self.clVars.Get('cl_verbose_set') == 'on':
self.printPre(str(emerge.install_packages))
else:
_print = self.color_print
pkglist = emerge.install_packages.list
self.printSUCCESS(_print.bold(
self.printSUCCESS(_print(
_("List packages for installation")))
self._display_pretty_package_list(pkglist)
# TODO: список удаляемых пакетов во время установки
if emerge.install_packages.remove_list:
self.printSUCCESS(_print(
_("List removal packages")))
self._display_pretty_package_list(
emerge.install_packages.remove_list, remove_list=True)
if str(emerge.download_size) != "0 kB":
self.printSUCCESS(_print.bold(
self.printSUCCESS(_print(
_("{size} will be downloaded").format(
size=emerge.download_size)))
@ -360,33 +383,14 @@ class Update:
from calculate.update.utils.cl_update import ClUpdateAction
elog = EmergeLog(
EmergeLogNamedTask(ClUpdateAction.log_names['premerge']))
elog.mark_end_task()
elog.mark_end_task(),
def premerge(self, param, *packages):
"""
Вывести информацию об обновлении
"""
class MockEmergeCommand(EmergeCommand):
"""
Заглушка, для выполнения команд
"""
def __init__(self, packages, *args, **kwargs):
EmergeCommand.__init__(self, packages, *args, **kwargs)
def execute(self):
if self.child is None:
filename = '/tmp/mylog.log'
self.child = pexpect.spawn("/bin/cat",
[filename], maxread=20000, searchwindowsize=10000)
if not path.exists(filename):
raise EmergeError(_("File %s not found" % filename))
return self.child
param, packages = self.getCacheOnWorld(param, packages, check=True)
param = [param, "-pv"]
#print "PREMERGE",packages,param
if not packages:
self.printSUCCESS(_("The system is up to date"))
@ -408,43 +412,39 @@ class Update:
self.emerge_cache.drop_cache()
self.printPre(self._emerge_translate(emerge.prepare_error))
raise
return self.askConfirm(
if self.clVars.Get('cl_update_pretend_set') == 'on':
return True
answer = self.askConfirm(
_("Would you like to merge these packages?"), "yes")
if answer == "no":
raise KeyboardInterrupt
return "yes"
return True
def _emerge_translate(self, s):
return RegexpLocalization('cl_emerge').translate(str(s))
def setUpToDateCache(self):
"""
Установить кэш - "нет пакетов для обновления"
"""
self.updateCache(PackageList([]))
return True
def emerge(self, param, *packages):
"""
Выполнить сборку пакета
"""
#TODO: проверить ошибку при depclean
class MockEmergeCommand(EmergeCommand):
"""
Заглушка, для выполнения команд
"""
def __init__(self, packages, *args, **kwargs):
EmergeCommand.__init__(self, packages, *args, **kwargs)
def execute(self):
filename = '/tmp/ppp.log'
if self.child is None:
self.child = pexpect.spawn("/bin/cat",
#['/tmp/emerge.noupdate'])
[filename])
if not path.exists(filename):
raise EmergeError(_("File %s not found" % filename))
return self.child
param, packages = self.getCacheOnWorld(param, packages)
#print "EMERGE",packages,param
ask_emerge = self.clVars.Get('cl_update_precheck_set') == 'off'
if not packages:
return True
packages = [param]
extra_params = None
else:
param, packages = self.getCacheOnWorld(param, packages)
if not packages:
return True
extra_params = [param]
with EmergeParser(EmergeCommand(list(packages),
extra_params=[param])) as emerge:
extra_params=extra_params)) as emerge:
try:
emerge.question.action = lambda x: False
emerge.run()
@ -454,6 +454,7 @@ class Update:
#if ask_emerge:
# self.printPre(str(emerge.install_packages))
except EmergeError:
self.emerge_cache.drop_cache()
self.printPre(self._emerge_translate(emerge.prepare_error))
raise
#if (ask_emerge and self.askConfirm(
@ -467,7 +468,12 @@ class Update:
try:
emerge.run()
except EmergeError as e:
self.printPre(self._emerge_translate(emerge.emerging_error.log))
self.emerge_cache.drop_cache()
if emerge.emerging_error:
self.printPre(
self._emerge_translate(emerge.emerging_error.log))
else:
self.printPre(self._emerge_translate(emerge.prepare_error))
raise
return True

31
update/utils/cl_update.py

@ -69,11 +69,12 @@ class ClUpdateAction(Action):
{'name': 'premerge',
'message': __("Calculating dependencies"),
'method': 'Update.premerge("-uDN","--with-bdeps=y","@world")',
'condition': lambda Get:Get('cl_update_sync_only_set') == 'off'
}],
},
{'name': 'update',
'depend': (Tasks.result("premerge", eq='yes') |
Tasks.hasnot("premerge"))
{'name': 'premerge:update',
'condition': lambda Get:Get('cl_update_pretend_set') == 'off',
'depend': Tasks.result("premerge", eq='yes')
},
{'name': 'update:update_portage',
'group': __("Updating portage"),
@ -138,12 +139,12 @@ class ClUpdateAction(Action):
'group': __("Updating all packages"),
'tasks': [
{'name': 'update:update_world',
'message': __("Updating {0}").format(pkg_color("world")),
'message': __("Calculating dependencies"),
'method': 'Update.emerge("-uDN","--with-bdeps=y","@world")',
},
}
]
},
{'name': 'update:update_world',
{'name': 'update:depclean',
'group': __("Cleaning system from needless packages"),
'tasks': [
{'name': 'update:update_depclean',
@ -183,6 +184,9 @@ class ClUpdateAction(Action):
'method': 'Update.emergelike("revdep-rebuild")',
'condition': was_installed('.*', log_names['revdep']),
'decoration': 'Update.update_task("%s")' % log_names['revdep']
},
{'name': 'update:set_upto_date_cache',
'method': 'Update.setUpToDateCache()'
}
]
},
@ -195,22 +199,19 @@ class ClUpdateAction(Action):
'tasks': [
{'name': 'sync_reps',
'foreach': 'cl_update_sync_rep',
'message': __("Syncing {0} repository").format(
pkg_color("{{eachvar}}")),
'message': __("Syncing {eachvar:capitalize} repository"),
'method': 'Update.syncRepositories(eachvar)',
'condition': lambda Get: Get('cl_update_sync_rep')
},
{'name': 'sync_other_reps',
'foreach': 'cl_update_other_rep_name',
'message': __("Syncing {0} repository").format(
pkg_color("{{eachvar}}")),
'message': __("Syncing {eachvar:capitalize} repository"),
'method': 'Update.syncLaymanRepository(eachvar)',
'condition': lambda Get: Get('cl_update_other_set') == 'on'
},
{'name': 'sync_reps:regen_cache',
'foreach': 'cl_update_sync_overlay_rep',
'message': __("Updating cache {0} repository").format(
pkg_color("{{eachvar}}")),
'message': __("Updating cache {eachvar:capitalize} repository"),
'essential': False,
'method': 'Update.regenCache(eachvar)',
'condition': (
@ -220,8 +221,7 @@ class ClUpdateAction(Action):
},
{'name': 'sync_other_reps:regen_other_cache',
'foreach': 'cl_update_other_rep_name',
'message': __("Updating cache {0} repository").format(
pkg_color("{{eachvar}}")),
'message': __("Updating cache {eachvar:capitalize} repository"),
'method': 'Update.regenCache(eachvar)',
'essential': False,
},
@ -274,7 +274,8 @@ class ClUpdateAction(Action):
# сообщение удачного завершения при обновлении ревизии
{'name': 'success_rev',
'message': __("System update finished!"),
'condition': lambda Get: Get('cl_update_rev_set') == 'on'
'condition': lambda Get: (Get('cl_update_rev_set') == 'on' and
Get('cl_update_pretend_set') == 'off')
},
# сообщение удачного завершения при пересоздании world
{'name': 'success_world',

38
update/variables/update.py

@ -77,14 +77,6 @@ class VariableClUpdateRevSet(Variable):
self.help = _("revision update")
self.label = _("Revision update")
def check(self,value):
if ( value == "off" and self.Get('cl_rebuild_world_set') != 'on' and
not self.Get('cl_update_sync_rep') and
self.Get('cl_update_other_set') == 'off' and
self.Get('cl_update_metadata_force') != "force" and
self.Get('cl_update_eixupdate_force') != "force"):
raise VariableError(_("Select at least one update action"))
class VariableClUpdateRep(Variable):
"""
Обновлять репозитории до конкретной ревизии или до последней
@ -386,14 +378,36 @@ class VariableClUpdateLaymanMake(Variable):
# TODO: извлечь из layman.cfg
value = "/var/lib/layman/make.conf"
class VariableClUpdatePrecheckSet(Variable):
class VariableClUpdatePretendSet(Variable):
"""
Запустить предварительную проверку на обновления
"""
type = "bool"
value = "off"
opt = ["--pre-check"]
opt = ["-p", "--pretend"]
def init(self):
self.label = _("Pretend package update")
self.help = _("instead of actually performing packages update, "
"simply only display what have been installed")
class VariableClUpdateSyncOnlySet(Variable):
"""
Не выполнять установку/обновление пакетов при обновлении
"""
type = "bool"
value = "off"
opt = ["-s","--sync-only"]
def init(self):
self.help = _("Run pre-check updates")
self.label = _("run pre-check updates")
self.label = _("Only synchronize repositories")
self.help = _("do not update packages")
def check(self, value):
if (value == "on" and self.Get('cl_rebuild_world_set') != 'on' and
not self.Get('cl_update_sync_rep') and
self.Get('cl_update_other_set') == 'off' and
self.Get('cl_update_rev_set') == 'off' and
self.Get('cl_update_metadata_force') != "force" and
self.Get('cl_update_eixupdate_force') != "force"):
raise VariableError(_("Select at least one sync repository"))

3
update/wsdl_update.py

@ -67,8 +67,9 @@ class Wsdl(WsdlBase):
'cl_update_sync_rep', 'cl_update_branch',
'cl_update_metadata_force',
'cl_update_other_set',
'cl_update_precheck_set',
'cl_update_pretend_set',
'cl_update_eixupdate_force',
'cl_update_sync_only_set',
'cl_templates_locate',
'cl_verbose_set', 'cl_dispatch_conf'),
next_label=_("Update"))]},

Chargement…
Annuler
Enregistrer