summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/combo-layer42
-rw-r--r--scripts/combo-layer.conf.example14
2 files changed, 55 insertions, 1 deletions
diff --git a/scripts/combo-layer b/scripts/combo-layer
index 3ee9eb203d..8db5d7e376 100755
--- a/scripts/combo-layer
+++ b/scripts/combo-layer
@@ -20,6 +20,7 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+import fnmatch
import os, sys
import optparse
import logging
@@ -211,7 +212,18 @@ def action_init(conf, args):
else:
extract_dir = os.getcwd()
file_filter = repo.get('file_filter', "")
- runcmd("git archive %s | tar -x -C %s %s" % (initialrev, extract_dir, file_filter), ldir)
+ files = runcmd("git archive %s | tar -x -v -C %s %s" % (initialrev, extract_dir, file_filter), ldir)
+ exclude_patterns = repo.get('file_exclude', '').split()
+ if exclude_patterns:
+ # Implement file removal by letting tar create the
+ # file and then deleting it in the file system
+ # again. Uses the list of files created by tar (easier
+ # than walking the tree).
+ for file in files.split('\n'):
+ for pattern in exclude_patterns:
+ if fnmatch.fnmatch(file, pattern):
+ os.unlink(os.path.join(extract_dir, file))
+ break
if not lastrev:
lastrev = runcmd("git rev-parse %s" % initialrev, ldir).strip()
conf.update(name, "last_revision", lastrev, initmode=True)
@@ -426,6 +438,34 @@ def action_update(conf, args):
runcmd("%s %s %s %s" % (repo['hook'], patch, revlist[count], name))
count=count-1
+ # Step 3a: Filter out unwanted files and patches.
+ exclude = repo.get('file_exclude', '')
+ if exclude:
+ filter = ['filterdiff', '-p1']
+ for path in exclude.split():
+ filter.append('-x')
+ filter.append('%s/%s' % (dest_dir, path) if dest_dir else path)
+ for patch in patchlist[:]:
+ filtered = patch + '.tmp'
+ with open(filtered, 'w') as f:
+ runcmd(filter + [patch], out=f)
+ # Now check for empty patches.
+ if runcmd(['filterdiff', '--list', filtered]):
+ # Possibly modified.
+ os.unlink(patch)
+ os.rename(filtered, patch)
+ else:
+ # Empty, ignore it. Must also remove from revlist.
+ with open(patch, 'r') as f:
+ fromline = f.readline()
+ m = re.match(r'''^From ([0-9a-fA-F]+) .*\n''', fromline)
+ rev = m.group(1)
+ logger.debug('skipping empty patch %s = %s' % (patch, rev))
+ os.unlink(patch)
+ os.unlink(filtered)
+ patchlist.remove(patch)
+ revlist.remove(rev)
+
# Step 4: write patch list and revision list to file, for user to edit later
patchlist_file = os.path.join(os.getcwd(), patch_dir, "patchlist-%s" % name)
repo['patchlist'] = patchlist_file
diff --git a/scripts/combo-layer.conf.example b/scripts/combo-layer.conf.example
index 427c1b399f..38bc53c59f 100644
--- a/scripts/combo-layer.conf.example
+++ b/scripts/combo-layer.conf.example
@@ -42,6 +42,20 @@ last_revision =
# file_filter = src/*.c : only include the src *.c file
# file_filter = src/main.c src/Makefile.am : only include these two files
+# file_exclude: filter out these file(s)
+# file_exclude = [path] [path] ...
+#
+# Each entry must match a file name. In contrast do file_filter, matching
+# a directory has no effect. To achieve that, use append a * wildcard
+# at the end.
+#
+# Wildcards are applied to the complete path and also match slashes.
+#
+# example:
+# file_exclude = src/foobar/* : exclude everything under src/foobar
+# file_exclude = src/main.c : filter out main.c after including it with file_filter = src/*.c
+# file_exclude = *~ : exclude backup files
+
# hook: if provided, the tool will call the hook to process the generated
# patch from upstream, and then apply the modified patch to the combo
# repo.