[OE-core] [PATCH 2/2] combo-layer: exclude files
Paul Eggleton
paul.eggleton at linux.intel.com
Thu Mar 12 18:37:43 UTC 2015
On Tuesday 10 March 2015 11:10:49 Patrick Ohly wrote:
> 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
> ---
> scripts/combo-layer | 41
> +++++++++++++++++++++++++++++++++++++++- scripts/combo-layer.conf.example |
> 14 ++++++++++++++
> 2 files changed, 54 insertions(+), 1 deletion(-)
>
> diff --git a/scripts/combo-layer b/scripts/combo-layer
> index fb3fb50..b121c99 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
> @@ -208,7 +209,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) @@
> -423,6 +435,33 @@ 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(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.
> + fromline = open(patch, 'r').readline()
Can you use "with open(..." here? Otherwise looks good.
Cheers,
Paul
--
Paul Eggleton
Intel Open Source Technology Centre
More information about the Openembedded-core
mailing list