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:
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:
# 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"])))