[yocto] [[AUH] 07/17] recipe/base.py: Add modify_recipe_files function decorator

Aníbal Limón anibal.limon at linux.intel.com
Wed Nov 25 16:00:36 PST 2015


Remove duplicate code adding modify_recipe_files decorator,
this function interate over recipe_dir and found bb and
includes files to make modifications.

Modifications to recipe bb and include files are made by
function passed to modify_recipe_files.

Signed-off-by: Aníbal Limón <anibal.limon at linux.intel.com>
---
 modules/recipe/base.py | 293 +++++++++++++++++++++++--------------------------
 1 file changed, 140 insertions(+), 153 deletions(-)

diff --git a/modules/recipe/base.py b/modules/recipe/base.py
index 15c5f43..5c70c61 100644
--- a/modules/recipe/base.py
+++ b/modules/recipe/base.py
@@ -33,18 +33,30 @@ from logging import warning as W
 from errors import *
 from utils.bitbake import *
 
-def is_recipe_or_include_file(full_path_f, f):
+def is_recipe_or_include_file(env, full_path_f, f):
     is_file = os.path.isfile(full_path_f)
 
-    is_recipe = f.find(self.env['PN']) == 0 and \
-                f.find(self.env['PKGV']) != -1 and \
+    is_recipe = f.find(env['PN']) == 0 and \
+                f.find(env['PKGV']) != -1 and \
                 f.find(".bb") != -1
 
-    is_include = f.find(self.env['PN']) == 0 and \
+    is_include = f.find(env['PN']) == 0 and \
                  f.find(".inc") != -1
 
     return is_file and (is_recipe or is_include)
 
+def modify_recipe_files(func):
+    def modify(env, recipe_dir):
+        for f in os.listdir(recipe_dir):
+            full_path_f = os.path.join(recipe_dir, f)
+            if is_recipe_or_include_file(env, full_path_f, f):
+                with open(full_path_f + ".tmp", "w+") as temp_recipe:
+                    with open(full_path_f) as recipe:
+                        for line in recipe:
+                            func(line, temp_recipe)
+                os.rename(full_path_f + ".tmp", full_path_f)
+    return modify
+
 class Recipe(object):
     def __init__(self, env, new_ver, interactive, workdir, recipe_dir, bitbake, git):
         self.env = env
@@ -90,18 +102,12 @@ class Recipe(object):
             self.git.mv(src_dir, dest_dir)
 
     def rename(self):
-        # change PR before renaming
-        for f in os.listdir(self.recipe_dir):
-            full_path_f = os.path.join(self.recipe_dir, f)
-            if is_recipe_or_include_file(full_path_f, f):
-                with open(full_path_f + ".tmp", "w+") as temp_recipe:
-                    with open(full_path_f) as recipe:
-                        for line in recipe:
-                            if line.startswith("PR=") or line.startswith("PR ="):
-                                continue
-                            else:
-                                temp_recipe.write(line)
-                os.rename(full_path_f + ".tmp", full_path_f)
+        # clean PR before renaming
+        @modify_recipe_files
+        def _clean_pr(line, temp_recipe):
+            if not (line.startswith("PR=") or line.startswith("PR =")):
+                temp_recipe.write(line)
+        _clean_pr(self.env, self.recipe_dir)
 
         # rename recipes (not directories)
         for path in os.listdir(self.recipe_dir):
@@ -121,8 +127,6 @@ class Recipe(object):
         # since we did some renaming, backup the current environment
         self.old_env = self.env
 
-        # start formatting the commit message
-
     def create_diff_file(self, file, old_md5, new_md5):
         old_file = os.path.join(self.old_env['S'], file)
         new_file = os.path.join(self.env['S'], file)
@@ -138,20 +142,6 @@ class Recipe(object):
             f.write("old checksum = %s\n" % old_md5)
             f.write("new_checksum = %s\n" % new_md5)
 
-        for f in os.listdir(self.recipe_dir):
-            full_path_f = os.path.join(self.recipe_dir, f)
-            if is_recipe_or_include_file(full_path_f, f):
-                with open(full_path_f + ".tmp", "w+") as temp_recipe:
-                    with open(full_path_f) as recipe:
-                        for line in recipe:
-                            m = re.match("(.*)" + old_md5 + "(.*)", line)
-                            if m is not None:
-                                temp_recipe.write(m.group(1) + new_md5 + m.group(2) + "\n")
-                            else:
-                                temp_recipe.write(line)
-
-                os.rename(full_path_f + ".tmp", full_path_f)
-
     def _change_recipe_checksums(self, fetch_log):
         sums = {}
 
@@ -178,27 +168,23 @@ class Recipe(object):
         if len(sums) == 0:
             raise FetchError()
 
-        I(" %s: Update recipe checksums ..." % self.env['PN'])
         # checksums are usually in the main recipe but they can also be in inc
         # files... Go through the recipes/inc files until we find them
-        for f in os.listdir(self.recipe_dir):
-            full_path_f = os.path.join(self.recipe_dir, f)
-            if is_recipe_or_include_file(full_path_f, f):
-                with open(full_path_f + ".tmp", "w+") as temp_recipe:
-                    with open(full_path_f) as recipe:
-                        for line in recipe:
-                            for name in sums:
-                                m1 = re.match("^SRC_URI\["+ name + "md5sum\].*", line)
-                                m2 = re.match("^SRC_URI\["+ name + "sha256sum\].*", line)
-                                if m1:
-                                    temp_recipe.write(sums[name]["md5sum"])
-                                elif m2:
-                                    temp_recipe.write(sums[name]["sha256sum"])
-                                else:
-                                    temp_recipe.write(line)
+        @modify_recipe_files
+        def _update_recipe_checksums(line, temp_recipe):
+            for name in sums:
+                m1 = re.match("^SRC_URI\["+ name + "md5sum\].*", line)
+                m2 = re.match("^SRC_URI\["+ name + "sha256sum\].*", line)
+                if m1:
+                    temp_recipe.write(sums[name]["md5sum"])
+                elif m2:
+                    temp_recipe.write(sums[name]["sha256sum"])
+                else:
+                    temp_recipe.write(line)
+
+        I(" %s: Update recipe checksums ..." % self.env['PN'])
+        _update_recipe_checksums(self.env, self.recipe_dir)
 
-                os.rename(full_path_f + ".tmp", full_path_f)
-        
         self.checksums_changed = True
 
     def _is_uri_failure(self, fetch_log):
@@ -218,71 +204,63 @@ class Recipe(object):
 
     def _change_source_suffix(self, new_suffix):
         # Will change the extension of the archive from the SRC_URI
-        for f in os.listdir(self.recipe_dir):
-            full_path_f = os.path.join(self.recipe_dir, f)
-            if is_recipe_or_include_file(full_path_f, f):
-                with open(full_path_f + ".tmp", "w+") as temp_recipe:
-                    with open(full_path_f) as recipe:
-                        source_found = False
-                        for line in recipe:
-                            # source on first line
-                            m1 = re.match("^SRC_URI.*\${PV}\.(.*)[\" \\\\].*", line)
-                            # SRC_URI alone on the first line
-                            m2 = re.match("^SRC_URI.*", line)
-                            # source on second line
-                            m3 = re.match(".*\${PV}\.(.*)[\" \\\\].*", line)
-                            if m1:
-                                old_suffix = m1.group(1)
-                                line = line.replace(old_suffix, new_suffix+" ")
-                            if m2 and not m1:
-                                source_found = True
-                            if m3 and source_found:
-                                old_suffix = m3.group(1)
-                                line = line.replace(old_suffix, new_suffix+" ")
-                                source_found = False
-
-                            temp_recipe.write(line)
-                os.rename(full_path_f + ".tmp", full_path_f)
+
+        source_found = False
+        @modify_recipe_files
+        def _change(line, temp_recipe):
+            # source on first line
+            m1 = re.match("^SRC_URI.*\${PV}\.(.*)[\" \\\\].*", line)
+            # SRC_URI alone on the first line
+            m2 = re.match("^SRC_URI.*", line)
+            # source on second line
+            m3 = re.match(".*\${PV}\.(.*)[\" \\\\].*", line)
+            if m1:
+                old_suffix = m1.group(1)
+                line = line.replace(old_suffix, new_suffix+" ")
+            if m2 and not m1:
+                source_found = True
+            if m3 and source_found:
+                old_suffix = m3.group(1)
+                line = line.replace(old_suffix, new_suffix+" ")
+                source_found = False
+
+            temp_recipe.write(line)
+
+        _change(self.env, self.recipe_dir)
 
     def _remove_patch_uri(self, uri):
-        recipe_files = [
-            os.path.join(self.recipe_dir, self.env['PN'] + ".inc"),
-            self.env['FILE']]
-
-        for recipe_filename in recipe_files:
-            if os.path.isfile(recipe_filename):
-                with open(recipe_filename + ".tmp", "w+") as temp_recipe:
-                    with open(recipe_filename) as recipe:
-                        for line in recipe:
-                            if line.find(uri) == -1:
-                                temp_recipe.write(line)
-                                continue
-                            
-                            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:
-                                continue
-                            # patch is on the first SRC_URI line
-                            elif m2:
-                                temp_recipe.write(m2.group(1) + "\\\n")
-                            # patch is in the middle
-                            elif m3:
-                                continue
-                            # 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:
-                                return False
-
-                os.rename(recipe_filename + ".tmp", recipe_filename)
+        removed = True
 
-        return True
+        @modify_recipe_files
+        def _remove(line, temp_recipe):
+            if line.find(uri) == -1:
+               temp_recipe.write(line)
+            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:
+                   removed = False
+
+        _remove(self.env, self.recipe_dir)
+
+        return removed
 
     def _remove_faulty_patch(self, patch_log):
         patch_file = None
@@ -343,6 +321,14 @@ class Recipe(object):
         return False
 
     def _license_issue_handled(self, config_log):
+        @modify_recipe_files
+        def _update_license_checksum(line, temp_recipe):
+            m = re.match("(.*)" + old_md5 + "(.*)", line)
+            if m is not None:
+                temp_recipe.write(m.group(1) + new_md5 + m.group(2) + "\n")
+            else:
+                temp_recipe.write(line)
+
         license_file = None
         with open(config_log) as log:
             for line in log:
@@ -368,8 +354,11 @@ class Recipe(object):
                     new_md5 = m_new.group(1)
         
         if license_file is not None:
+            _update_license_checksum(self.env, self.recipe_dir)
+
             self.create_diff_file(license_file, old_md5, new_md5)
             self.license_diff_file = os.path.join(self.workdir, os.path.basename(license_file + ".diff"))
+
             if self.interactive:
                 W("  %s: license checksum failed for file %s. The recipe has"
                   "been updated! View diff? (Y/n)" % (self.env['PN'], license_file))
@@ -492,48 +481,46 @@ class Recipe(object):
                 replacement = "${" + prefixes[largest_prefix] + "}"
                 files[i] = files[i].replace(largest_prefix, replacement)
 
-        recipe_files = [
-            os.path.join(self.recipe_dir, self.env['PN'] + ".inc"),
-            self.env['FILE']]
 
-        # Append the new files
-        for recipe_filename in recipe_files:
-            if os.path.isfile(recipe_filename):
-                with open(recipe_filename + ".tmp", "w+") as temp_recipe:
-                    with open(recipe_filename) as recipe:
-                        files_clause = False
-                        for line in recipe:
-                            if re.match("^FILES_\${PN}[ +=].*", line):
-                                files_clause = True
-                                temp_recipe.write(line)
-                                continue
-                            # Get front spacing
-                            if files_clause:
-                                front_spacing = re.sub("[^ \t]", "", line)
-                            # Append once the last line has of FILES has been reached
-                            if re.match(".*\".*", line) and files_clause:
-                                files_clause = False
-                                line = line.replace("\"", "")
-                                line = line.rstrip()
-                                front_spacing = re.sub("[^ \t]", "", line)
-                                # Do not write an empty line
-                                if line.strip():
-                                    temp_recipe.write(line + " \\\n")
-                                # Add spacing in case there was none
-                                if len(front_spacing) == 0:
-                                    front_spacing = " " * 8
-                                # Write to file
-                                for i in range(len(files)-1):
-                                    line = front_spacing + files[i] + " \\\n"
-                                    temp_recipe.write(line)
-
-                                line = front_spacing + files[len(files) - 1] + "\"\n"
-                                temp_recipe.write(line)
-                                continue
-
-                            temp_recipe.write(line)
-
-                os.rename(recipe_filename + ".tmp", recipe_filename)
+        files_clause = False
+        @modify_recipe_files
+        def _append_new_files(line, temp_file):
+            if re.match("^FILES_\${PN}[ +=].*", line):
+                files_clause = True
+                temp_recipe.write(line)
+                return
+
+            # Get front spacing
+            if files_clause:
+                front_spacing = re.sub("[^ \t]", "", line)
+
+            # Append once the last line has of FILES has been reached
+            if re.match(".*\".*", line) and files_clause:
+                files_clause = False
+                line = line.replace("\"", "")
+                line = line.rstrip()
+                front_spacing = re.sub("[^ \t]", "", line)
+
+                # Do not write an empty line
+                if line.strip():
+                    temp_recipe.write(line + " \\\n")
+
+                # Add spacing in case there was none
+                if len(front_spacing) == 0:
+                    front_spacing = " " * 8
+
+                # Write to file
+                for i in range(len(files) - 1):
+                    line = front_spacing + files[i] + " \\\n"
+                    temp_recipe.write(line)
+
+                line = front_spacing + files[len(files) - 1] + "\"\n"
+                temp_recipe.write(line)
+                return
+
+            temp_recipe.write(line)
+
+        _append_new_files(self.env, self.recipe_dir)
 
     def unpack(self):
         self.bb.unpack(self.env['PN'])
-- 
2.1.4




More information about the yocto mailing list