summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pym/portage/__init__.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index 59ddfd5d8..1ca0404b9 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -4245,6 +4245,14 @@ def digestgen(myarchives, mysettings, overwrite=1, manifestonly=0, myportdb=None
required_hash_types.add(portage.const.MANIFEST2_REQUIRED_HASH)
dist_hashes = mf.fhashdict.get("DIST", {})
missing_hashes = set()
+ # To avoid accidental regeneration of digests with the incorrect
+ # files (such as partially downloaded files), trigger the fetch
+ # code if the file exists and it's size doesn't match the current
+ # manifest entry. If there really is a legitimate reason for the
+ # digest to change, `ebuild --force digest` can be used to avoid
+ # triggering this code (or else the old digests can be manually
+ # removed from the Manifest).
+ wrong_size_files = set()
for myfile in distfiles_map:
myhashes = dist_hashes.get(myfile)
if not myhashes:
@@ -4255,7 +4263,19 @@ def digestgen(myarchives, mysettings, overwrite=1, manifestonly=0, myportdb=None
continue
if myhashes["size"] == 0:
missing_hashes.add(myfile)
- if missing_hashes:
+ continue
+ try:
+ st = os.stat(os.path.join(mysettings["DISTDIR"], myfile))
+ except OSError, e:
+ if e.errno != errno.ENOENT:
+ raise
+ del e
+ continue
+ if st.st_size == 0 or st.st_size != myhashes["size"]:
+ wrong_size_files.add(myfile)
+ continue
+
+ if missing_hashes or wrong_size_files:
missing_files = []
for myfile in missing_hashes:
try:
@@ -4269,6 +4289,7 @@ def digestgen(myarchives, mysettings, overwrite=1, manifestonly=0, myportdb=None
# If the file is empty then it's obviously invalid.
if st.st_size == 0:
missing_files.append(myfile)
+ missing_files.extend(wrong_size_files)
if missing_files:
mytree = os.path.realpath(os.path.dirname(
os.path.dirname(mysettings["O"])))