1 |
commit: 00bb1df12827cfce898e6fce8514d59a4cc844b1 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Sep 1 06:44:57 2020 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Tue Sep 8 00:35:38 2020 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=00bb1df1 |
7 |
|
8 |
egencache --update-pkg-desc-index: emulate esync --verbose output (bug 737470) |
9 |
|
10 |
When the --verbose flag is given, make --update-pkg-desc-index emulate |
11 |
esync --verbose output. Example: |
12 |
|
13 |
* Searching for changes |
14 |
|
15 |
[ N] acct-group/ultimaker (0): Group for ultimaker |
16 |
[ N] acct-user/ultimaker (0): User for ultimaker |
17 |
[ U] www-client/opera (70.0.3728.144): A fast and secure web browser |
18 |
[MU] www-client/opera-developer (72.0.3798.0): A fast and secure web browser |
19 |
[ U] x11-libs/gtksourceview (4.6.1-r1): A text widget implementing syntax highlighting and other features |
20 |
|
21 |
Bug: https://bugs.gentoo.org/737470 |
22 |
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org> |
23 |
|
24 |
bin/egencache | 76 +++++++++++++++++++++++++++++++++++++++++---- |
25 |
cnf/repo.postsync.d/example | 2 +- |
26 |
man/egencache.1 | 3 ++ |
27 |
3 files changed, 74 insertions(+), 7 deletions(-) |
28 |
|
29 |
diff --git a/bin/egencache b/bin/egencache |
30 |
index 264c600fe..532e37f20 100755 |
31 |
--- a/bin/egencache |
32 |
+++ b/bin/egencache |
33 |
@@ -35,6 +35,7 @@ else: |
34 |
|
35 |
signal.signal(debug_signum, debug_signal) |
36 |
|
37 |
+import functools |
38 |
import io |
39 |
import logging |
40 |
import subprocess |
41 |
@@ -50,8 +51,10 @@ portage._internal_caller = True |
42 |
from portage import os, _encodings, _unicode_encode, _unicode_decode |
43 |
from _emerge.MetadataRegen import MetadataRegen |
44 |
from portage.cache.cache_errors import CacheError, StatCollision |
45 |
-from portage.cache.index.pkg_desc_index import pkg_desc_index_line_format |
46 |
+from portage.cache.index.pkg_desc_index import pkg_desc_index_line_format, pkg_desc_index_line_read |
47 |
from portage.const import TIMESTAMP_FORMAT |
48 |
+from portage.dep import _repo_separator |
49 |
+from portage.output import colorize, EOutput |
50 |
from portage.package.ebuild._parallel_manifest.ManifestScheduler import ManifestScheduler |
51 |
from portage.util import cmp_sort_key, writemsg_level |
52 |
from portage.util._async.AsyncFunction import AsyncFunction |
53 |
@@ -131,6 +134,9 @@ def parse_args(args): |
54 |
common.add_argument("--ignore-default-opts", |
55 |
action="store_true", |
56 |
help="do not use the EGENCACHE_DEFAULT_OPTS environment variable") |
57 |
+ common.add_argument("-v", "--verbose", |
58 |
+ action="count", default=0, |
59 |
+ help="increase verbosity") |
60 |
common.add_argument("--write-timestamp", |
61 |
action="store_true", |
62 |
help="write metadata/timestamp.chk as required for rsync repositories") |
63 |
@@ -448,13 +454,27 @@ class GenCache: |
64 |
trg_cache._prune_empty_dirs() |
65 |
|
66 |
class GenPkgDescIndex: |
67 |
- def __init__(self, portdb, output_file): |
68 |
+ def __init__(self, repo_config, portdb, output_file, verbose=False): |
69 |
self.returncode = os.EX_OK |
70 |
+ self._repo_config = repo_config |
71 |
self._portdb = portdb |
72 |
self._output_file = output_file |
73 |
+ self._verbose = verbose |
74 |
|
75 |
def run(self): |
76 |
|
77 |
+ display_updates = self._verbose > 0 |
78 |
+ old = {} |
79 |
+ new = {} |
80 |
+ if display_updates: |
81 |
+ try: |
82 |
+ with open(self._output_file, 'rt', encoding=_encodings["repo.content"]) as f: |
83 |
+ for line in f: |
84 |
+ pkg_desc = pkg_desc_index_line_read(line) |
85 |
+ old[pkg_desc.cp] = pkg_desc |
86 |
+ except FileNotFoundError: |
87 |
+ pass |
88 |
+ |
89 |
portage.util.ensure_dirs(os.path.dirname(self._output_file)) |
90 |
f = portage.util.atomic_ofstream(self._output_file, |
91 |
encoding=_encodings["repo.content"]) |
92 |
@@ -466,10 +486,52 @@ class GenPkgDescIndex: |
93 |
continue |
94 |
desc, = portdb.aux_get(pkgs[-1], ["DESCRIPTION"]) |
95 |
|
96 |
- f.write(pkg_desc_index_line_format(cp, pkgs, desc)) |
97 |
+ line = pkg_desc_index_line_format(cp, pkgs, desc) |
98 |
+ f.write(line) |
99 |
+ if display_updates: |
100 |
+ new[cp] = pkg_desc_index_line_read(line) |
101 |
|
102 |
f.close() |
103 |
|
104 |
+ if display_updates: |
105 |
+ out = EOutput() |
106 |
+ out.einfo("Searching for changes") |
107 |
+ print("") |
108 |
+ items = sorted(new.values(), key=lambda pkg_desc: pkg_desc.cp) |
109 |
+ haspkgs = False |
110 |
+ for pkg_desc in items: |
111 |
+ masked = False |
112 |
+ version = self._portdb.xmatch("bestmatch-visible", |
113 |
+ Atom("{}{}{}".format(pkg_desc.cp, _repo_separator, self._repo_config.name))) |
114 |
+ if not version: |
115 |
+ version = pkg_desc.cpv_list[-1] |
116 |
+ masked = True |
117 |
+ old_versions = old.get(pkg_desc.cp) |
118 |
+ if old_versions is None or version not in old_versions.cpv_list: |
119 |
+ prefix0 = " " |
120 |
+ prefix1 = " " |
121 |
+ |
122 |
+ if old_versions is None: |
123 |
+ color = functools.partial(colorize, "darkgreen") |
124 |
+ prefix1 = "N" |
125 |
+ else: |
126 |
+ color = functools.partial(colorize, "turquoise") |
127 |
+ prefix1 = "U" |
128 |
+ |
129 |
+ if masked: |
130 |
+ prefix0 = "M" |
131 |
+ |
132 |
+ print(" [%s%s] %s (%s): %s" % ( |
133 |
+ colorize("red", prefix0), |
134 |
+ color(prefix1), |
135 |
+ colorize("bold", pkg_desc.cp), |
136 |
+ color(version[len(pkg_desc.cp)+1:]), |
137 |
+ pkg_desc.desc)) |
138 |
+ haspkgs = True |
139 |
+ |
140 |
+ if not haspkgs: |
141 |
+ out.einfo("No updates found") |
142 |
+ |
143 |
class GenUseLocalDesc: |
144 |
def __init__(self, portdb, output=None, |
145 |
preserve_comments=False): |
146 |
@@ -862,7 +924,8 @@ def egencache_main(args): |
147 |
# completely controlled by commandline arguments. |
148 |
env = {} |
149 |
|
150 |
- if not sys.stdout.isatty(): |
151 |
+ if (not sys.stdout.isatty() or |
152 |
+ os.environ.get('NOCOLOR', '').lower() in ('yes', 'true')): |
153 |
portage.output.nocolor() |
154 |
env['NOCOLOR'] = 'true' |
155 |
|
156 |
@@ -1052,8 +1115,9 @@ def egencache_main(args): |
157 |
writemsg_level(msg, |
158 |
level=logging.WARNING, noiselevel=-1) |
159 |
|
160 |
- gen_index = GenPkgDescIndex(portdb, os.path.join( |
161 |
- writable_location, "metadata", "pkg_desc_index")) |
162 |
+ gen_index = GenPkgDescIndex(repo_config, portdb, os.path.join( |
163 |
+ writable_location, "metadata", "pkg_desc_index"), |
164 |
+ verbose=options.verbose) |
165 |
gen_index.run() |
166 |
ret.append(gen_index.returncode) |
167 |
|
168 |
|
169 |
diff --git a/cnf/repo.postsync.d/example b/cnf/repo.postsync.d/example |
170 |
index 708c7c4b9..d1e385c11 100644 |
171 |
--- a/cnf/repo.postsync.d/example |
172 |
+++ b/cnf/repo.postsync.d/example |
173 |
@@ -52,7 +52,7 @@ if [ -n "${repository_name}" ]; then |
174 |
if [[ ! -e ${repository_path}/metadata/pkg_desc_index || ( |
175 |
-d ${repository_path}/metadata/md5-cache && |
176 |
-n $(find "${repository_path}/metadata/md5-cache" -type f -newer "${repository_path}/metadata/pkg_desc_index" -print -quit) ) ]]; then |
177 |
- if ! egencache --update-pkg-desc-index --repo="${repository_name}" |
178 |
+ if ! egencache --update-pkg-desc-index --repo="${repository_name}" ${PORTAGE_VERBOSE+--verbose} |
179 |
then |
180 |
echo "!!! egencache failed!" |
181 |
ret=1 |
182 |
|
183 |
diff --git a/man/egencache.1 b/man/egencache.1 |
184 |
index 98b230a14..ae7370e21 100644 |
185 |
--- a/man/egencache.1 |
186 |
+++ b/man/egencache.1 |
187 |
@@ -111,6 +111,9 @@ due to invalid Manifest entries. |
188 |
.BR "\-\-use\-local\-desc\-output=ULD_OUTPUT" |
189 |
Output file for use.local.desc data (or '-' for stdout) |
190 |
.TP |
191 |
+.BR \-\-verbose ", " \-v |
192 |
+Increase verbosity. |
193 |
+.TP |
194 |
.BR "\-\-write\-timestamp |
195 |
Write metadata/timestamp.chk as required for rsync repositories |
196 |
.SH "ENVIRONMENT OPTIONS" |