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