[OE-core] [PATCH v2 6/7] devtool: extract: always import local files to srctree
Markus Lehtonen
markus.lehtonen at linux.intel.com
Wed Jun 3 14:50:31 UTC 2015
Import all non-compressed/non-arcived non-remote source files (i.e.
local files from the SRC_URI) - excluding patches - to the srctree
repository. The files will be placed in a subdirectory called
'local-files'. However, in case S=WORKDIR, the files are imported into
root ot srctree (and not under 'local-files'), just like before.
[YOCTO #7602]
Signed-off-by: Markus Lehtonen <markus.lehtonen at linux.intel.com>
---
meta/lib/oeqa/selftest/devtool.py | 46 +++++++++++++++++++++++++++++++
scripts/lib/devtool/standard.py | 58 ++++++++++++++++++++++++++++++---------
2 files changed, 91 insertions(+), 13 deletions(-)
diff --git a/meta/lib/oeqa/selftest/devtool.py b/meta/lib/oeqa/selftest/devtool.py
index 6aaf5a5..c1623c2 100644
--- a/meta/lib/oeqa/selftest/devtool.py
+++ b/meta/lib/oeqa/selftest/devtool.py
@@ -716,6 +716,52 @@ class DevtoolTests(DevtoolBase):
raise AssertionError('Unexpected modified file in status: %s' %
line)
+ def test_devtool_update_recipe_local_files_2(self):
+ """Check handling of local source files for recipes where
+ S != WORKDIR"""
+ workspacedir = self._get_workspace_dir()
+ testrecipe = 'lzo'
+ recipefile = get_bb_var('FILE', testrecipe)
+ # Setup srctree for modifying the recipe
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ self.track_for_cleanup(tempdir)
+ self.track_for_cleanup(workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
+ # Check git repo
+ self._check_src_repo(tempdir)
+ # Edit / commit local source
+ runCmd('echo "# New comment" >> local-files/acinclude.m4', cwd=tempdir)
+ runCmd('git commit -am "Edit existing file"', cwd=tempdir)
+ runCmd('echo "Foo" > local-files/new-local', cwd=tempdir)
+ runCmd('git add local-files/new-local', cwd=tempdir)
+ runCmd('git commit -m "Add new local file"', cwd=tempdir)
+ runCmd('echo "Foo" > new-file', cwd=tempdir)
+ runCmd('git add new-file', cwd=tempdir)
+ runCmd('git commit -m "Add new file"', cwd=tempdir)
+ self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' %
+ os.path.dirname(recipefile))
+ runCmd('devtool update-recipe %s' % testrecipe)
+ result = runCmd('git status . --porcelain',
+ cwd=os.path.dirname(recipefile))
+ status = result.output.splitlines()
+ self.assertEqual(len(status), 3,
+ 'Less/more files modified than expected. '
+ 'Entire status:\n%s' % result.output)
+ for line in status:
+ if line.endswith('acinclude.m4'):
+ self.assertEqual(line[:3], ' M ',
+ 'Unexpected status in line: %s' % line)
+ elif line.endswith('Add-new-file.patch'):
+ self.assertEqual(line[:3], '?? ',
+ 'Unexpected status in line: %s' % line)
+ elif re.search('%s_[^_]*.bb$' % testrecipe, line):
+ self.assertEqual(line[:3], ' M ',
+ 'Unexpected status in line: %s' % line)
+ else:
+ raise AssertionError('Unexpected modified file in status: %s' %
+ line)
+
def test_devtool_extract(self):
workspacedir = self._get_workspace_dir()
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index 75cc495..44948fd 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -303,10 +303,11 @@ def _extract_source(srctree, keep_temp, devbranch, d):
logger.info('Unpacking...')
exec_task_func('do_unpack', False)
srcsubdir = crd.getVar('S', True)
+
+ recipe_patches = [os.path.basename(patch) for patch in
+ oe.recipeutils.get_recipe_patches(crd)]
if srcsubdir == workdir:
# Find non-patch sources that were "unpacked" to srctree directory
- recipe_patches = [os.path.basename(patch) for patch in
- oe.recipeutils.get_recipe_patches(crd)]
src_files = [fname for fname in _ls_tree(workdir) if
os.path.basename(fname) not in recipe_patches]
# Force separate S so that patch files can be left out from srctree
@@ -357,6 +358,23 @@ def _extract_source(srctree, keep_temp, devbranch, d):
bb.process.run('git tag -f devtool-patched', cwd=srcsubdir)
+ # Add unpacked local files (in case of S=WORKDIR these were already
+ # moved to S) into srctree
+ local_files = oe.recipeutils.get_recipe_local_files(crd)
+ local_files = [fname for fname in local_files if
+ os.path.basename(fname) not in recipe_patches and
+ os.path.exists(os.path.join(workdir, fname))]
+ if local_files:
+ logger.info('Adding local files...')
+ for fname in local_files:
+ localf_subdir = os.path.join(srcsubdir, 'local-files',
+ os.path.dirname(fname))
+ bb.utils.mkdirhier(localf_subdir)
+ shutil.move(os.path.join(workdir, fname), localf_subdir)
+ bb.process.run(['git', 'add', 'local-files'], cwd=srcsubdir)
+ bb.process.run(['git', 'commit', '-q', '-m', 'Add local files'],
+ cwd=srcsubdir)
+
if os.path.exists(patchdir):
shutil.rmtree(patchdir)
if haspatches:
@@ -595,17 +613,31 @@ def update_recipe(args, config, basepath, workspace):
tempdir = tempfile.mkdtemp(prefix='devtool')
try:
# Copy local files from srctree HEAD to "recipe space"
- # Local files might be "all over the place", need recursive ls-tree
- git_files = set(_git_ls_tree(srctree, recursive=True))
- copy_files = git_files.intersection(set(local_files.keys()))
- patch_include_paths = git_files.difference(set(local_files.keys()))
- bb.process.run(['git', 'checkout', 'HEAD', '--'] + list(copy_files),
- cwd=srctree,
- env=dict(os.environ, GIT_WORK_TREE=tempdir))
- for fname in _ls_tree(tempdir):
- logger.info('Updating file %s' % fname)
- shutil.copy2(os.path.join(tempdir, fname),
- local_files[fname])
+ if os.path.isdir(os.path.join(srctree, 'local-files')):
+ # Local files are in 'local-files' only list root of git repo
+ git_files = set(_git_ls_tree(srctree))
+ patch_include_paths = git_files.difference(set(['local-files']))
+ bb.process.run(['git', 'checkout', 'HEAD', '--', 'local-files'],
+ cwd=srctree,
+ env=dict(os.environ, GIT_WORK_TREE=tempdir))
+ local_src_dir = os.path.join(tempdir, 'local-files')
+ else:
+ # Local files might be "all over the place", need recursive ls-tree
+ git_files = set(_git_ls_tree(srctree, recursive=True))
+ copy_files = git_files.intersection(set(local_files.keys()))
+ patch_include_paths = git_files.difference(set(local_files.keys()))
+ bb.process.run(['git', 'checkout', 'HEAD', '--'] + list(copy_files),
+ cwd=srctree,
+ env=dict(os.environ, GIT_WORK_TREE=tempdir))
+ local_src_dir = tempdir
+
+ for fname in _ls_tree(local_src_dir):
+ if fname in local_files:
+ logger.info('Updating file %s' % fname)
+ shutil.copy2(os.path.join(local_src_dir, fname),
+ local_files[fname])
+ else:
+ logger.warning('File %s not in SRC_URI, skipping it' % fname)
finally:
shutil.rmtree(tempdir)
--
2.1.4
More information about the Openembedded-core
mailing list