Make verify_all() return an "insufficient data" error if there is not at least one...
authorZac Medico <zmedico@gentoo.org>
Fri, 23 Feb 2007 14:17:13 +0000 (14:17 -0000)
committerZac Medico <zmedico@gentoo.org>
Fri, 23 Feb 2007 14:17:13 +0000 (14:17 -0000)
svn path=/main/branches/2.1.2/; revision=6057

pym/portage.py
pym/portage_checksum.py

index ee7a4a806d40ed2569bf987266dd8a2f9f7784cf..6205d7315047a58e5d3a22c6789f9e7dcdf70548 100644 (file)
@@ -2484,6 +2484,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
                                                                writemsg(("!!! Got:      %s\n" + \
                                                                        "!!! Expected: %s\n") % \
                                                                        (reason[1], reason[2]), noiselevel=-1)
+                                                               if reason[0] == "Insufficient data for checksum verification":
+                                                                       return 0
                                                                if can_fetch and not restrict_fetch:
                                                                        writemsg("Refetching...\n\n",
                                                                                noiselevel=-1)
@@ -2623,6 +2625,8 @@ def fetch(myuris, mysettings, listonly=0, fetchonly=0, locks_in_subdir=".locks",
                                                                                noiselevel=-1)
                                                                        writemsg("!!! Got:      %s\n!!! Expected: %s\n" % \
                                                                                (reason[1], reason[2]), noiselevel=-1)
+                                                                       if reason[0] == "Insufficient data for checksum verification":
+                                                                               return 0
                                                                        writemsg("Removing corrupt distfile...\n", noiselevel=-1)
                                                                        os.unlink(mysettings["DISTDIR"]+"/"+myfile)
                                                                        fetched=0
index 7f1a89c8e913cba289d9270cf2dc7993ac55ab11..cd5e0cb31a58c3b3672e80b39902933ae2ae2307 100644 (file)
@@ -3,6 +3,8 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id$
 
+if not hasattr(__builtins__, "set"):
+       from sets import Set as set
 
 from portage_const import PRIVATE_PATH,PRELINK_BINARY,HASHING_BLOCKSIZE
 import os
@@ -113,6 +115,22 @@ def verify_all(filename, mydict, calc_prelink=0, strict=0):
                if e.errno == errno.ENOENT:
                        raise portage_exception.FileNotFound(filename)
                return False, (str(e), None, None)
+
+       verifiable_hash_types = set(mydict).intersection(hashfunc_map)
+       verifiable_hash_types.discard("size")
+       if not verifiable_hash_types:
+               expected = set(hashfunc_map)
+               expected.discard("size")
+               expected = list(expected)
+               expected.sort()
+               expected = " ".join(expected)
+               got = set(mydict)
+               got.discard("size")
+               got = list(got)
+               got.sort()
+               got = " ".join(got)
+               return False, ("Insufficient data for checksum verification", got, expected)
+
        for x in mydict.keys():
                if   x == "size":
                        continue