Исправлена работа парсера emerge с использованием --ask.

Добавлен блок skipped packages
develop 3.4.0_beta3
Mike Khiretskiy 9 years ago
parent e3ee99d0c2
commit 23442e2747

@ -326,8 +326,29 @@ class UninstallPackagesBlock(EmergeInformationBlock):
list_block = XmlConverter().transform(self.result).split() list_block = XmlConverter().transform(self.result).split()
self.list = PackageList(map(EmergePackage, list_block)) self.list = PackageList(map(EmergePackage, list_block))
class GroupEmergeInformationBlock(EmergeInformationBlock):
"""
Группа блоков
"""
def get_block(self, child):
self.children_get_block(child)
self.result = True
def children_get_block(self, child):
for block in self.children:
block.get_block(child)
def children_action(self, child):
for block in (x for x in self.children if x.result and x.action):
if block.action(child) is False:
return False
def action(self, child):
self.children_action(child)
return False
class FinishEmergeGroup(EmergeInformationBlock): class FinishEmergeGroup(GroupEmergeInformationBlock):
""" """
Блок завершения команды Блок завершения команды
""" """
@ -350,19 +371,6 @@ class FinishEmergeGroup(EmergeInformationBlock):
else: else:
self.result = True self.result = True
def children_get_block(self, child):
for block in self.children:
block.get_block(child)
def children_action(self, child):
for block in (x for x in self.children if x.result and x.action):
if block.action(child) is False:
break
def action(self, child):
self.children_action(child)
return False
class PrepareErrorBlock(EmergeInformationBlock): class PrepareErrorBlock(EmergeInformationBlock):
""" """
@ -411,21 +419,89 @@ class DownloadSizeBlock(EmergeInformationBlock):
else: else:
return "0 kB" return "0 kB"
class SkippedPackagesBlock(EmergeInformationBlock):
"""
Размер скачиваемых обновлений
"""
token = "The following update has been skipped"
end_token = ["For more information, see the MASKED"]
class QuestionBlock(EmergeInformationBlock): re_block = re.compile(
r"(The following update has.*?)(?=For more information)", re.S)
def __str__(self):
if self.result:
return self.result
else:
return ""
class QuestionGroup(GroupEmergeInformationBlock):
""" """
Блок вопроса Группа блоков разбора вопросов от emerge
""" """
default_answer = "yes"
_color_block = EmergeInformationBlock._color_block
token = "Would you like" token = "Would you like"
end_token = ["]", "\n"] end_token = ["]", "\n"]
_color_block = EmergeInformationBlock._color_block
re_block = re.compile( re_block = re.compile(
"(Would you.*)\[{c}Yes{c}/{c}No{c}".format(c=_color_block)) "(Would you.*)\[{c}Yes{c}/{c}No{c}".format(c=_color_block))
def get_block(self, child):
try:
before = child.before
token = child.match
if type(self.end_token) == self.re_type:
child.expect(self.end_token)
match = child.match.group()
else:
child.expect_exact(self.end_token)
match = child.match
data = token + child.before + match
#self.get_data(before + data)
child.before = before
for block in self.children:
child.match = re.search(block.token, data)
block.get_block(child)
if block.result:
break
except pexpect.EOF:
child.buffer = "".join(
[x for x in (child.before, child.after, child.buffer)
if type(x) == str])
class QuestionChangeConfigBlock(GroupEmergeInformationBlock):
"""
Вопрос об изменении конфигурационных файлов
"""
token = "Would you like to add these changes to your config files"
def get_block(self, child):
if child.match:
self.result = self.token
self.children_get_block(child)
def action(self, child):
if self.result:
child.send("no\n")
if child.isalive():
child.wait()
self.children_action(child)
class QuestionBlock(EmergeInformationBlock):
"""
Блок вопроса
"""
default_answer = "yes"
token = "Would you"
def get_block(self, child):
if child.match:
self.result = self.token
def action(self, child): def action(self, child):
if self.result: if self.result:
child.send("%s\n" % self.default_answer) child.send("%s\n" % self.default_answer)
return False
class NeedRootBlock(EmergeInformationBlock): class NeedRootBlock(EmergeInformationBlock):
@ -604,11 +680,16 @@ class EmergeParser(object):
self.install_packages = InstallPackagesBlock(self) self.install_packages = InstallPackagesBlock(self)
self.uninstall_packages = UninstallPackagesBlock(self) self.uninstall_packages = UninstallPackagesBlock(self)
self.question = QuestionBlock(self) self.question_group = QuestionGroup(self)
self.change_config_question = QuestionChangeConfigBlock(
self.question_group)
self.question = QuestionBlock(self.question_group)
self.finish_block = FinishEmergeGroup(self) self.finish_block = FinishEmergeGroup(self)
self.need_root = NeedRootBlock(self) self.need_root = NeedRootBlock(self)
self.prepare_error = PrepareErrorBlock(self.finish_block) self.prepare_error = PrepareErrorBlock(self.finish_block)
self.change_config_question.add_element(self.prepare_error)
self.download_size = DownloadSizeBlock(self) self.download_size = DownloadSizeBlock(self)
self.skipped_packages = SkippedPackagesBlock(self)
self.emerging_error = EmergeingErrorBlock(self) self.emerging_error = EmergeingErrorBlock(self)
self.installing = InstallingPackage(self) self.installing = InstallingPackage(self)

@ -773,6 +773,8 @@ class Update(object):
return True return True
emergelike = self.clVars.Get('cl_update_emergelist_set') == 'on' emergelike = self.clVars.Get('cl_update_emergelist_set') == 'on'
self._display_install_package(emerge, emergelike) self._display_install_package(emerge, emergelike)
if str(emerge.skipped_packages):
self._display_error(emerge.skipped_packages)
except EmergeError: except EmergeError:
self.set_need_update(False) self.set_need_update(False)
self.emerge_cache.drop_cache("Emerge error") self.emerge_cache.drop_cache("Emerge error")

Loading…
Cancel
Save