[yocto] [PATCH 02/11][auh] upgradehelper.py: Make usage of new upstream detection mechanism

Aníbal Limón anibal.limon at linux.intel.com
Wed Jun 10 09:28:43 PDT 2015


Change logic to use new values in checkpkg file generated with new
 oe.recipeutils.get_recipe_upstream_version and distrodata class.

Remove CSV parsing by hand use csv module and also add debugging when
discard recipes.

[YOCTO #7488]

Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
---
 upgradehelper.py | 96 ++++++++++++++++++++++++++++----------------------------
 1 file changed, 48 insertions(+), 48 deletions(-)

diff --git a/upgradehelper.py b/upgradehelper.py
index 366efb3..6af79a0 100755
--- a/upgradehelper.py
+++ b/upgradehelper.py
@@ -189,19 +189,6 @@ class Updater(object):
         self.env = bb_env
         self.recipe_dir = os.path.dirname(self.env['FILE'])
 
-    def _parse_checkpkg_line(self, line):
-        m = re.match("^([^ \t]*)[ \t]+([^ \t]*)[ \t]+([^ \t]*)[ \t]+.*", line)
-        if m:
-            res = (m.group(1), m.group(2), m.group(3))
-            m = re.search("<([^ \t]+@[^ \t]+)>", line)
-            if m:
-                maintainer = m.group(1)
-            else:
-                maintainer = None
-            return res + (maintainer,)
-
-        return (None, None, None, None)
-
     def _detect_recipe_type(self):
         if self.env['SRC_URI'].find("ftp://") != -1 or  \
                 self.env['SRC_URI'].find("http://") != -1 or \
@@ -309,7 +296,41 @@ class Updater(object):
                     C(" \"distrodata.bbclass\" not inherited. Consider adding "
                       "the following to your local.conf:\n\n"
                       "INHERIT =+ \"distrodata\"\n")
-                    exit(1)
+                else:
+                    C(line)
+
+            exit(1)
+
+    def _parse_checkpkg_file(self, file_path):
+        import csv
+
+        pkgs_list = []
+
+        with open(file_path, "r") as f:
+            reader = csv.reader(f, delimiter='\t')
+            for row in reader:
+                if reader.line_num == 1: # skip header line
+                    continue
+
+                pn = row[0]
+                cur_ver = row[1]
+                next_ver = row[2]
+                status = row[11]
+                maintainer = row[14]
+                no_upgrade_reason = row[15]
+
+                if status == 'UPDATE' and not no_upgrade_reason:
+                    pkgs_list.append((pn, next_ver, maintainer))
+                else:
+                    if no_upgrade_reason:
+                        D(" Skip package %s (status = %s, current version = %s," \
+                            " next version = %s, no upgrade reason = %s)" %
+                            (pn, status, cur_ver, next_ver, no_upgrade_reason))
+                    else:
+                        D(" Skip package %s (status = %s, current version = %s," \
+                            " next version = %s)" %
+                            (pn, status, cur_ver, next_ver))
+        return pkgs_list
 
     def _get_packages_to_upgrade(self, packages=None):
         if packages is None:
@@ -323,25 +344,7 @@ class Updater(object):
 
         self._check_upstream_versions(packages)
 
-        pkgs_list = []
-
-        with open(get_build_dir() + "/tmp/log/checkpkg.csv") as csv:
-            # Skip header line
-            next(csv)
-            for line in csv:
-                (pn, cur_ver, next_ver, maintainer) = self._parse_checkpkg_line(line)
-
-                if (pn, cur_ver, next_ver, maintainer) == (None, None, None, None):
-                    continue
-
-                if cur_ver != next_ver and next_ver != "N/A" and \
-                        next_ver != "INVALID":
-                    pkgs_list.append((pn, next_ver, maintainer))
-                else:
-                    W(" Skip package %s (current version = %s, next version = %s)" %
-                        (pn, cur_ver, next_ver))
-
-        return pkgs_list
+        return self._parse_checkpkg_file(get_build_dir() + "/tmp/log/checkpkg.csv")
 
     # this function will be called at the end of each recipe upgrade
     def pkg_upgrade_handler(self, err):
@@ -455,7 +458,6 @@ class Updater(object):
             W("No recipes attempted, not sending status mail!")
 
     def run(self, package_list=None):
-#[lp]        pkgs_to_upgrade = self._order_list(self._get_packages_to_upgrade(package_list))
         pkgs_to_upgrade = self._get_packages_to_upgrade(package_list)
 
         total_pkgs = len(pkgs_to_upgrade)
@@ -521,24 +523,27 @@ class UniverseUpdater(Updater):
     # checks if maintainer is in whitelist and that the recipe itself is not
     # blacklisted: python, gcc, etc. Also, check the history if the recipe
     # hasn't already been tried
-    def pkg_upgradable(self, pn, next_ver, maintainer):
+    def _pkg_upgradable(self, pn, next_ver, maintainer):
         if not maintainer:
-            D("Skipping upgrade of %s: no maintainer" % pn)
+            D(" Skipping upgrade of %s: no maintainer" % pn)
             return False
 
         if "blacklist" in settings:
             for p in settings["blacklist"].split():
                 if p == pn:
+                    D(" Skipping upgrade of %s: blacklist" % pn)
                     return False
 
         if "maintainers_whitelist" in settings:
             found = False
             for m in settings["maintainers_whitelist"].split():
-                if m == maintainer:
+                if maintainer.find(m) != -1:
                     found = True
                     break
 
-            if not found:
+            if found == False:
+                D(" Skipping upgrade of %s: maintainer \"%s\" not in whitelist" %
+                        (pn, maintainer))
                 return False
 
         if pn in self.history:
@@ -553,12 +558,14 @@ class UniverseUpdater(Updater):
                         self.history[pn][3] == str(Error())) and retry_delta > 7:
                     return True
 
+                D(" Skipping upgrade of %s: is in history and not 7 days passed" % pn)
                 return False
 
         # drop native/cross/cross-canadian recipes. We deal with native
         # when upgrading the main recipe but we keep away of cross* pkgs...
         # for now
         if pn.find("cross") != -1 or pn.find("native") != -1:
+            D(" Skipping upgrade of %s: is cross or native" % pn)
             return False
 
         return True
@@ -616,22 +623,15 @@ class UniverseUpdater(Updater):
               " check date are the same ...")
 
         pkgs_list = []
-
-        with open(last_checkpkg_file, "r") as csv:
-            for line in csv:
-                (pn, cur_ver, next_ver, maintainer) = self._parse_checkpkg_line(line)
-                if (pn, cur_ver, next_ver, maintainer) != (None, None, None, None) and \
-                        cur_ver != next_ver and next_ver != "N/A" and \
-                        next_ver != "INVALID":
-                    if self.pkg_upgradable(pn, next_ver, maintainer):
-                        pkgs_list.append((pn, next_ver, maintainer))
+        for pkg in self._parse_checkpkg_file(last_checkpkg_file):
+            if self._pkg_upgradable(pkg[0], pkg[1], pkg[2]):
+                pkgs_list.append(pkg)
 
         # Update last_checkpkg_run only after the version check has been completed
         with open(get_build_dir() + "/upgrade-helper/last_checkpkg_run", "w+") as last_check:
             last_check.write(current_date + "," + cur_master_commit + "," +
                              last_checkpkg_file)
 
-
         print("########### The list of recipes to be upgraded ############")
         for p, v, m in pkgs_list:
             print("%s,%s,%s" % (p, v, m))
-- 
1.8.4.5




More information about the yocto mailing list