summaryrefslogtreecommitdiffstats
path: root/scripts/combo-layer
diff options
context:
space:
mode:
authorPatrick Ohly <patrick.ohly@intel.com>2015-03-10 09:56:03 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-03-20 11:21:23 +0000
commit96b98451c4cb5afa48fe951c3cac8e7bf1618142 (patch)
tree1e71a34cef1b4f1fc623a220243cb14e1e34b1f3 /scripts/combo-layer
parent627e524238893b537454fd48dade0dde8c64362d (diff)
downloadpoky-96b98451c4cb5afa48fe951c3cac8e7bf1618142.tar.gz
combo-layer: exclude files
Some combined repos intentionally do not include certain files. For example, Poky does not include bitbake's setup files and OE-core's sample files under meta/conf. When these files get modified in the upstream repository, applying the patches fails and requires manual intervention. That is merely a nuisance for someone familiar with the problem, but a real show stopper when having the import run automatically or by someone less experienced. Therefore this change introduces "file_exclude", a new per-repo list of file patterns which removes all matching files when initializing or updating a combined repository. Because fnmatch is used under the hood to match full path strings, removing entire directories must be done with a pattern ending in a '/*' (in contrast to file_filter). For Poky, the additional configuration looks like this: [bitbake] ... file_exclude = classes/base.bbclass conf/bitbake.conf .gitignore MANIFEST.in setup.py TODO [openembedded-core] ... file_exclude = meta/conf/bblayers.conf.sample meta/conf/local.conf.sample meta/conf/local.conf.sample.extended meta/conf/site.conf.sample (From OE-Core rev: a51b37f4db6b144386d1bd5789ec91acc78a0bd8) Signed-off-by: Patrick Ohly <patrick.ohly@intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/combo-layer')
-rwxr-xr-xscripts/combo-layer42
1 files changed, 41 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 @@
20# with this program; if not, write to the Free Software Foundation, Inc., 20# with this program; if not, write to the Free Software Foundation, Inc.,
21# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 21# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 22
23import fnmatch
23import os, sys 24import os, sys
24import optparse 25import optparse
25import logging 26import logging
@@ -211,7 +212,18 @@ def action_init(conf, args):
211 else: 212 else:
212 extract_dir = os.getcwd() 213 extract_dir = os.getcwd()
213 file_filter = repo.get('file_filter', "") 214 file_filter = repo.get('file_filter', "")
214 runcmd("git archive %s | tar -x -C %s %s" % (initialrev, extract_dir, file_filter), ldir) 215 files = runcmd("git archive %s | tar -x -v -C %s %s" % (initialrev, extract_dir, file_filter), ldir)
216 exclude_patterns = repo.get('file_exclude', '').split()
217 if exclude_patterns:
218 # Implement file removal by letting tar create the
219 # file and then deleting it in the file system
220 # again. Uses the list of files created by tar (easier
221 # than walking the tree).
222 for file in files.split('\n'):
223 for pattern in exclude_patterns:
224 if fnmatch.fnmatch(file, pattern):
225 os.unlink(os.path.join(extract_dir, file))
226 break
215 if not lastrev: 227 if not lastrev:
216 lastrev = runcmd("git rev-parse %s" % initialrev, ldir).strip() 228 lastrev = runcmd("git rev-parse %s" % initialrev, ldir).strip()
217 conf.update(name, "last_revision", lastrev, initmode=True) 229 conf.update(name, "last_revision", lastrev, initmode=True)
@@ -426,6 +438,34 @@ def action_update(conf, args):
426 runcmd("%s %s %s %s" % (repo['hook'], patch, revlist[count], name)) 438 runcmd("%s %s %s %s" % (repo['hook'], patch, revlist[count], name))
427 count=count-1 439 count=count-1
428 440
441 # Step 3a: Filter out unwanted files and patches.
442 exclude = repo.get('file_exclude', '')
443 if exclude:
444 filter = ['filterdiff', '-p1']
445 for path in exclude.split():
446 filter.append('-x')
447 filter.append('%s/%s' % (dest_dir, path) if dest_dir else path)
448 for patch in patchlist[:]:
449 filtered = patch + '.tmp'
450 with open(filtered, 'w') as f:
451 runcmd(filter + [patch], out=f)
452 # Now check for empty patches.
453 if runcmd(['filterdiff', '--list', filtered]):
454 # Possibly modified.
455 os.unlink(patch)
456 os.rename(filtered, patch)
457 else:
458 # Empty, ignore it. Must also remove from revlist.
459 with open(patch, 'r') as f:
460 fromline = f.readline()
461 m = re.match(r'''^From ([0-9a-fA-F]+) .*\n''', fromline)
462 rev = m.group(1)
463 logger.debug('skipping empty patch %s = %s' % (patch, rev))
464 os.unlink(patch)
465 os.unlink(filtered)
466 patchlist.remove(patch)
467 revlist.remove(rev)
468
429 # Step 4: write patch list and revision list to file, for user to edit later 469 # Step 4: write patch list and revision list to file, for user to edit later
430 patchlist_file = os.path.join(os.getcwd(), patch_dir, "patchlist-%s" % name) 470 patchlist_file = os.path.join(os.getcwd(), patch_dir, "patchlist-%s" % name)
431 repo['patchlist'] = patchlist_file 471 repo['patchlist'] = patchlist_file