1 |
Author: zmedico |
2 |
Date: 2010-02-25 07:58:15 +0000 (Thu, 25 Feb 2010) |
3 |
New Revision: 15454 |
4 |
|
5 |
Added: |
6 |
main/trunk/pym/portage/util/digestgen.py |
7 |
Modified: |
8 |
main/trunk/bin/repoman |
9 |
main/trunk/pym/_emerge/Scheduler.py |
10 |
main/trunk/pym/portage/__init__.py |
11 |
main/trunk/pym/portage/package/ebuild/doebuild.py |
12 |
Log: |
13 |
Move digestgen to portage.util.digestgen. |
14 |
|
15 |
|
16 |
Modified: main/trunk/bin/repoman |
17 |
=================================================================== |
18 |
--- main/trunk/bin/repoman 2010-02-25 07:33:32 UTC (rev 15453) |
19 |
+++ main/trunk/bin/repoman 2010-02-25 07:58:15 UTC (rev 15454) |
20 |
@@ -77,6 +77,7 @@ |
21 |
green, nocolor, red, turquoise, yellow |
22 |
from portage.output import ConsoleStyleFile, StyleWriter |
23 |
from portage.util import cmp_sort_key, writemsg_level |
24 |
+from portage.util.digestgen import digestgen |
25 |
|
26 |
if sys.hexversion >= 0x3000000: |
27 |
basestring = str |
28 |
@@ -1011,7 +1012,7 @@ |
29 |
portage._doebuild_manifest_exempt_depend -= 1 |
30 |
|
31 |
repoman_settings["O"] = checkdir |
32 |
- if not portage.digestgen(mysettings=repoman_settings, myportdb=portdb): |
33 |
+ if not digestgen(mysettings=repoman_settings, myportdb=portdb): |
34 |
print("Unable to generate manifest.") |
35 |
dofail = 1 |
36 |
if options.mode == "manifest": |
37 |
@@ -2335,7 +2336,7 @@ |
38 |
mydone=[] |
39 |
if repolevel==3: # In a package dir |
40 |
repoman_settings["O"] = startdir |
41 |
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb) |
42 |
+ digestgen(mysettings=repoman_settings, myportdb=portdb) |
43 |
elif repolevel==2: # In a category dir |
44 |
for x in myfiles: |
45 |
xs=x.split("/") |
46 |
@@ -2349,7 +2350,7 @@ |
47 |
repoman_settings["O"] = os.path.join(startdir, xs[0]) |
48 |
if not os.path.isdir(repoman_settings["O"]): |
49 |
continue |
50 |
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb) |
51 |
+ digestgen(mysettings=repoman_settings, myportdb=portdb) |
52 |
elif repolevel==1: # repo-cvsroot |
53 |
print(green("RepoMan sez:"), "\"You're rather crazy... doing the entire repository.\"\n") |
54 |
for x in myfiles: |
55 |
@@ -2364,7 +2365,7 @@ |
56 |
repoman_settings["O"] = os.path.join(startdir, xs[0], xs[1]) |
57 |
if not os.path.isdir(repoman_settings["O"]): |
58 |
continue |
59 |
- portage.digestgen(mysettings=repoman_settings, myportdb=portdb) |
60 |
+ digestgen(mysettings=repoman_settings, myportdb=portdb) |
61 |
else: |
62 |
print(red("I'm confused... I don't know where I am!")) |
63 |
sys.exit(1) |
64 |
|
65 |
Modified: main/trunk/pym/_emerge/Scheduler.py |
66 |
=================================================================== |
67 |
--- main/trunk/pym/_emerge/Scheduler.py 2010-02-25 07:33:32 UTC (rev 15453) |
68 |
+++ main/trunk/pym/_emerge/Scheduler.py 2010-02-25 07:58:15 UTC (rev 15454) |
69 |
@@ -24,6 +24,7 @@ |
70 |
from portage.sets import SETPREFIX |
71 |
from portage.sets.base import InternalPackageSet |
72 |
from portage.util import writemsg, writemsg_level |
73 |
+from portage.util.digestgen import digestgen |
74 |
|
75 |
from _emerge.BinpkgPrefetcher import BinpkgPrefetcher |
76 |
from _emerge.Blocker import Blocker |
77 |
@@ -591,7 +592,7 @@ |
78 |
if ebuild_path is None: |
79 |
raise AssertionError("ebuild not found for '%s'" % x.cpv) |
80 |
pkgsettings['O'] = os.path.dirname(ebuild_path) |
81 |
- if not portage.digestgen(mysettings=pkgsettings, myportdb=portdb): |
82 |
+ if not digestgen(mysettings=pkgsettings, myportdb=portdb): |
83 |
writemsg_level( |
84 |
"!!! Unable to generate manifest for '%s'.\n" \ |
85 |
% x.cpv, level=logging.ERROR, noiselevel=-1) |
86 |
|
87 |
Modified: main/trunk/pym/portage/__init__.py |
88 |
=================================================================== |
89 |
--- main/trunk/pym/portage/__init__.py 2010-02-25 07:33:32 UTC (rev 15453) |
90 |
+++ main/trunk/pym/portage/__init__.py 2010-02-25 07:58:15 UTC (rev 15454) |
91 |
@@ -119,6 +119,7 @@ |
92 |
'pickle_read,pickle_write,stack_dictlist,stack_dicts,' + \ |
93 |
'stack_lists,unique_array,varexpand,writedict,writemsg,' + \ |
94 |
'writemsg_stdout,write_atomic', |
95 |
+ 'portage.util.digestgen:digestgen', |
96 |
'portage.util.digraph:digraph', |
97 |
'portage.util.env_update:env_update', |
98 |
'portage.util.ExtractKernelVersion:ExtractKernelVersion', |
99 |
@@ -536,185 +537,6 @@ |
100 |
|
101 |
_doebuild_manifest_exempt_depend = 0 |
102 |
|
103 |
-def digestgen(myarchives=None, mysettings=None, |
104 |
- overwrite=None, manifestonly=None, myportdb=None): |
105 |
- """ |
106 |
- Generates a digest file if missing. Fetches files if necessary. |
107 |
- NOTE: myarchives and mysettings used to be positional arguments, |
108 |
- so their order must be preserved for backward compatibility. |
109 |
- @param mysettings: the ebuild config (mysettings["O"] must correspond |
110 |
- to the ebuild's parent directory) |
111 |
- @type mysettings: config |
112 |
- @param myportdb: a portdbapi instance |
113 |
- @type myportdb: portdbapi |
114 |
- @rtype: int |
115 |
- @returns: 1 on success and 0 on failure |
116 |
- """ |
117 |
- if mysettings is None: |
118 |
- raise TypeError("portage.digestgen(): missing" + \ |
119 |
- " required 'mysettings' parameter") |
120 |
- if myportdb is None: |
121 |
- warnings.warn("portage.digestgen() called without 'myportdb' parameter", |
122 |
- DeprecationWarning, stacklevel=2) |
123 |
- global portdb |
124 |
- myportdb = portdb |
125 |
- if overwrite is not None: |
126 |
- warnings.warn("portage.digestgen() called with " + \ |
127 |
- "deprecated 'overwrite' parameter", |
128 |
- DeprecationWarning, stacklevel=2) |
129 |
- if manifestonly is not None: |
130 |
- warnings.warn("portage.digestgen() called with " + \ |
131 |
- "deprecated 'manifestonly' parameter", |
132 |
- DeprecationWarning, stacklevel=2) |
133 |
- global _doebuild_manifest_exempt_depend |
134 |
- try: |
135 |
- _doebuild_manifest_exempt_depend += 1 |
136 |
- distfiles_map = {} |
137 |
- fetchlist_dict = FetchlistDict(mysettings["O"], mysettings, myportdb) |
138 |
- for cpv in fetchlist_dict: |
139 |
- try: |
140 |
- for myfile in fetchlist_dict[cpv]: |
141 |
- distfiles_map.setdefault(myfile, []).append(cpv) |
142 |
- except portage.exception.InvalidDependString as e: |
143 |
- writemsg("!!! %s\n" % str(e), noiselevel=-1) |
144 |
- del e |
145 |
- return 0 |
146 |
- mytree = os.path.dirname(os.path.dirname(mysettings["O"])) |
147 |
- manifest1_compat = False |
148 |
- mf = Manifest(mysettings["O"], mysettings["DISTDIR"], |
149 |
- fetchlist_dict=fetchlist_dict, manifest1_compat=manifest1_compat) |
150 |
- # Don't require all hashes since that can trigger excessive |
151 |
- # fetches when sufficient digests already exist. To ease transition |
152 |
- # while Manifest 1 is being removed, only require hashes that will |
153 |
- # exist before and after the transition. |
154 |
- required_hash_types = set() |
155 |
- required_hash_types.add("size") |
156 |
- required_hash_types.add(portage.const.MANIFEST2_REQUIRED_HASH) |
157 |
- dist_hashes = mf.fhashdict.get("DIST", {}) |
158 |
- |
159 |
- # To avoid accidental regeneration of digests with the incorrect |
160 |
- # files (such as partially downloaded files), trigger the fetch |
161 |
- # code if the file exists and it's size doesn't match the current |
162 |
- # manifest entry. If there really is a legitimate reason for the |
163 |
- # digest to change, `ebuild --force digest` can be used to avoid |
164 |
- # triggering this code (or else the old digests can be manually |
165 |
- # removed from the Manifest). |
166 |
- missing_files = [] |
167 |
- for myfile in distfiles_map: |
168 |
- myhashes = dist_hashes.get(myfile) |
169 |
- if not myhashes: |
170 |
- try: |
171 |
- st = os.stat(os.path.join(mysettings["DISTDIR"], myfile)) |
172 |
- except OSError: |
173 |
- st = None |
174 |
- if st is None or st.st_size == 0: |
175 |
- missing_files.append(myfile) |
176 |
- continue |
177 |
- size = myhashes.get("size") |
178 |
- |
179 |
- try: |
180 |
- st = os.stat(os.path.join(mysettings["DISTDIR"], myfile)) |
181 |
- except OSError as e: |
182 |
- if e.errno != errno.ENOENT: |
183 |
- raise |
184 |
- del e |
185 |
- if size == 0: |
186 |
- missing_files.append(myfile) |
187 |
- continue |
188 |
- if required_hash_types.difference(myhashes): |
189 |
- missing_files.append(myfile) |
190 |
- continue |
191 |
- else: |
192 |
- if st.st_size == 0 or size is not None and size != st.st_size: |
193 |
- missing_files.append(myfile) |
194 |
- continue |
195 |
- |
196 |
- if missing_files: |
197 |
- mytree = os.path.realpath(os.path.dirname( |
198 |
- os.path.dirname(mysettings["O"]))) |
199 |
- fetch_settings = config(clone=mysettings) |
200 |
- debug = mysettings.get("PORTAGE_DEBUG") == "1" |
201 |
- for myfile in missing_files: |
202 |
- uris = set() |
203 |
- for cpv in distfiles_map[myfile]: |
204 |
- myebuild = os.path.join(mysettings["O"], |
205 |
- catsplit(cpv)[1] + ".ebuild") |
206 |
- # for RESTRICT=fetch, mirror, etc... |
207 |
- doebuild_environment(myebuild, "fetch", |
208 |
- mysettings["ROOT"], fetch_settings, |
209 |
- debug, 1, myportdb) |
210 |
- uris.update(myportdb.getFetchMap( |
211 |
- cpv, mytree=mytree)[myfile]) |
212 |
- |
213 |
- fetch_settings["A"] = myfile # for use by pkg_nofetch() |
214 |
- |
215 |
- try: |
216 |
- st = os.stat(os.path.join( |
217 |
- mysettings["DISTDIR"],myfile)) |
218 |
- except OSError: |
219 |
- st = None |
220 |
- |
221 |
- if not fetch({myfile : uris}, fetch_settings): |
222 |
- writemsg(_("!!! Fetch failed for %s, can't update " |
223 |
- "Manifest\n") % myfile, noiselevel=-1) |
224 |
- if myfile in dist_hashes and \ |
225 |
- st is not None and st.st_size > 0: |
226 |
- # stat result is obtained before calling fetch(), |
227 |
- # since fetch may rename the existing file if the |
228 |
- # digest does not match. |
229 |
- writemsg(_("!!! If you would like to " |
230 |
- "forcefully replace the existing " |
231 |
- "Manifest entry\n!!! for %s, use " |
232 |
- "the following command:\n") % myfile + \ |
233 |
- "!!! " + colorize("INFORM", |
234 |
- "ebuild --force %s manifest" % \ |
235 |
- os.path.basename(myebuild)) + "\n", |
236 |
- noiselevel=-1) |
237 |
- return 0 |
238 |
- writemsg_stdout(_(">>> Creating Manifest for %s\n") % mysettings["O"]) |
239 |
- try: |
240 |
- mf.create(assumeDistHashesSometimes=True, |
241 |
- assumeDistHashesAlways=( |
242 |
- "assume-digests" in mysettings.features)) |
243 |
- except portage.exception.FileNotFound as e: |
244 |
- writemsg(_("!!! File %s doesn't exist, can't update " |
245 |
- "Manifest\n") % e, noiselevel=-1) |
246 |
- return 0 |
247 |
- except portage.exception.PortagePackageException as e: |
248 |
- writemsg(("!!! %s\n") % (e,), noiselevel=-1) |
249 |
- return 0 |
250 |
- try: |
251 |
- mf.write(sign=False) |
252 |
- except portage.exception.PermissionDenied as e: |
253 |
- writemsg(_("!!! Permission Denied: %s\n") % (e,), noiselevel=-1) |
254 |
- return 0 |
255 |
- if "assume-digests" not in mysettings.features: |
256 |
- distlist = list(mf.fhashdict.get("DIST", {})) |
257 |
- distlist.sort() |
258 |
- auto_assumed = [] |
259 |
- for filename in distlist: |
260 |
- if not os.path.exists( |
261 |
- os.path.join(mysettings["DISTDIR"], filename)): |
262 |
- auto_assumed.append(filename) |
263 |
- if auto_assumed: |
264 |
- mytree = os.path.realpath( |
265 |
- os.path.dirname(os.path.dirname(mysettings["O"]))) |
266 |
- cp = os.path.sep.join(mysettings["O"].split(os.path.sep)[-2:]) |
267 |
- pkgs = myportdb.cp_list(cp, mytree=mytree) |
268 |
- pkgs.sort() |
269 |
- writemsg_stdout(" digest.assumed" + portage.output.colorize("WARN", |
270 |
- str(len(auto_assumed)).rjust(18)) + "\n") |
271 |
- for pkg_key in pkgs: |
272 |
- fetchlist = myportdb.getFetchMap(pkg_key, mytree=mytree) |
273 |
- pv = pkg_key.split("/")[1] |
274 |
- for filename in auto_assumed: |
275 |
- if filename in fetchlist: |
276 |
- writemsg_stdout( |
277 |
- " %s::%s\n" % (pv, filename)) |
278 |
- return 1 |
279 |
- finally: |
280 |
- _doebuild_manifest_exempt_depend -= 1 |
281 |
- |
282 |
def digestParseFile(myfilename, mysettings=None): |
283 |
"""(filename) -- Parses a given file for entries matching: |
284 |
<checksumkey> <checksum_hex_string> <filename> <filesize> |
285 |
|
286 |
Modified: main/trunk/pym/portage/package/ebuild/doebuild.py |
287 |
=================================================================== |
288 |
--- main/trunk/pym/portage/package/ebuild/doebuild.py 2010-02-25 07:33:32 UTC (rev 15453) |
289 |
+++ main/trunk/pym/portage/package/ebuild/doebuild.py 2010-02-25 07:58:15 UTC (rev 15454) |
290 |
@@ -21,11 +21,12 @@ |
291 |
import portage |
292 |
portage.proxy.lazyimport.lazyimport(globals(), |
293 |
'portage.package.ebuild.config:check_config_instance', |
294 |
+ 'portage.util.digestgen:digestgen', |
295 |
'portage.util.ExtractKernelVersion:ExtractKernelVersion' |
296 |
) |
297 |
|
298 |
from portage import auxdbkeys, bsd_chflags, dep_check, digestcheck, \ |
299 |
- digestgen, eapi_is_supported, merge, os, selinux, StringIO, \ |
300 |
+ eapi_is_supported, merge, os, selinux, StringIO, \ |
301 |
unmerge, _encodings, _parse_eapi_ebuild_head, _os_merge, \ |
302 |
_shell_quote, _split_ebuild_name_glep55, _unicode_decode, _unicode_encode |
303 |
from portage.const import EBUILD_SH_ENV_FILE, EBUILD_SH_BINARY, \ |
304 |
|
305 |
Added: main/trunk/pym/portage/util/digestgen.py |
306 |
=================================================================== |
307 |
--- main/trunk/pym/portage/util/digestgen.py (rev 0) |
308 |
+++ main/trunk/pym/portage/util/digestgen.py 2010-02-25 07:58:15 UTC (rev 15454) |
309 |
@@ -0,0 +1,204 @@ |
310 |
+# Copyright 2010 Gentoo Foundation |
311 |
+# Distributed under the terms of the GNU General Public License v2 |
312 |
+# $Id$ |
313 |
+ |
314 |
+__all__ = ['digestgen'] |
315 |
+ |
316 |
+import errno |
317 |
+import warnings |
318 |
+ |
319 |
+import portage |
320 |
+portage.proxy.lazyimport.lazyimport(globals(), |
321 |
+ 'portage.package.ebuild.doebuild:doebuild_environment', |
322 |
+) |
323 |
+ |
324 |
+from portage import os |
325 |
+from portage.const import MANIFEST2_REQUIRED_HASH |
326 |
+from portage.dbapi.porttree import FetchlistDict |
327 |
+from portage.exception import InvalidDependString, FileNotFound, \ |
328 |
+ PermissionDenied, PortagePackageException |
329 |
+from portage.localization import _ |
330 |
+from portage.manifest import Manifest |
331 |
+from portage.output import colorize |
332 |
+from portage.package.ebuild.config import config |
333 |
+from portage.package.ebuild.fetch import fetch |
334 |
+from portage.util import writemsg, writemsg_stdout |
335 |
+from portage.versions import catsplit |
336 |
+ |
337 |
+def digestgen(myarchives=None, mysettings=None, |
338 |
+ overwrite=None, manifestonly=None, myportdb=None): |
339 |
+ """ |
340 |
+ Generates a digest file if missing. Fetches files if necessary. |
341 |
+ NOTE: myarchives and mysettings used to be positional arguments, |
342 |
+ so their order must be preserved for backward compatibility. |
343 |
+ @param mysettings: the ebuild config (mysettings["O"] must correspond |
344 |
+ to the ebuild's parent directory) |
345 |
+ @type mysettings: config |
346 |
+ @param myportdb: a portdbapi instance |
347 |
+ @type myportdb: portdbapi |
348 |
+ @rtype: int |
349 |
+ @returns: 1 on success and 0 on failure |
350 |
+ """ |
351 |
+ if mysettings is None: |
352 |
+ raise TypeError("portage.digestgen(): missing" + \ |
353 |
+ " required 'mysettings' parameter") |
354 |
+ if myportdb is None: |
355 |
+ warnings.warn("portage.digestgen() called without 'myportdb' parameter", |
356 |
+ DeprecationWarning, stacklevel=2) |
357 |
+ myportdb = portage.portdb |
358 |
+ if overwrite is not None: |
359 |
+ warnings.warn("portage.digestgen() called with " + \ |
360 |
+ "deprecated 'overwrite' parameter", |
361 |
+ DeprecationWarning, stacklevel=2) |
362 |
+ if manifestonly is not None: |
363 |
+ warnings.warn("portage.digestgen() called with " + \ |
364 |
+ "deprecated 'manifestonly' parameter", |
365 |
+ DeprecationWarning, stacklevel=2) |
366 |
+ |
367 |
+ try: |
368 |
+ portage._doebuild_manifest_exempt_depend += 1 |
369 |
+ distfiles_map = {} |
370 |
+ fetchlist_dict = FetchlistDict(mysettings["O"], mysettings, myportdb) |
371 |
+ for cpv in fetchlist_dict: |
372 |
+ try: |
373 |
+ for myfile in fetchlist_dict[cpv]: |
374 |
+ distfiles_map.setdefault(myfile, []).append(cpv) |
375 |
+ except InvalidDependString as e: |
376 |
+ writemsg("!!! %s\n" % str(e), noiselevel=-1) |
377 |
+ del e |
378 |
+ return 0 |
379 |
+ mytree = os.path.dirname(os.path.dirname(mysettings["O"])) |
380 |
+ manifest1_compat = False |
381 |
+ mf = Manifest(mysettings["O"], mysettings["DISTDIR"], |
382 |
+ fetchlist_dict=fetchlist_dict, manifest1_compat=manifest1_compat) |
383 |
+ # Don't require all hashes since that can trigger excessive |
384 |
+ # fetches when sufficient digests already exist. To ease transition |
385 |
+ # while Manifest 1 is being removed, only require hashes that will |
386 |
+ # exist before and after the transition. |
387 |
+ required_hash_types = set() |
388 |
+ required_hash_types.add("size") |
389 |
+ required_hash_types.add(MANIFEST2_REQUIRED_HASH) |
390 |
+ dist_hashes = mf.fhashdict.get("DIST", {}) |
391 |
+ |
392 |
+ # To avoid accidental regeneration of digests with the incorrect |
393 |
+ # files (such as partially downloaded files), trigger the fetch |
394 |
+ # code if the file exists and it's size doesn't match the current |
395 |
+ # manifest entry. If there really is a legitimate reason for the |
396 |
+ # digest to change, `ebuild --force digest` can be used to avoid |
397 |
+ # triggering this code (or else the old digests can be manually |
398 |
+ # removed from the Manifest). |
399 |
+ missing_files = [] |
400 |
+ for myfile in distfiles_map: |
401 |
+ myhashes = dist_hashes.get(myfile) |
402 |
+ if not myhashes: |
403 |
+ try: |
404 |
+ st = os.stat(os.path.join(mysettings["DISTDIR"], myfile)) |
405 |
+ except OSError: |
406 |
+ st = None |
407 |
+ if st is None or st.st_size == 0: |
408 |
+ missing_files.append(myfile) |
409 |
+ continue |
410 |
+ size = myhashes.get("size") |
411 |
+ |
412 |
+ try: |
413 |
+ st = os.stat(os.path.join(mysettings["DISTDIR"], myfile)) |
414 |
+ except OSError as e: |
415 |
+ if e.errno != errno.ENOENT: |
416 |
+ raise |
417 |
+ del e |
418 |
+ if size == 0: |
419 |
+ missing_files.append(myfile) |
420 |
+ continue |
421 |
+ if required_hash_types.difference(myhashes): |
422 |
+ missing_files.append(myfile) |
423 |
+ continue |
424 |
+ else: |
425 |
+ if st.st_size == 0 or size is not None and size != st.st_size: |
426 |
+ missing_files.append(myfile) |
427 |
+ continue |
428 |
+ |
429 |
+ if missing_files: |
430 |
+ mytree = os.path.realpath(os.path.dirname( |
431 |
+ os.path.dirname(mysettings["O"]))) |
432 |
+ fetch_settings = config(clone=mysettings) |
433 |
+ debug = mysettings.get("PORTAGE_DEBUG") == "1" |
434 |
+ for myfile in missing_files: |
435 |
+ uris = set() |
436 |
+ for cpv in distfiles_map[myfile]: |
437 |
+ myebuild = os.path.join(mysettings["O"], |
438 |
+ catsplit(cpv)[1] + ".ebuild") |
439 |
+ # for RESTRICT=fetch, mirror, etc... |
440 |
+ doebuild_environment(myebuild, "fetch", |
441 |
+ mysettings["ROOT"], fetch_settings, |
442 |
+ debug, 1, myportdb) |
443 |
+ uris.update(myportdb.getFetchMap( |
444 |
+ cpv, mytree=mytree)[myfile]) |
445 |
+ |
446 |
+ fetch_settings["A"] = myfile # for use by pkg_nofetch() |
447 |
+ |
448 |
+ try: |
449 |
+ st = os.stat(os.path.join( |
450 |
+ mysettings["DISTDIR"],myfile)) |
451 |
+ except OSError: |
452 |
+ st = None |
453 |
+ |
454 |
+ if not fetch({myfile : uris}, fetch_settings): |
455 |
+ writemsg(_("!!! Fetch failed for %s, can't update " |
456 |
+ "Manifest\n") % myfile, noiselevel=-1) |
457 |
+ if myfile in dist_hashes and \ |
458 |
+ st is not None and st.st_size > 0: |
459 |
+ # stat result is obtained before calling fetch(), |
460 |
+ # since fetch may rename the existing file if the |
461 |
+ # digest does not match. |
462 |
+ writemsg(_("!!! If you would like to " |
463 |
+ "forcefully replace the existing " |
464 |
+ "Manifest entry\n!!! for %s, use " |
465 |
+ "the following command:\n") % myfile + \ |
466 |
+ "!!! " + colorize("INFORM", |
467 |
+ "ebuild --force %s manifest" % \ |
468 |
+ os.path.basename(myebuild)) + "\n", |
469 |
+ noiselevel=-1) |
470 |
+ return 0 |
471 |
+ writemsg_stdout(_(">>> Creating Manifest for %s\n") % mysettings["O"]) |
472 |
+ try: |
473 |
+ mf.create(assumeDistHashesSometimes=True, |
474 |
+ assumeDistHashesAlways=( |
475 |
+ "assume-digests" in mysettings.features)) |
476 |
+ except FileNotFound as e: |
477 |
+ writemsg(_("!!! File %s doesn't exist, can't update " |
478 |
+ "Manifest\n") % e, noiselevel=-1) |
479 |
+ return 0 |
480 |
+ except PortagePackageException as e: |
481 |
+ writemsg(("!!! %s\n") % (e,), noiselevel=-1) |
482 |
+ return 0 |
483 |
+ try: |
484 |
+ mf.write(sign=False) |
485 |
+ except PermissionDenied as e: |
486 |
+ writemsg(_("!!! Permission Denied: %s\n") % (e,), noiselevel=-1) |
487 |
+ return 0 |
488 |
+ if "assume-digests" not in mysettings.features: |
489 |
+ distlist = list(mf.fhashdict.get("DIST", {})) |
490 |
+ distlist.sort() |
491 |
+ auto_assumed = [] |
492 |
+ for filename in distlist: |
493 |
+ if not os.path.exists( |
494 |
+ os.path.join(mysettings["DISTDIR"], filename)): |
495 |
+ auto_assumed.append(filename) |
496 |
+ if auto_assumed: |
497 |
+ mytree = os.path.realpath( |
498 |
+ os.path.dirname(os.path.dirname(mysettings["O"]))) |
499 |
+ cp = os.path.sep.join(mysettings["O"].split(os.path.sep)[-2:]) |
500 |
+ pkgs = myportdb.cp_list(cp, mytree=mytree) |
501 |
+ pkgs.sort() |
502 |
+ writemsg_stdout(" digest.assumed" + colorize("WARN", |
503 |
+ str(len(auto_assumed)).rjust(18)) + "\n") |
504 |
+ for pkg_key in pkgs: |
505 |
+ fetchlist = myportdb.getFetchMap(pkg_key, mytree=mytree) |
506 |
+ pv = pkg_key.split("/")[1] |
507 |
+ for filename in auto_assumed: |
508 |
+ if filename in fetchlist: |
509 |
+ writemsg_stdout( |
510 |
+ " %s::%s\n" % (pv, filename)) |
511 |
+ return 1 |
512 |
+ finally: |
513 |
+ portage._doebuild_manifest_exempt_depend -= 1 |
514 |
|
515 |
|
516 |
Property changes on: main/trunk/pym/portage/util/digestgen.py |
517 |
___________________________________________________________________ |
518 |
Added: svn:keywords |
519 |
+ Id |