diff options
author | Zac Medico <zmedico@gentoo.org> | 2007-07-30 05:13:31 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2007-07-30 05:13:31 +0000 |
commit | 78b8dc75cda318572cb9f3ad8595b2a9222a6e85 (patch) | |
tree | 1d17760acc654c61c6a78c9b0c3c108de56cb69f /pym | |
parent | e5cb173a0a9852e5ba7f731ccb675ed0146c5fe6 (diff) | |
download | portage-78b8dc75cda318572cb9f3ad8595b2a9222a6e85.tar.gz portage-78b8dc75cda318572cb9f3ad8595b2a9222a6e85.tar.bz2 portage-78b8dc75cda318572cb9f3ad8595b2a9222a6e85.zip |
Add sanity checks in fetch() and digestgen() to automatically detect and handle invalid empty distfiles since some users have reported difficulty when trying to create digests. (branches/2.1.2 r7039:7045)
svn path=/main/branches/2.1.2.9/; revision=7485
Diffstat (limited to 'pym')
-rw-r--r-- | pym/portage.py | 31 | ||||
-rw-r--r-- | pym/portage_manifest.py | 4 |
2 files changed, 31 insertions, 4 deletions
diff --git a/pym/portage.py b/pym/portage.py index e0c2c0005..3f07785f8 100644 --- a/pym/portage.py +++ b/pym/portage.py @@ -2532,7 +2532,16 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks", if not os.access(myfile_path, os.R_OK): writemsg("!!! Failed to adjust permissions:" + \ " %s\n" % str(e), noiselevel=-1) - if myfile not in mydigests: + + # If the file is empty then it's obviously invalid. Remove + # the empty file and try to download if possible. + if mystat.st_size == 0: + if can_fetch: + try: + os.unlink(myfile_path) + except EnvironmentError: + pass + elif myfile not in mydigests: # We don't have a digest, but the file exists. We must # assume that it is fully downloaded. continue @@ -2656,6 +2665,17 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks", writemsg("!!! Failed to adjust permissions:" + \ " %s\n" % str(e), noiselevel=-1) + # If the file is empty then it's obviously invalid. Don't + # trust the return value from the fetcher. Remove the + # empty file and try to download again. + try: + if os.stat(myfile_path).st_size == 0: + os.unlink(myfile_path) + fetched = 0 + continue + except EnvironmentError: + pass + if mydigests!=None and mydigests.has_key(myfile): try: mystat = os.stat(myfile_path) @@ -2790,16 +2810,23 @@ def digestgen(myarchives, mysettings, overwrite=1, manifestonly=0, myportdb=None continue if required_hash_types.difference(myhashes): missing_hashes.add(myfile) + continue + if myhashes["size"] == 0: + missing_hashes.add(myfile) if missing_hashes: missing_files = [] for myfile in missing_hashes: try: - os.stat(os.path.join(mysettings["DISTDIR"], myfile)) + st = os.stat(os.path.join(mysettings["DISTDIR"], myfile)) except OSError, e: if e.errno != errno.ENOENT: raise del e missing_files.append(myfile) + else: + # If the file is empty then it's obviously invalid. + if st.st_size == 0: + missing_files.append(myfile) if missing_files: mytree = os.path.realpath(os.path.dirname( os.path.dirname(mysettings["O"]))) diff --git a/pym/portage_manifest.py b/pym/portage_manifest.py index 6645963dd..ff2603fa8 100644 --- a/pym/portage_manifest.py +++ b/pym/portage_manifest.py @@ -482,12 +482,12 @@ class Manifest(object): except OSError: pass if f in distfilehashes and \ + not required_hash_types.difference(distfilehashes[f]) and \ ((assumeDistHashesSometimes and mystat is None) or \ (assumeDistHashesAlways and mystat is None) or \ (assumeDistHashesAlways and mystat is not None and \ len(distfilehashes[f]) == len(self.hashes) and \ - distfilehashes[f]["size"] == mystat.st_size)) and \ - not required_hash_types.difference(distfilehashes[f]): + distfilehashes[f]["size"] == mystat.st_size)): self.fhashdict["DIST"][f] = distfilehashes[f] else: try: |