mirror of
https://git.yoctoproject.org/poky
synced 2026-05-27 00:52:38 +02:00
Because we move the workdir when extracting source, then move the source and delete the temporary workdir, you lose the indirection symlink pointed to by the alternates file (which is created when the fetcher clones it from DL_DIR with -s) and the resulting repository is broken. In any case, for a source repo that the user may put their own changes into, we can't really rely on a clone made with -s in case the original goes away - because of cleanall, DL_DIR disappearing, etc. So repack the repository so that it is a complete, non-shared clone after unpacking. (While I'm at it, add a test for devtool modify with a git recipe which verifies that this works.) (From OE-Core rev: dccdde4321c48a571677995a4e1dfc583e899cbe) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
387 lines
22 KiB
Python
387 lines
22 KiB
Python
import unittest
|
|
import os
|
|
import logging
|
|
import re
|
|
import shutil
|
|
import tempfile
|
|
import glob
|
|
|
|
import oeqa.utils.ftools as ftools
|
|
from oeqa.selftest.base import oeSelfTest
|
|
from oeqa.utils.commands import runCmd, bitbake, get_bb_var
|
|
from oeqa.utils.decorators import testcase
|
|
|
|
class DevtoolTests(oeSelfTest):
|
|
|
|
def test_create_workspace(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
result = runCmd('bitbake-layers show-layers')
|
|
self.assertTrue('/workspace' not in result.output, 'This test cannot be run with a workspace layer in bblayers.conf')
|
|
# Try creating a workspace layer with a specific path
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
self.track_for_cleanup(tempdir)
|
|
result = runCmd('devtool create-workspace %s' % tempdir)
|
|
self.assertTrue(os.path.isfile(os.path.join(tempdir, 'conf', 'layer.conf')))
|
|
result = runCmd('bitbake-layers show-layers')
|
|
self.assertIn(tempdir, result.output)
|
|
# Try creating a workspace layer with the default path
|
|
self.track_for_cleanup(workspacedir)
|
|
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
|
|
result = runCmd('devtool create-workspace')
|
|
self.assertTrue(os.path.isfile(os.path.join(workspacedir, 'conf', 'layer.conf')))
|
|
result = runCmd('bitbake-layers show-layers')
|
|
self.assertNotIn(tempdir, result.output)
|
|
self.assertIn(workspacedir, result.output)
|
|
|
|
def test_recipetool_create(self):
|
|
# Try adding a recipe
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
self.track_for_cleanup(tempdir)
|
|
tempsrc = os.path.join(tempdir, 'srctree')
|
|
os.makedirs(tempsrc)
|
|
recipefile = os.path.join(tempdir, 'logrotate_3.8.7.bb')
|
|
srcuri = 'https://fedorahosted.org/releases/l/o/logrotate/logrotate-3.8.7.tar.gz'
|
|
result = runCmd('recipetool create -o %s %s -x %s' % (recipefile, srcuri, tempsrc))
|
|
self.assertTrue(os.path.isfile(recipefile))
|
|
checkvars = {}
|
|
checkvars['LICENSE'] = 'GPLv2'
|
|
checkvars['LIC_FILES_CHKSUM'] = 'file://COPYING;md5=18810669f13b87348459e611d31ab760'
|
|
checkvars['SRC_URI'] = 'https://fedorahosted.org/releases/l/o/logrotate/logrotate-${PV}.tar.gz'
|
|
checkvars['SRC_URI[md5sum]'] = '99e08503ef24c3e2e3ff74cc5f3be213'
|
|
checkvars['SRC_URI[sha256sum]'] = 'f6ba691f40e30e640efa2752c1f9499a3f9738257660994de70a45fe00d12b64'
|
|
with open(recipefile, 'r') as f:
|
|
for line in f:
|
|
if '=' in line:
|
|
splitline = line.split('=', 1)
|
|
var = splitline[0].rstrip()
|
|
value = splitline[1].strip().strip('"')
|
|
if var in checkvars:
|
|
needvalue = checkvars.pop(var)
|
|
self.assertEqual(value, needvalue)
|
|
if line.startswith('inherit '):
|
|
inherits = line.split()[1:]
|
|
|
|
self.assertEqual(checkvars, {}, 'Some variables not found')
|
|
|
|
def test_recipetool_create_git(self):
|
|
# Ensure we have the right data in shlibs/pkgdata
|
|
bitbake('libpng pango libx11 libxext')
|
|
# Try adding a recipe
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
self.track_for_cleanup(tempdir)
|
|
tempsrc = os.path.join(tempdir, 'srctree')
|
|
os.makedirs(tempsrc)
|
|
recipefile = os.path.join(tempdir, 'libmatchbox.bb')
|
|
srcuri = 'git://git.yoctoproject.org/libmatchbox'
|
|
result = runCmd('recipetool create -o %s %s -x %s' % (recipefile, srcuri, tempsrc))
|
|
self.assertTrue(os.path.isfile(recipefile), 'recipetool did not create recipe file; output:\n%s' % result.output)
|
|
checkvars = {}
|
|
checkvars['LICENSE'] = 'LGPLv2.1'
|
|
checkvars['LIC_FILES_CHKSUM'] = 'file://COPYING;md5=7fbc338309ac38fefcd64b04bb903e34'
|
|
checkvars['S'] = '${WORKDIR}/git'
|
|
checkvars['PV'] = '1.0+git${SRCPV}'
|
|
checkvars['SRC_URI'] = srcuri
|
|
checkvars['DEPENDS'] = 'libpng pango libx11 libxext'
|
|
inherits = []
|
|
with open(recipefile, 'r') as f:
|
|
for line in f:
|
|
if '=' in line:
|
|
splitline = line.split('=', 1)
|
|
var = splitline[0].rstrip()
|
|
value = splitline[1].strip().strip('"')
|
|
if var in checkvars:
|
|
needvalue = checkvars.pop(var)
|
|
self.assertEqual(value, needvalue)
|
|
if line.startswith('inherit '):
|
|
inherits = line.split()[1:]
|
|
|
|
self.assertEqual(checkvars, {}, 'Some variables not found')
|
|
|
|
self.assertIn('autotools', inherits, 'Missing inherit of autotools')
|
|
self.assertIn('pkgconfig', inherits, 'Missing inherit of pkgconfig')
|
|
|
|
def test_devtool_add(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
# Fetch source
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
self.track_for_cleanup(tempdir)
|
|
url = 'http://www.ivarch.com/programs/sources/pv-1.5.3.tar.bz2'
|
|
result = runCmd('wget %s' % url, cwd=tempdir)
|
|
result = runCmd('tar xfv pv-1.5.3.tar.bz2', cwd=tempdir)
|
|
srcdir = os.path.join(tempdir, 'pv-1.5.3')
|
|
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure')), 'Unable to find configure script in source directory')
|
|
# Test devtool add
|
|
self.track_for_cleanup(workspacedir)
|
|
self.add_command_to_tearDown('bitbake -c cleansstate pv')
|
|
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
|
|
result = runCmd('devtool add pv %s' % srcdir)
|
|
self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
|
|
# Test devtool status
|
|
result = runCmd('devtool status')
|
|
self.assertIn('pv', result.output)
|
|
self.assertIn(srcdir, result.output)
|
|
# Clean up anything in the workdir/sysroot/sstate cache (have to do this *after* devtool add since the recipe only exists then)
|
|
bitbake('pv -c cleansstate')
|
|
# Test devtool build
|
|
result = runCmd('devtool build pv')
|
|
installdir = get_bb_var('D', 'pv')
|
|
self.assertTrue(installdir, 'Could not query installdir variable')
|
|
bindir = get_bb_var('bindir', 'pv')
|
|
self.assertTrue(bindir, 'Could not query bindir variable')
|
|
if bindir[0] == '/':
|
|
bindir = bindir[1:]
|
|
self.assertTrue(os.path.isfile(os.path.join(installdir, bindir, 'pv')), 'pv binary not found in D')
|
|
|
|
def test_devtool_add_library(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
# We don't have the ability to pick up this dependency automatically yet...
|
|
bitbake('libusb1')
|
|
# Fetch source
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
self.track_for_cleanup(tempdir)
|
|
url = 'http://www.intra2net.com/en/developer/libftdi/download/libftdi1-1.1.tar.bz2'
|
|
result = runCmd('wget %s' % url, cwd=tempdir)
|
|
result = runCmd('tar xfv libftdi1-1.1.tar.bz2', cwd=tempdir)
|
|
srcdir = os.path.join(tempdir, 'libftdi1-1.1')
|
|
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'CMakeLists.txt')), 'Unable to find CMakeLists.txt in source directory')
|
|
# Test devtool add
|
|
self.track_for_cleanup(workspacedir)
|
|
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
|
|
result = runCmd('devtool add libftdi %s' % srcdir)
|
|
self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
|
|
# Test devtool status
|
|
result = runCmd('devtool status')
|
|
self.assertIn('libftdi', result.output)
|
|
self.assertIn(srcdir, result.output)
|
|
# Clean up anything in the workdir/sysroot/sstate cache (have to do this *after* devtool add since the recipe only exists then)
|
|
bitbake('libftdi -c cleansstate')
|
|
# Test devtool build
|
|
result = runCmd('devtool build libftdi')
|
|
staging_libdir = get_bb_var('STAGING_LIBDIR', 'libftdi')
|
|
self.assertTrue(staging_libdir, 'Could not query STAGING_LIBDIR variable')
|
|
self.assertTrue(os.path.isfile(os.path.join(staging_libdir, 'libftdi1.so.2.1.0')), 'libftdi binary not found in STAGING_LIBDIR')
|
|
# Test devtool reset
|
|
stampprefix = get_bb_var('STAMP', 'libftdi')
|
|
result = runCmd('devtool reset libftdi')
|
|
result = runCmd('devtool status')
|
|
self.assertNotIn('libftdi', result.output)
|
|
self.assertTrue(stampprefix, 'Unable to get STAMP value for recipe libftdi')
|
|
matches = glob.glob(stampprefix + '*')
|
|
self.assertFalse(matches, 'Stamp files exist for recipe libftdi that should have been cleaned')
|
|
self.assertFalse(os.path.isfile(os.path.join(staging_libdir, 'libftdi1.so.2.1.0')), 'libftdi binary still found in STAGING_LIBDIR after cleaning')
|
|
|
|
def test_devtool_modify(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
# Clean up anything in the workdir/sysroot/sstate cache
|
|
bitbake('mdadm -c cleansstate')
|
|
# Try modifying a 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')
|
|
self.add_command_to_tearDown('bitbake -c clean mdadm')
|
|
result = runCmd('devtool modify mdadm -x %s' % tempdir)
|
|
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile')), 'Extracted source could not be found')
|
|
self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
|
|
self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
|
|
matches = glob.glob(os.path.join(workspacedir, 'appends', 'mdadm_*.bbappend'))
|
|
self.assertTrue(matches, 'bbappend not created')
|
|
# Test devtool status
|
|
result = runCmd('devtool status')
|
|
self.assertIn('mdadm', result.output)
|
|
self.assertIn(tempdir, result.output)
|
|
# Check git repo
|
|
result = runCmd('git status --porcelain', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
|
|
result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
|
|
# Try building
|
|
bitbake('mdadm')
|
|
# Try making (minor) modifications to the source
|
|
result = runCmd("sed -i 's!^\.TH.*!.TH MDADM 8 \"\" v9.999-custom!' %s" % os.path.join(tempdir, 'mdadm.8.in'))
|
|
bitbake('mdadm -c package')
|
|
pkgd = get_bb_var('PKGD', 'mdadm')
|
|
self.assertTrue(pkgd, 'Could not query PKGD variable')
|
|
mandir = get_bb_var('mandir', 'mdadm')
|
|
self.assertTrue(mandir, 'Could not query mandir variable')
|
|
if mandir[0] == '/':
|
|
mandir = mandir[1:]
|
|
with open(os.path.join(pkgd, mandir, 'man8', 'mdadm.8'), 'r') as f:
|
|
for line in f:
|
|
if line.startswith('.TH'):
|
|
self.assertEqual(line.rstrip(), '.TH MDADM 8 "" v9.999-custom', 'man file not modified')
|
|
# Test devtool reset
|
|
stampprefix = get_bb_var('STAMP', 'mdadm')
|
|
result = runCmd('devtool reset mdadm')
|
|
result = runCmd('devtool status')
|
|
self.assertNotIn('mdadm', result.output)
|
|
self.assertTrue(stampprefix, 'Unable to get STAMP value for recipe mdadm')
|
|
matches = glob.glob(stampprefix + '*')
|
|
self.assertFalse(matches, 'Stamp files exist for recipe mdadm that should have been cleaned')
|
|
|
|
def test_devtool_modify_git(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
testrecipe = 'mkelfimage'
|
|
src_uri = get_bb_var('SRC_URI', testrecipe)
|
|
self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
|
|
# Clean up anything in the workdir/sysroot/sstate cache
|
|
bitbake('%s -c cleansstate' % testrecipe)
|
|
# Try modifying a 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')
|
|
self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe)
|
|
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
|
|
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile')), 'Extracted source could not be found')
|
|
self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
|
|
self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
|
|
matches = glob.glob(os.path.join(workspacedir, 'appends', 'mkelfimage_*.bbappend'))
|
|
self.assertTrue(matches, 'bbappend not created')
|
|
# Test devtool status
|
|
result = runCmd('devtool status')
|
|
self.assertIn(testrecipe, result.output)
|
|
self.assertIn(tempdir, result.output)
|
|
# Check git repo
|
|
result = runCmd('git status --porcelain', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
|
|
result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
|
|
# Try building
|
|
bitbake(testrecipe)
|
|
|
|
def test_devtool_update_recipe(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
testrecipe = 'minicom'
|
|
recipefile = get_bb_var('FILE', testrecipe)
|
|
src_uri = get_bb_var('SRC_URI', testrecipe)
|
|
self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
|
|
result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
|
|
self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
|
|
# First, modify a 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')
|
|
# (don't bother with cleaning the recipe on teardown, we won't be building it)
|
|
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
|
|
# Check git repo
|
|
self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
|
|
result = runCmd('git status --porcelain', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
|
|
result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
|
|
# Add a couple of commits
|
|
# FIXME: this only tests adding, need to also test update and remove
|
|
result = runCmd('echo "Additional line" >> README', cwd=tempdir)
|
|
result = runCmd('git commit -a -m "Change the README"', cwd=tempdir)
|
|
result = runCmd('echo "A new file" > devtool-new-file', cwd=tempdir)
|
|
result = runCmd('git add devtool-new-file', cwd=tempdir)
|
|
result = runCmd('git commit -m "Add a new file"', cwd=tempdir)
|
|
self.add_command_to_tearDown('cd %s; rm %s/*.patch; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile)))
|
|
result = runCmd('devtool update-recipe %s' % testrecipe)
|
|
result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
|
|
self.assertNotEqual(result.output.strip(), "", '%s recipe should be modified' % testrecipe)
|
|
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('0001-Change-the-README.patch'):
|
|
self.assertEqual(line[:3], '?? ', 'Unexpected status in line: %s' % line)
|
|
elif line.endswith('0002-Add-a-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_update_recipe_git(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
testrecipe = 'mtd-utils'
|
|
recipefile = get_bb_var('FILE', testrecipe)
|
|
src_uri = get_bb_var('SRC_URI', testrecipe)
|
|
self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
|
|
result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
|
|
self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
|
|
# First, modify a 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')
|
|
# (don't bother with cleaning the recipe on teardown, we won't be building it)
|
|
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
|
|
# Check git repo
|
|
self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
|
|
result = runCmd('git status --porcelain', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
|
|
result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
|
|
self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
|
|
# Add a couple of commits
|
|
# FIXME: this only tests adding, need to also test update and remove
|
|
result = runCmd('echo "# Additional line" >> Makefile', cwd=tempdir)
|
|
result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempdir)
|
|
result = runCmd('echo "A new file" > devtool-new-file', cwd=tempdir)
|
|
result = runCmd('git add devtool-new-file', cwd=tempdir)
|
|
result = runCmd('git commit -m "Add a new file"', cwd=tempdir)
|
|
self.add_command_to_tearDown('cd %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, os.path.basename(recipefile)))
|
|
result = runCmd('devtool update-recipe %s' % testrecipe)
|
|
result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
|
|
self.assertNotEqual(result.output.strip(), "", '%s recipe should be modified' % testrecipe)
|
|
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('add-exclusion-to-mkfs-jffs2-git-2.patch'):
|
|
self.assertEqual(line[:3], ' D ', 'Unexpected status in line: %s' % line)
|
|
elif line.endswith('fix-armv7-neon-alignment.patch'):
|
|
self.assertEqual(line[:3], ' D ', '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)
|
|
result = runCmd('git diff %s' % os.path.basename(recipefile), cwd=os.path.dirname(recipefile))
|
|
addlines = ['SRCREV = ".*"', 'SRC_URI = "git://git.infradead.org/mtd-utils.git"']
|
|
removelines = ['SRCREV = ".*"', 'SRC_URI = "git://git.infradead.org/mtd-utils.git \\\\', 'file://add-exclusion-to-mkfs-jffs2-git-2.patch \\\\', 'file://fix-armv7-neon-alignment.patch \\\\', '"']
|
|
for line in result.output.splitlines():
|
|
if line.startswith('+++') or line.startswith('---'):
|
|
continue
|
|
elif line.startswith('+'):
|
|
matched = False
|
|
for item in addlines:
|
|
if re.match(item, line[1:].strip()):
|
|
matched = True
|
|
break
|
|
self.assertTrue(matched, 'Unexpected diff add line: %s' % line)
|
|
elif line.startswith('-'):
|
|
matched = False
|
|
for item in removelines:
|
|
if re.match(item, line[1:].strip()):
|
|
matched = True
|
|
break
|
|
self.assertTrue(matched, 'Unexpected diff remove line: %s' % line)
|
|
|
|
def test_devtool_extract(self):
|
|
# Check preconditions
|
|
workspacedir = os.path.join(self.builddir, 'workspace')
|
|
self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
|
|
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
|
|
# Try devtool extract
|
|
self.track_for_cleanup(tempdir)
|
|
self.track_for_cleanup(workspacedir)
|
|
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
|
|
result = runCmd('devtool extract remake %s' % tempdir)
|
|
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile.am')), 'Extracted source could not be found')
|
|
self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
|