public inbox for backports@vger.kernel.org
 help / color / mirror / Atom feed
From: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
To: backports@vger.kernel.org
Cc: linux-kernel@vger.kernel.org, yann.morin.1998@free.fr,
	mmarek@suse.cz, sassmann@kpanic.de,
	"Luis R. Rodriguez" <mcgrof@suse.com>
Subject: [PATCH v2 01/13] backports: move legacy and SmPL patch application into helper
Date: Tue,  4 Nov 2014 19:18:25 -0800	[thread overview]
Message-ID: <1415157517-15442-2-git-send-email-mcgrof@do-not-panic.com> (raw)
In-Reply-To: <1415157517-15442-1-git-send-email-mcgrof@do-not-panic.com>

From: "Luis R. Rodriguez" <mcgrof@suse.com>

This allows us to extend how backports uses patches for
different types of applications. This will later be used
for kernel integration support, for example.

This should have no functional change.

Signed-off-by: Luis R. Rodriguez <mcgrof@suse.com>
---
 gentree.py | 279 +++++++++++++++++++++++++++++++------------------------------
 1 file changed, 144 insertions(+), 135 deletions(-)

diff --git a/gentree.py b/gentree.py
index 9b4db98..59ae19d 100755
--- a/gentree.py
+++ b/gentree.py
@@ -438,6 +438,149 @@ def upload_release(args, rel_prep, logwrite=lambda x:None):
         kup_cmd = "kup put /\n\t\t%s /\n\t\t%s /\n\t\t%s" % (gzip_name, tar_name + '.asc', korg_path)
         logwrite("kup-test: skipping cmd: %s" % kup_cmd)
 
+def apply_patches(args, desc, source_dir, patch_src, target_dir, logwrite=lambda x:None):
+    """
+    Given a path of a directories of patches and SmPL patches apply
+    them on the target directory. If requested refresh patches, or test
+    a specific SmPL patch.
+    """
+    logwrite('Applying patches from %s to %s ...' % (patch_src, target_dir))
+    test_cocci = args.test_cocci or args.profile_cocci
+    test_cocci_found = False
+    patches = []
+    sempatches = []
+    for root, dirs, files in os.walk(os.path.join(source_dir, patch_src)):
+        for f in files:
+            if not test_cocci and f.endswith('.patch'):
+                patches.append(os.path.join(root, f))
+            if f.endswith('.cocci'):
+                if test_cocci:
+                    if f not in test_cocci:
+                        continue
+                    test_cocci_found = True
+                    if args.test_cocci:
+                        logwrite("Testing Coccinelle SmPL patch: %s" % test_cocci)
+                    elif args.profile_cocci:
+                        logwrite("Profiling Coccinelle SmPL patch: %s" % test_cocci)
+                sempatches.append(os.path.join(root, f))
+    patches.sort()
+    prefix_len = len(os.path.join(source_dir, patch_src)) + 1
+    for pfile in patches:
+        print_name = pfile[prefix_len:]
+        # read the patch file
+        p = patch.fromfile(pfile)
+        # complain if it's not a patch
+        if not p:
+            raise Exception('No patch content found in %s' % print_name)
+        # leading / seems to be stripped?
+        if 'dev/null' in p.items[0].source:
+            raise Exception('Patches creating files are not supported (in %s)' % print_name)
+        # check if the first file the patch touches exists, if so
+        # assume the patch needs to be applied -- otherwise continue
+        patched_file = '/'.join(p.items[0].source.split('/')[1:])
+        fullfn = os.path.join(target_dir, patched_file)
+        if not os.path.exists(fullfn):
+            if args.verbose:
+                logwrite("Not applying %s, not needed" % print_name)
+            continue
+        if args.verbose:
+            logwrite("Applying patch %s" % print_name)
+
+        if args.refresh:
+            # but for refresh, of course look at all files the patch touches
+            for patchitem in p.items:
+                patched_file = '/'.join(patchitem.source.split('/')[1:])
+                fullfn = os.path.join(target_dir, patched_file)
+                shutil.copyfile(fullfn, fullfn + '.orig_file')
+
+        process = subprocess.Popen(['patch', '-p1'], stdout=subprocess.PIPE,
+                                   stderr=subprocess.STDOUT, stdin=subprocess.PIPE,
+                                   close_fds=True, universal_newlines=True,
+                                   cwd=target_dir)
+        output = process.communicate(input=open(pfile, 'r').read())[0]
+        output = output.split('\n')
+        if output[-1] == '':
+            output = output[:-1]
+        if args.verbose:
+            for line in output:
+                logwrite('> %s' % line)
+        if process.returncode != 0:
+            if not args.verbose:
+                logwrite("Failed to apply changes from %s" % print_name)
+                for line in output:
+                    logwrite('> %s' % line)
+            raise Exception('Patch failed')
+
+        if args.refresh:
+            pfilef = open(pfile + '.tmp', 'a')
+            pfilef.write(p.top_header)
+            pfilef.flush()
+            for patchitem in p.items:
+                patched_file = '/'.join(patchitem.source.split('/')[1:])
+                fullfn = os.path.join(target_dir, patched_file)
+                process = subprocess.Popen(['diff', '-p', '-u', patched_file + '.orig_file', patched_file,
+                                            '--label', 'a/' + patched_file,
+                                            '--label', 'b/' + patched_file],
+                                           stdout=pfilef, close_fds=True,
+                                           universal_newlines=True, cwd=target_dir)
+                process.wait()
+                os.unlink(fullfn + '.orig_file')
+                if not process.returncode in (0, 1):
+                    logwrite("Failed to diff to refresh %s" % print_name)
+                    pfilef.close()
+                    os.unlink(pfile + '.tmp')
+                    raise Exception('Refresh failed')
+            pfilef.close()
+            os.rename(pfile + '.tmp', pfile)
+
+        # remove orig/rej files that patch sometimes creates
+        for root, dirs, files in os.walk(target_dir):
+            for f in files:
+                if f[-5:] == '.orig' or f[-4:] == '.rej':
+                    os.unlink(os.path.join(root, f))
+        git_debug_snapshot(args, "apply %s patch %s" % (desc, print_name))
+
+    sempatches.sort()
+    prefix_len = len(os.path.join(source_dir, patch_src)) + 1
+
+    for cocci_file in sempatches:
+        # Until Coccinelle picks this up
+        pycocci = os.path.join(source_dir, 'devel/pycocci')
+        cmd = [pycocci, cocci_file]
+        extra_spatch_args = []
+        if args.profile_cocci:
+            cmd.append('--profile-cocci')
+        cmd.append(os.path.abspath(target_dir))
+        print_name = cocci_file[prefix_len:]
+        if args.verbose:
+            logwrite("Applying SmPL patch %s" % print_name)
+        sprocess = subprocess.Popen(cmd,
+                                    stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+                                    close_fds=True, universal_newlines=True,
+                                    cwd=target_dir)
+        output = sprocess.communicate()[0]
+        sprocess.wait()
+        if sprocess.returncode != 0:
+            logwrite("Failed to process SmPL patch %s" % print_name)
+            raise Exception('SmPL patch failed')
+        output = output.split('\n')
+        if output[-1] == '':
+            output = output[:-1]
+        if args.verbose:
+            for line in output:
+                logwrite('> %s' % line)
+
+        # remove cocci_backup files
+        for root, dirs, files in os.walk(target_dir):
+            for f in files:
+                if f.endswith('.cocci_backup'):
+                    os.unlink(os.path.join(root, f))
+        git_debug_snapshot(args, "apply %s SmPL patch %s" % (desc, print_name))
+
+    if test_cocci and test_cocci_found:
+        logwrite('Done!')
+        sys.exit(0)
+
 def _main():
     # Our binary requirements go here
     req = reqs.Req()
@@ -620,141 +763,7 @@ def process(kerneldir, outdir, copy_list_file, git_revision=None,
         bpcfg.disable_symbols(disable_list)
     git_debug_snapshot(args, 'Add automatic backports')
 
-    test_cocci = args.test_cocci or args.profile_cocci
-
-    logwrite('Apply patches ...')
-    patches = []
-    sempatches = []
-    for root, dirs, files in os.walk(os.path.join(source_dir, 'patches')):
-        for f in files:
-            if not test_cocci and f.endswith('.patch'):
-                patches.append(os.path.join(root, f))
-            if f.endswith('.cocci'):
-                if test_cocci:
-                    if f not in test_cocci:
-                        continue
-                    if args.test_cocci:
-                        logwrite("Testing Coccinelle SmPL patch: %s" % test_cocci)
-                    elif args.profile_cocci:
-                        logwrite("Profiling Coccinelle SmPL patch: %s" % test_cocci)
-                sempatches.append(os.path.join(root, f))
-    patches.sort()
-    prefix_len = len(os.path.join(source_dir, 'patches')) + 1
-    for pfile in patches:
-        print_name = pfile[prefix_len:]
-        # read the patch file
-        p = patch.fromfile(pfile)
-        # complain if it's not a patch
-        if not p:
-            raise Exception('No patch content found in %s' % print_name)
-        # leading / seems to be stripped?
-        if 'dev/null' in p.items[0].source:
-            raise Exception('Patches creating files are not supported (in %s)' % print_name)
-        # check if the first file the patch touches exists, if so
-        # assume the patch needs to be applied -- otherwise continue
-        patched_file = '/'.join(p.items[0].source.split('/')[1:])
-        fullfn = os.path.join(args.outdir, patched_file)
-        if not os.path.exists(fullfn):
-            if args.verbose:
-                logwrite("Not applying %s, not needed" % print_name)
-            continue
-        if args.verbose:
-            logwrite("Applying patch %s" % print_name)
-
-        if args.refresh:
-            # but for refresh, of course look at all files the patch touches
-            for patchitem in p.items:
-                patched_file = '/'.join(patchitem.source.split('/')[1:])
-                fullfn = os.path.join(args.outdir, patched_file)
-                shutil.copyfile(fullfn, fullfn + '.orig_file')
-
-        process = subprocess.Popen(['patch', '-p1'], stdout=subprocess.PIPE,
-                                   stderr=subprocess.STDOUT, stdin=subprocess.PIPE,
-                                   close_fds=True, universal_newlines=True,
-                                   cwd=args.outdir)
-        output = process.communicate(input=open(pfile, 'r').read())[0]
-        output = output.split('\n')
-        if output[-1] == '':
-            output = output[:-1]
-        if args.verbose:
-            for line in output:
-                logwrite('> %s' % line)
-        if process.returncode != 0:
-            if not args.verbose:
-                logwrite("Failed to apply changes from %s" % print_name)
-                for line in output:
-                    logwrite('> %s' % line)
-            return 2
-
-        if args.refresh:
-            pfilef = open(pfile + '.tmp', 'a')
-            pfilef.write(p.top_header)
-            pfilef.flush()
-            for patchitem in p.items:
-                patched_file = '/'.join(patchitem.source.split('/')[1:])
-                fullfn = os.path.join(args.outdir, patched_file)
-                process = subprocess.Popen(['diff', '-p', '-u', patched_file + '.orig_file', patched_file,
-                                            '--label', 'a/' + patched_file,
-                                            '--label', 'b/' + patched_file],
-                                           stdout=pfilef, close_fds=True,
-                                           universal_newlines=True, cwd=args.outdir)
-                process.wait()
-                os.unlink(fullfn + '.orig_file')
-                if not process.returncode in (0, 1):
-                    logwrite("Failed to diff to refresh %s" % print_name)
-                    pfilef.close()
-                    os.unlink(pfile + '.tmp')
-                    return 3
-            pfilef.close()
-            os.rename(pfile + '.tmp', pfile)
-
-        # remove orig/rej files that patch sometimes creates
-        for root, dirs, files in os.walk(args.outdir):
-            for f in files:
-                if f[-5:] == '.orig' or f[-4:] == '.rej':
-                    os.unlink(os.path.join(root, f))
-        git_debug_snapshot(args, "apply backport patch %s" % print_name)
-
-    sempatches.sort()
-    prefix_len = len(os.path.join(source_dir, 'patches')) + 1
-
-    for cocci_file in sempatches:
-        # Until Coccinelle picks this up
-        pycocci = os.path.join(source_dir, 'devel/pycocci')
-        cmd = [pycocci, cocci_file]
-        extra_spatch_args = []
-        if args.profile_cocci:
-            cmd.append('--profile-cocci')
-        cmd.append(os.path.abspath(args.outdir))
-        print_name = cocci_file[prefix_len:]
-        if args.verbose:
-            logwrite("Applying SmPL patch %s" % print_name)
-        sprocess = subprocess.Popen(cmd,
-                                    stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
-                                    close_fds=True, universal_newlines=True,
-                                    cwd=args.outdir)
-        output = sprocess.communicate()[0]
-        sprocess.wait()
-        if sprocess.returncode != 0:
-            logwrite("Failed to process SmPL patch %s" % print_name)
-            return 3
-        output = output.split('\n')
-        if output[-1] == '':
-            output = output[:-1]
-        if args.verbose:
-            for line in output:
-                logwrite('> %s' % line)
-
-        # remove cocci_backup files
-        for root, dirs, files in os.walk(args.outdir):
-            for f in files:
-                if f.endswith('.cocci_backup'):
-                    os.unlink(os.path.join(root, f))
-        git_debug_snapshot(args, "apply backport SmPL patch %s" % print_name)
-
-    if test_cocci:
-        logwrite('Done!')
-        return 0
+    apply_patches(args, "backport", source_dir, 'patches', args.outdir, logwrite)
 
     # some post-processing is required
     configtree = kconfig.ConfigTree(os.path.join(args.outdir, 'Kconfig'))
-- 
2.1.1


  reply	other threads:[~2014-11-05  3:18 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-05  3:18 [PATCH v2 00/13] backports: add kernel integration support Luis R. Rodriguez
2014-11-05  3:18 ` Luis R. Rodriguez [this message]
2014-11-05  3:18 ` [PATCH v2 02/13] backports: ifdef around module_init() module_exit() for modules Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 03/13] backports: allow for different backport prefix Luis R. Rodriguez
2014-11-05  7:46   ` Johannes Berg
2014-11-05  9:16     ` Luis R. Rodriguez
2014-11-05  9:22       ` Johannes Berg
2014-11-05 19:42         ` Luis R. Rodriguez
2014-11-05 21:17           ` Johannes Berg
2014-11-05 22:21             ` Luis R. Rodriguez
2014-11-05 23:09               ` Andi Kleen
2014-11-05 23:15                 ` Luis R. Rodriguez
2014-11-05 23:31                   ` Andi Kleen
2014-11-05  3:18 ` [PATCH v2 04/13] backports: replace BACKPORT_PWD with BACKPORT_DIR Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 05/13] backports: use BACKPORT_DIR prefix on kconfig sources Luis R. Rodriguez
2014-11-05  7:51   ` Johannes Berg
2014-11-05 20:11     ` Luis R. Rodriguez
2014-11-05 21:19       ` Johannes Berg
2014-11-05 22:22         ` Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 06/13] backports: update dependencies map file Luis R. Rodriguez
2014-11-05  7:54   ` Johannes Berg
2014-11-05 20:13     ` Luis R. Rodriguez
2014-11-05 21:20       ` Johannes Berg
2014-11-05 22:23         ` Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 07/13] backports: split Kconfig into Kconfig.package and Kconfig.sources Luis R. Rodriguez
2014-11-05  7:55   ` Johannes Berg
2014-11-05 20:14     ` Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 08/13] backports: move version file generation to run earlier Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 09/13] backports: define C code backport version info using CPTCFG_ Luis R. Rodriguez
2014-11-05  7:57   ` Johannes Berg
2014-11-05 20:29     ` Luis R. Rodriguez
2014-11-05 21:20       ` Johannes Berg
2014-11-05 22:27         ` Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 10/13] backports: add backport version parsing for kernel integration Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 11/13] backports: prefix c-file / h-file auto backport with BPAUTO Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 12/13] backports: remove extra BACKPORT_ prefix from kernel versioning Luis R. Rodriguez
2014-11-05  3:18 ` [PATCH v2 13/13] backports: add full kernel integration support Luis R. Rodriguez

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1415157517-15442-2-git-send-email-mcgrof@do-not-panic.com \
    --to=mcgrof@do-not-panic.com \
    --cc=backports@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mcgrof@suse.com \
    --cc=mmarek@suse.cz \
    --cc=sassmann@kpanic.de \
    --cc=yann.morin.1998@free.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox