[yocto] [[AUH] 3/4] upgradehelper.py: Don't remove patches if fails to apply

Aníbal Limón anibal.limon at linux.intel.com
Fri Dec 11 13:15:04 PST 2015


Instead of remove patches when fails to apply now comment it
this helps the maintainer to review why the patch failed to
apply.

Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
---
 modules/recipe/base.py | 114 ++++++++++++++++++++++++++++++-------------------
 upgradehelper.py       |   4 +-
 2 files changed, 72 insertions(+), 46 deletions(-)

diff --git a/modules/recipe/base.py b/modules/recipe/base.py
index 535e6ab..43db1f4 100644
--- a/modules/recipe/base.py
+++ b/modules/recipe/base.py
@@ -93,7 +93,7 @@ class Recipe(object):
         self.old_env = None
 
         self.commit_msg = self.env['PN'] + ": upgrade to " + self.new_ver + "\n\n"
-        self.rm_patches_msg = "\n\nRemoved the following patch(es):\n"
+        self.comment_patches_msg = "\n\nCommented the following patch(es):\n"
 
         self._inherits = None
 
@@ -257,43 +257,65 @@ class Recipe(object):
         d['source_found'] = False
         _change(self.env, self.recipe_dir, d)
 
-    def _remove_patch_uri(self, uri):
+    def _comment_patch_uri(self, uri):
         @modify_recipe_files
-        def _remove(line, temp_recipe, *args, **kwargs):
+        def _comment(line, temp_recipe, *args, **kwargs):
             d = args[0]
+            uri = d['uri']
 
-            if line.find(uri) == -1:
-               temp_recipe.write(line)
+            m1 = re.match("SRC_URI *\+*= *\" *" + uri + " *\"", line)
+            m2 = re.match("(SRC_URI *\+*= *\" *)" + uri + " *\\\\", line)
+            m3 = re.match("[\t ]*" + uri + " *\\\\", line)
+            m4 = re.match("([\t ]*)" + uri + " *\"", line)
+
+            if m1 or m2 or m3 or m4:
+                d['commented'] = True
+
+                if not d['start']:
+                    d['start'] = True
+
+                # patch on a single SRC_URI line:
+                if m1:
+                    d['patches'].append(line)
+                    d['end'] = True
+                # patch is on the first SRC_URI line
+                elif m2:
+                    d['patches'].append(line)
+                    temp_recipe.write(m2.group(1) + "\\\n")
+                # patch is in the middle
+                elif m3:
+                    d['patches'].append(line)
+                # patch is last in list
+                elif m4:
+                    d['end'] = True
+                    d['patches'].append(line)
+                    temp_recipe.write(m4.group(1) + "\"\n")
             else:
-               m1 = re.match("SRC_URI *\+*= *\" *" + uri + " *\"", line)
-               m2 = re.match("(SRC_URI *\+*= *\" *)" + uri + " *\\\\", line)
-               m3 = re.match("[\t ]*" + uri + " *\\\\", line)
-               m4 = re.match("([\t ]*)" + uri + " *\"", line)
-
-               # patch on a single SRC_URI line:
-               if m1:
-                   return
-               # patch is on the first SRC_URI line
-               elif m2:
-                   temp_recipe.write(m2.group(1) + "\\\n")
-               # patch is in the middle
-               elif m3:
-                   return
-               # patch is last in list
-               elif m4:
-                   temp_recipe.write(m4.group(1) + "\"\n")
-               # nothing matched in recipe but we deleted the patch
-               # anyway? Then we must bail out!
-               else:
-                   d['removed'] = False
+                temp_recipe.write(line)
+
+                if d['start'] and (d['end'] or line.startswith('"')):
+                    if d['patches']:
+                        for p in d['patches']:
+                            line = p.rstrip()
+                            if line.endswith('\\'):
+                                line = line[:-1]
+                            temp_recipe.write("#%s\n" % line)
+
+                    d['start'] = False
+                    d['end'] = False
 
         d = {}
-        d['removed'] = True
-        _remove(self.env, self.recipe_dir, d)
+        d['commented'] = False
+
+        d['uri'] = uri
+        d['patches'] = []
+        d['start'] = False
+        d['end'] = False
+        _comment(self.env, self.recipe_dir, d)
 
-        return d['removed']
+        return d['commented']
 
-    def _remove_faulty_patch(self, patch_log):
+    def _comment_faulty_patch(self, patch_log):
         patch_file = None
         is_reverse_applied = False
 
@@ -311,7 +333,7 @@ class Recipe(object):
         if not patch_file:
             return False
 
-        I(" %s: Removing patch %s ..." % (self.env['PN'], patch_file))
+        I(" %s: Commenting patch %s ..." % (self.env['PN'], patch_file))
         reason = None
         found = False
         dirs = [self.env['PN'] + "-" + self.env['PKGV'], self.env['PN'], "files"]
@@ -321,24 +343,26 @@ class Recipe(object):
                 continue
             else:
                 found = True
+
                 # Find out upstream status of the patch
                 with open(patch_file_path) as patch:
                     for line in patch:
                         m = re.match(".*Upstream-Status:(.*)\n", line)
                         if m:
                             reason = m.group(1).strip().split()[0].lower()
-                os.remove(patch_file_path)
-                if not self._remove_patch_uri("file://" + patch_file):
+
+                if not self._comment_patch_uri("file://" + patch_file):
                     return False
         if not found:
             return False
 
-        self.rm_patches_msg += " * " + patch_file
+        self.comment_patches_msg += " * " + patch_file
         if reason:
-            self.rm_patches_msg += " (" + reason + ") "
+            self.comment_patches_msg += " (" + reason + ") "
         if is_reverse_applied:
-            self.rm_patches_msg += "+ reverse-applied"
-        self.rm_patches_msg += "\n"
+            self.comment_patches_msg += "+ reverse-applied"
+        self.comment_patches_msg += "\n"
+
         return True
 
     def _is_license_issue(self, config_log):
@@ -628,7 +652,7 @@ class Recipe(object):
         # Undo removed patches
         if self.removed_patches:
             self.git.checkout_branch("upgrades")
-            self.git.delete_branch("remove_patches")
+            self.git.delete_branch("comment_patches")
             self.git.reset_hard()
             self.git.reset_soft(1)
             self.removed_patches = False
@@ -639,9 +663,9 @@ class Recipe(object):
             if self.removed_patches:
                 # move temporary changes into upgrades branch
                 self.git.checkout_branch("upgrades")
-                self.git.delete_branch("remove_patches")
+                self.git.delete_branch("comment_patches")
                 self.git.reset_soft(1)
-                self.commit_msg += self.rm_patches_msg + "\n"
+                self.commit_msg += self.comment_patches_msg + "\n"
                 self.removed_patches = False
         except Error as e:
             if self._is_incompatible_host(e.stdout):
@@ -659,14 +683,16 @@ class Recipe(object):
                 failed_task = failed_recipes[self.env['PN']][0]
                 log_file = failed_recipes[self.env['PN']][1]
                 if failed_task == "do_patch":
-                    # Remove one patch after the other until
+
+                    # Comment one patch after the other until
                     # compilation works.
                     if not self.removed_patches:
                         self.git.commit("temporary")
-                        self.git.create_branch("remove_patches")
-                        self.git.checkout_branch("remove_patches")
+                        self.git.create_branch("comment_patches")
+                        self.git.checkout_branch("comment_patches")
                         self.removed_patches = True
-                    if not self._remove_faulty_patch(log_file):
+
+                    if not self._comment_faulty_patch(log_file):
                         self._undo_temporary()
                         raise PatchError()
 
diff --git a/upgradehelper.py b/upgradehelper.py
index 6f4406b..a626192 100755
--- a/upgradehelper.py
+++ b/upgradehelper.py
@@ -289,8 +289,8 @@ class Updater(object):
             "The recipe has been successfully compiled for machines %s.\n\n" \
             "Next steps:\n" \
             "    - apply the patch: git am %s\n" \
-            "    - check that required upstream patches have not been removed from the recipe,\n" \
-            "      if upstream patches were removed the reason is specified in the commit message.\n" \
+            "    - check that required upstream patches have not been commented from the recipe,\n" \
+            "      if upstream patches were commented the reason is specified in the commit message.\n" \
             "    - compile an image that contains the package\n" \
             "    - perform some basic sanity tests\n" \
             "    - amend the patch and sign it off: git commit -s --reset-author --amend\n" \
-- 
2.1.4




More information about the yocto mailing list