diff options
Diffstat (limited to 'portage_with_autodep/pym/_emerge/resolver/output_helpers.py')
-rw-r--r-- | portage_with_autodep/pym/_emerge/resolver/output_helpers.py | 142 |
1 files changed, 100 insertions, 42 deletions
diff --git a/portage_with_autodep/pym/_emerge/resolver/output_helpers.py b/portage_with_autodep/pym/_emerge/resolver/output_helpers.py index b7e7376..e751dd8 100644 --- a/portage_with_autodep/pym/_emerge/resolver/output_helpers.py +++ b/portage_with_autodep/pym/_emerge/resolver/output_helpers.py @@ -14,10 +14,10 @@ import sys from portage import os from portage import _encodings, _unicode_encode from portage._sets.base import InternalPackageSet -from portage.output import blue, colorize, create_color_func, green, red, \ - teal, yellow +from portage.output import (blue, bold, colorize, create_color_func, + green, red, teal, yellow) bad = create_color_func("BAD") -from portage.util import writemsg +from portage.util import shlex_split, writemsg from portage.versions import catpkgsplit from _emerge.Blocker import Blocker @@ -39,7 +39,7 @@ class _RepoDisplay(object): repo_paths.add(portdir) overlays = root_config.settings.get("PORTDIR_OVERLAY") if overlays: - repo_paths.update(overlays.split()) + repo_paths.update(shlex_split(overlays)) repo_paths = list(repo_paths) self._repo_paths = repo_paths self._repo_paths_real = [ os.path.realpath(repo_path) \ @@ -198,7 +198,6 @@ class _DisplayConfig(object): self.print_use_string = self.verbosity != 1 or "--verbose" in frozen_config.myopts self.changelog = "--changelog" in frozen_config.myopts self.edebug = frozen_config.edebug - self.no_restart = frozen_config._opts_no_restart.intersection(frozen_config.myopts) self.unordered_display = "--unordered-display" in frozen_config.myopts mywidth = 130 @@ -212,7 +211,8 @@ class _DisplayConfig(object): del e self.columnwidth = mywidth - self.repo_display = _RepoDisplay(frozen_config.roots) + if "--quiet-repo-display" in frozen_config.myopts: + self.repo_display = _RepoDisplay(frozen_config.roots) self.trees = frozen_config.trees self.pkgsettings = frozen_config.pkgsettings self.target_root = frozen_config.target_root @@ -500,63 +500,120 @@ def _calc_changelog(ebuildpath,current,next): next = '-'.join(catpkgsplit(next)[1:]) if next.endswith('-r0'): next = next[:-3] - changelogpath = os.path.join(os.path.split(ebuildpath)[0],'ChangeLog') - try: - changelog = io.open(_unicode_encode(changelogpath, - encoding=_encodings['fs'], errors='strict'), - mode='r', encoding=_encodings['repo.content'], errors='replace' - ).read() - except SystemExit: - raise # Needed else can't exit - except: + + changelogdir = os.path.dirname(ebuildpath) + changelogs = ['ChangeLog'] + # ChangeLog-YYYY (see bug #389611) + changelogs.extend(sorted((fn for fn in os.listdir(changelogdir) + if fn.startswith('ChangeLog-')), reverse=True)) + + divisions = [] + found_current = False + for fn in changelogs: + changelogpath = os.path.join(changelogdir, fn) + try: + with io.open(_unicode_encode(changelogpath, + encoding=_encodings['fs'], errors='strict'), + mode='r', encoding=_encodings['repo.content'], + errors='replace') as f: + changelog = f.read() + except EnvironmentError: + return [] + for node in _find_changelog_tags(changelog): + if node[0] == current: + found_current = True + break + else: + divisions.append(node) + if found_current: + break + + if not found_current: return [] - divisions = _find_changelog_tags(changelog) + #print 'XX from',current,'to',next #for div,text in divisions: print 'XX',div # skip entries for all revisions above the one we are about to emerge - for i in range(len(divisions)): - if divisions[i][0]==next: - divisions = divisions[i:] - break - # find out how many entries we are going to display - for i in range(len(divisions)): - if divisions[i][0]==current: - divisions = divisions[:i] + later_rev_index = None + for i, node in enumerate(divisions): + if node[0] == next: + if later_rev_index is not None: + first_node = divisions[later_rev_index] + # Discard the later revision and the first ChangeLog entry + # that follows it. We want to display all the entries after + # that first entry, as discussed in bug #373009. + trimmed_lines = [] + iterator = iter(first_node[1]) + for l in iterator: + if not l: + # end of the first entry that's discarded + break + first_node = (None, list(iterator)) + divisions = [first_node] + divisions[later_rev_index+1:] break - else: - # couldnt find the current revision in the list. display nothing - return [] - return divisions - + if node[0] is not None: + later_rev_index = i + + output = [] + prev_blank = False + prev_rev = False + for rev, lines in divisions: + if rev is not None: + if not (prev_blank or prev_rev): + output.append("\n") + output.append(bold('*' + rev) + '\n') + prev_rev = True + prev_blank = False + if lines: + prev_rev = False + if not prev_blank: + output.append("\n") + for l in lines: + output.append(l + "\n") + output.append("\n") + prev_blank = True + return output + +def _strip_header_comments(lines): + # strip leading and trailing blank or header/comment lines + i = 0 + while i < len(lines) and (not lines[i] or lines[i][:1] == "#"): + i += 1 + if i: + lines = lines[i:] + while lines and (not lines[-1] or lines[-1][:1] == "#"): + lines.pop() + return lines def _find_changelog_tags(changelog): divs = [] + if not changelog: + return divs release = None - while 1: - match = re.search(r'^\*\ ?([-a-zA-Z0-9_.+]*)(?:\ .*)?\n',changelog,re.M) - if match is None: - if release is not None: - divs.append((release,changelog)) - return divs - if release is not None: - divs.append((release,changelog[:match.start()])) - changelog = changelog[match.end():] + release_end = 0 + for match in re.finditer(r'^\*\ ?([-a-zA-Z0-9_.+]*)(?:\ .*)?$', + changelog, re.M): + divs.append((release, _strip_header_comments( + changelog[release_end:match.start()].splitlines()))) + release_end = match.end() release = match.group(1) if release.endswith('.ebuild'): release = release[:-7] if release.endswith('-r0'): release = release[:-3] + divs.append((release, + _strip_header_comments(changelog[release_end:].splitlines()))) + return divs class PkgInfo(object): """Simple class to hold instance attributes for current information about the pkg being printed. """ - __slots__ = ("ordered", "fetch_symbol", "operation", "merge", - "built", "cp", "ebuild_path", "repo_name", "repo_path_real", - "world", "system", "use", "oldbest", "ver" - ) + __slots__ = ("built", "cp", "ebuild_path", "fetch_symbol", "merge", + "oldbest", "oldbest_list", "operation", "ordered", + "repo_name", "repo_path_real", "system", "use", "ver", "world") def __init__(self): @@ -566,6 +623,7 @@ class PkgInfo(object): self.fetch_symbol = '' self.merge = '' self.oldbest = '' + self.oldbest_list = [] self.operation = '' self.ordered = False self.repo_path_real = '' |