Change behaviour of getMinUpgrade
authorfuzzyray <fuzzyray@gentoo.org>
Wed, 20 May 2009 21:46:46 +0000 (21:46 -0000)
committerfuzzyray <fuzzyray@gentoo.org>
Wed, 20 May 2009 21:46:46 +0000 (21:46 -0000)
This allows to differentiate between situations where
the system is unaffected and unexistance of an upgrade path.

Previously, the glsa-check would treat GLSAs that had no
upgrade path (such as mask glsas) as not affecting the system.

svn path=/trunk/gentoolkit/; revision=647

bin/glsa-check
pym/gentoolkit/glsa/__init__.py

index 3c41fffd25071f9732602da096b032c8d301619e..f1e8912ce2f28cd24cdd280acb7f0955a20247e8 100644 (file)
@@ -267,6 +267,11 @@ if mode in ["dump", "fix", "inject", "pretend"]:
                elif mode == "fix":
                        sys.stdout.write("fixing "+myid+"\n")
                        mergelist = myglsa.getMergeList(least_change=least_change)
+                       if mergelist == None:
+                               sys.stdout.write(">>> no vulnerable packages installed\n")
+                       elif mergelist == []:
+                               sys.stdout.write(">>> cannot fix GLSA, no unaffected packages available\n")
+                               sys.exit(2)
                        for pkg in mergelist:
                                sys.stdout.write(">>> merging "+pkg+"\n")
                                # using emerge for the actual merging as it contains the dependency
@@ -287,6 +292,11 @@ if mode in ["dump", "fix", "inject", "pretend"]:
                elif mode == "pretend":
                        sys.stdout.write("Checking GLSA "+myid+"\n")
                        mergelist = myglsa.getMergeList(least_change=least_change)
+                       if mergelist == None:
+                               sys.stdout.write(">>> no vulnerable packages installed\n")
+                       elif mergelist == []:
+                               sys.stdout.write(">>> cannot fix GLSA, no unaffected packages available\n")
+                               sys.exit(2)
                        if mergelist:
                                sys.stdout.write("The following updates will be performed for this GLSA:\n")
                                for pkg in mergelist:
index cc8051710e4df352ce5f6948b352588dcb495aed..121f066f3f801877ee5c5566ae758d4294a272b0 100644 (file)
@@ -378,8 +378,9 @@ def getMinUpgrade(vulnerableList, unaffectedList, minimize=True):
        I{vulnerableList} and returns string describing
        the lowest version for the package that matches an atom in 
        I{unaffectedList} and is greater than the currently installed
-       version or None if the system is not affected. Both
-       I{vulnerableList} and I{unaffectedList} should have the
+       version. It will return an empty list if the system is affected,
+       and no upgrade is possible or None if the system is not affected.
+       Both I{vulnerableList} and I{unaffectedList} should have the
        same base package.
        
        @type   vulnerableList: List of Strings
@@ -393,7 +394,7 @@ def getMinUpgrade(vulnerableList, unaffectedList, minimize=True):
        @return:        the lowest unaffected version that is greater than
                                the installed version.
        """
-       rValue = None
+       rValue = ""
        v_installed = reduce(operator.add, [match(v, "vartree") for v in vulnerableList], [])
        u_installed = reduce(operator.add, [match(u, "vartree") for u in unaffectedList], [])
        
@@ -403,15 +404,15 @@ def getMinUpgrade(vulnerableList, unaffectedList, minimize=True):
                        install_unaffected = False
 
        if install_unaffected:
-               return rValue
-       
+               return None
+
        for u in unaffectedList:
                mylist = match(u, "porttree", match_type="match-all")
                for c in mylist:
                        c_pv = portage.catpkgsplit(c)
                        i_pv = portage.catpkgsplit(portage.best(v_installed))
                        if portage.pkgcmp(c_pv[1:], i_pv[1:]) > 0 \
-                                       and (rValue == None \
+                                       and (rValue == "" \
                                                or not match("="+rValue, "porttree") \
                                                or (minimize ^ (portage.pkgcmp(c_pv[1:], portage.catpkgsplit(rValue)[1:]) > 0)) \
                                                        and match("="+c, "porttree")) \
@@ -658,7 +659,7 @@ class Glsa:
                                        for v in path["vul_atoms"]:
                                                rValue = rValue \
                                                        or (len(match(v, "vartree")) > 0 \
-                                                               and getMinUpgrade(path["vul_atoms"], path["unaff_atoms"]))
+                                                               and None != getMinUpgrade(path["vul_atoms"], path["unaff_atoms"]))
                return rValue
        
        def isApplied(self):