|
Lines 26-31
Link Here
|
| 26 |
raise AssertionError("ebuild not found for '%s'" % self.pkg.cpv) |
26 |
raise AssertionError("ebuild not found for '%s'" % self.pkg.cpv) |
| 27 |
settings = self.config_pool.allocate() |
27 |
settings = self.config_pool.allocate() |
| 28 |
settings.setcpv(self.pkg) |
28 |
settings.setcpv(self.pkg) |
|
|
29 |
if self.prefetch and \ |
| 30 |
self._prefetch_size_ok(portdb, settings, ebuild_path): |
| 31 |
self.config_pool.deallocate(settings) |
| 32 |
self.returncode = os.EX_OK |
| 33 |
self.wait() |
| 34 |
return |
| 29 |
|
35 |
|
| 30 |
# In prefetch mode, logging goes to emerge-fetch.log and the builddir |
36 |
# In prefetch mode, logging goes to emerge-fetch.log and the builddir |
| 31 |
# should not be touched since otherwise it could interfere with |
37 |
# should not be touched since otherwise it could interfere with |
|
Lines 78-83
Link Here
|
| 78 |
self.config_pool.deallocate(settings) |
84 |
self.config_pool.deallocate(settings) |
| 79 |
SpawnProcess._start(self) |
85 |
SpawnProcess._start(self) |
| 80 |
|
86 |
|
|
|
87 |
def _prefetch_size_ok(self, portdb, settings, ebuild_path): |
| 88 |
pkgdir = os.path.dirname(ebuild_path) |
| 89 |
mytree = os.path.dirname(os.path.dirname(pkgdir)) |
| 90 |
distdir = settings["DISTDIR"] |
| 91 |
use = None |
| 92 |
if not self.fetchall: |
| 93 |
use = frozenset(settings["PORTAGE_USE"].split()) |
| 94 |
|
| 95 |
try: |
| 96 |
uri_map = portdb.getFetchMap(self.pkg.cpv, |
| 97 |
useflags=use, mytree=mytree) |
| 98 |
except portage.exception.InvalidDependString as e: |
| 99 |
return False |
| 100 |
|
| 101 |
sizes = {} |
| 102 |
for filename in uri_map: |
| 103 |
try: |
| 104 |
st = os.lstat(os.path.join(distdir, filename)) |
| 105 |
except OSError: |
| 106 |
return False |
| 107 |
if st.st_size == 0: |
| 108 |
return False |
| 109 |
sizes[filename] = st.st_size |
| 110 |
|
| 111 |
digests = portage.Manifest(pkgdir, distdir).getTypeDigests("DIST") |
| 112 |
for filename, actual_size in sizes.items(): |
| 113 |
size = digests.get(filename, {}).get('size') |
| 114 |
if size is None: |
| 115 |
continue |
| 116 |
if size != actual_size: |
| 117 |
return False |
| 118 |
|
| 119 |
# All files are present and sizes are ok. In this case the normal |
| 120 |
# fetch code will be skipped, so we need to generate equivalent |
| 121 |
# output here. |
| 122 |
if self.logfile is not None: |
| 123 |
f = codecs.open(_unicode_encode(self.logfile, |
| 124 |
encoding=_encodings['fs'], errors='strict'), |
| 125 |
mode='a', encoding=_encodings['content'], errors='replace') |
| 126 |
for filename in uri_map: |
| 127 |
f.write((' * %s size ;-) ...' % \ |
| 128 |
filename).ljust(73) + '[ ok ]\n') |
| 129 |
f.close() |
| 130 |
|
| 131 |
return True |
| 132 |
|
| 81 |
def _pipe(self, fd_pipes): |
133 |
def _pipe(self, fd_pipes): |
| 82 |
"""When appropriate, use a pty so that fetcher progress bars, |
134 |
"""When appropriate, use a pty so that fetcher progress bars, |
| 83 |
like wget has, will work properly.""" |
135 |
like wget has, will work properly.""" |