Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r15454 - in main/trunk: bin pym/_emerge pym/portage pym/portage/package/ebuild pym/portage/util
Date: Thu, 25 Feb 2010 07:58:18
Message-Id: E1NkYbv-0007PZ-Ll@stork.gentoo.org
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