Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r15456 - in main/trunk: bin pym/portage/package/ebuild pym/portage/util
Date: Thu, 25 Feb 2010 19:26:17
Message-Id: E1NkjLg-00085u-An@stork.gentoo.org
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