When fetch() is called and there is an existing file with the wrong size that
authorZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 06:32:27 +0000 (06:32 -0000)
committerZac Medico <zmedico@gentoo.org>
Wed, 11 Mar 2009 06:32:27 +0000 (06:32 -0000)
is smaller than PORTAGE_FETCH_RESUME_MIN_SIZE, rename the file instead of
deleting it. This is more friendly for cases in which the user is attempting
to regenerate the digest but has not used `ebuild --force foo.ebuild manifest`
like they're supposed to. Thanks to Patrick Lauer <patrick@g.o> for reporting.
(trunk r12739)

svn path=/main/branches/2.1.6/; revision=12988

pym/portage/__init__.py

index 4de1d0ad0f1043bc0e087f9540506771738870fa..5b661ce2438f37507ff91ad3faf5c7496f58f2b1 100644 (file)
@@ -3891,15 +3891,23 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
                                        elif distdir_writable:
                                                if mystat.st_size < fetch_resume_size and \
                                                        mystat.st_size < size:
-                                                       writemsg((">>> Deleting distfile with size " + \
+                                                       # If the file already exists and the size does not
+                                                       # match the existing digests, it may be that the
+                                                       # user is attempting to update the digest. In this
+                                                       # case, the digestgen() function will advise the
+                                                       # user to use `ebuild --force foo.ebuild manifest`
+                                                       # in order to force the old digests to be replaced.
+                                                       # Since the user may want to keep this file, rename
+                                                       # it instead of deleting it.
+                                                       writemsg((">>> Renaming distfile with size " + \
                                                                "%d (smaller than " "PORTAGE_FETCH_RESU" + \
                                                                "ME_MIN_SIZE)\n") % mystat.st_size)
-                                                       try:
-                                                               os.unlink(myfile_path)
-                                                       except OSError, e:
-                                                               if e.errno != errno.ENOENT:
-                                                                       raise
-                                                               del e
+                                                       temp_filename = \
+                                                               _checksum_failure_temp_file(
+                                                               mysettings["DISTDIR"], myfile)
+                                                       writemsg_stdout("Refetching... " + \
+                                                               "File renamed to '%s'\n\n" % \
+                                                               temp_filename, noiselevel=-1)
                                                elif mystat.st_size >= size:
                                                        temp_filename = \
                                                                _checksum_failure_temp_file(