Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] egencache --update-pkg-desc-index: emulate esync --verbose output (bug 737470)
Date: Tue, 01 Sep 2020 08:01:21
Message-Id: 20200901080053.91283-1-zmedico@gentoo.org
1 When the --verbose flag is given, make --update-pkg-desc-index emulate
2 esync --verbose output. Example:
3
4 * Searching for changes
5
6 [ N] acct-group/ultimaker (0): Group for ultimaker
7 [ N] acct-user/ultimaker (0): User for ultimaker
8 [ U] www-client/opera (70.0.3728.144): A fast and secure web browser
9 [MU] www-client/opera-developer (72.0.3798.0): A fast and secure web browser
10 [ U] x11-libs/gtksourceview (4.6.1-r1): A text widget implementing syntax highlighting and other features
11
12 Bug: https://bugs.gentoo.org/737470
13 Signed-off-by: Zac Medico <zmedico@g.o>
14 ---
15 bin/egencache | 68 ++++++++++++++++++++++++++++++++++++++++++++++---
16 man/egencache.1 | 3 +++
17 2 files changed, 67 insertions(+), 4 deletions(-)
18
19 diff --git a/bin/egencache b/bin/egencache
20 index 264c600fe..968d5706f 100755
21 --- a/bin/egencache
22 +++ b/bin/egencache
23 @@ -35,6 +35,7 @@ else:
24
25 signal.signal(debug_signum, debug_signal)
26
27 +import functools
28 import io
29 import logging
30 import subprocess
31 @@ -50,8 +51,9 @@ portage._internal_caller = True
32 from portage import os, _encodings, _unicode_encode, _unicode_decode
33 from _emerge.MetadataRegen import MetadataRegen
34 from portage.cache.cache_errors import CacheError, StatCollision
35 -from portage.cache.index.pkg_desc_index import pkg_desc_index_line_format
36 +from portage.cache.index.pkg_desc_index import pkg_desc_index_line_format, pkg_desc_index_line_read
37 from portage.const import TIMESTAMP_FORMAT
38 +from portage.output import colorize, EOutput
39 from portage.package.ebuild._parallel_manifest.ManifestScheduler import ManifestScheduler
40 from portage.util import cmp_sort_key, writemsg_level
41 from portage.util._async.AsyncFunction import AsyncFunction
42 @@ -131,6 +133,9 @@ def parse_args(args):
43 common.add_argument("--ignore-default-opts",
44 action="store_true",
45 help="do not use the EGENCACHE_DEFAULT_OPTS environment variable")
46 + common.add_argument("-v", "--verbose",
47 + action="count", default=0,
48 + help="increase verbosity")
49 common.add_argument("--write-timestamp",
50 action="store_true",
51 help="write metadata/timestamp.chk as required for rsync repositories")
52 @@ -448,13 +453,26 @@ class GenCache:
53 trg_cache._prune_empty_dirs()
54
55 class GenPkgDescIndex:
56 - def __init__(self, portdb, output_file):
57 + def __init__(self, portdb, output_file, verbose=False):
58 self.returncode = os.EX_OK
59 self._portdb = portdb
60 self._output_file = output_file
61 + self._verbose = verbose
62
63 def run(self):
64
65 + display_updates = self._verbose > 0
66 + old = {}
67 + new = {}
68 + if display_updates:
69 + try:
70 + with open(self._output_file, 'rt', encoding=_encodings["repo.content"]) as f:
71 + for line in f:
72 + pkg_desc = pkg_desc_index_line_read(line)
73 + old[pkg_desc.cp] = pkg_desc
74 + except FileNotFoundError:
75 + pass
76 +
77 portage.util.ensure_dirs(os.path.dirname(self._output_file))
78 f = portage.util.atomic_ofstream(self._output_file,
79 encoding=_encodings["repo.content"])
80 @@ -466,10 +484,51 @@ class GenPkgDescIndex:
81 continue
82 desc, = portdb.aux_get(pkgs[-1], ["DESCRIPTION"])
83
84 - f.write(pkg_desc_index_line_format(cp, pkgs, desc))
85 + line = pkg_desc_index_line_format(cp, pkgs, desc)
86 + f.write(line)
87 + if display_updates:
88 + new[cp] = pkg_desc_index_line_read(line)
89
90 f.close()
91
92 + if display_updates:
93 + out = EOutput()
94 + out.einfo("Searching for changes")
95 + print("")
96 + items = sorted(new.values(), key=lambda pkg_desc: pkg_desc.cp)
97 + haspkgs = False
98 + for pkg_desc in items:
99 + masked = False
100 + version = self._portdb.xmatch("bestmatch-visible", pkg_desc.cp)
101 + if not version:
102 + version = pkg_desc.cpv_list[-1]
103 + masked = True
104 + old_versions = old.get(pkg_desc.cp)
105 + if old_versions is None or version not in old_versions.cpv_list:
106 + prefix0 = " "
107 + prefix1 = " "
108 +
109 + if old_versions is None:
110 + color = functools.partial(colorize, "darkgreen")
111 + prefix1 = "N"
112 + else:
113 + color = functools.partial(colorize, "turquoise")
114 + prefix1 = "U"
115 +
116 + if masked:
117 + prefix0 = "M"
118 +
119 + print(" [%s%s] %s (%s): %s" % (
120 + colorize("red", prefix0),
121 + color(prefix1),
122 + colorize("bold", pkg_desc.cp),
123 + color(version[len(pkg_desc.cp)+1:]),
124 + pkg_desc.desc))
125 + haspkgs = True
126 +
127 + if not haspkgs:
128 + out.einfo("No updates found")
129 +
130 class GenUseLocalDesc:
131 def __init__(self, portdb, output=None,
132 preserve_comments=False):
133 @@ -1053,7 +1112,8 @@ def egencache_main(args):
134 level=logging.WARNING, noiselevel=-1)
135
136 gen_index = GenPkgDescIndex(portdb, os.path.join(
137 - writable_location, "metadata", "pkg_desc_index"))
138 + writable_location, "metadata", "pkg_desc_index"),
139 + verbose=options.verbose)
140 gen_index.run()
141 ret.append(gen_index.returncode)
142
143 diff --git a/man/egencache.1 b/man/egencache.1
144 index 98b230a14..ae7370e21 100644
145 --- a/man/egencache.1
146 +++ b/man/egencache.1
147 @@ -111,6 +111,9 @@ due to invalid Manifest entries.
148 .BR "\-\-use\-local\-desc\-output=ULD_OUTPUT"
149 Output file for use.local.desc data (or '-' for stdout)
150 .TP
151 +.BR \-\-verbose ", " \-v
152 +Increase verbosity.
153 +.TP
154 .BR "\-\-write\-timestamp
155 Write metadata/timestamp.chk as required for rsync repositories
156 .SH "ENVIRONMENT OPTIONS"
157 --
158 2.25.3