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

Исправлен вывод списка пакетов в режиме 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 10 years ago
parent 58123dc8a7
commit 4a67cc8d7e

@ -22,7 +22,7 @@ native_reps=,$(/usr/sbin/cl-core --method core_variables_show \
if echo $native_reps | grep -q ,${repo_name}, if echo $native_reps | grep -q ,${repo_name},
then then
# отбновить репозиторий через утилиты Calculate # отбновить репозиторий через утилиты 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 else
# выполнить обновление через git # выполнить обновление через git
/usr/bin/git $* /usr/bin/git $*

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

@ -661,7 +661,7 @@ class EmergeUpdateInfo(Mapping):
atom_info = r"\S+" atom_info = r"\S+"
use_info = 'USE="[^"]+"' use_info = 'USE="[^"]+"'
prev_version = "\[([^\]]+)\]" prev_version = "\[([^\]]+)\]"
pkg_size = r"\d+ \w+" pkg_size = r"[\d,]+ \w+"
attrs = ['binary', 'REPLACING_VERSIONS', 'SIZE'] attrs = ['binary', 'REPLACING_VERSIONS', 'SIZE']
@ -707,7 +707,9 @@ class EmergeUpdateInfo(Mapping):
return self._package == version return self._package == version
def __contains__(self, item): 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): def __repr__(self):
return "EmergeUpdateInfo(%s/%s,%s)" % ( 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, taskname=self.taskname,
date=datetime.datetime.now().strftime(self.date_format)) 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: class EmergeLog:
@ -902,7 +904,7 @@ class EmergeLog:
def _set_marker(self, text_marker): def _set_marker(self, text_marker):
with open(self.emerge_log, 'a') as f: 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): def mark_begin_task(self):
""" """

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

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

@ -77,14 +77,6 @@ class VariableClUpdateRevSet(Variable):
self.help = _("revision update") self.help = _("revision update")
self.label = _("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): class VariableClUpdateRep(Variable):
""" """
Обновлять репозитории до конкретной ревизии или до последней Обновлять репозитории до конкретной ревизии или до последней
@ -386,14 +378,36 @@ class VariableClUpdateLaymanMake(Variable):
# TODO: извлечь из layman.cfg # TODO: извлечь из layman.cfg
value = "/var/lib/layman/make.conf" value = "/var/lib/layman/make.conf"
class VariableClUpdatePrecheckSet(Variable): class VariableClUpdatePretendSet(Variable):
""" """
Запустить предварительную проверку на обновления Запустить предварительную проверку на обновления
""" """
type = "bool" type = "bool"
value = "off" 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): def init(self):
self.help = _("Run pre-check updates") self.label = _("Only synchronize repositories")
self.label = _("run pre-check updates") 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"))

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

Loading…
Cancel
Save