summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/selftest/devtool.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2015-05-18 16:15:08 +0100
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-05-20 21:41:04 +0100
commit7539c1f8892e5f7467e3fe8cf8cf7a5a23033e4d (patch)
tree02fa87af1b254a594c339871d54eaf665417e82f /meta/lib/oeqa/selftest/devtool.py
parentfbfc06a969200e582a059c9943e6fd17aca70e30 (diff)
downloadpoky-7539c1f8892e5f7467e3fe8cf8cf7a5a23033e4d.tar.gz
devtool: update-recipe: add option to write changes to bbappend
Quite often what you want to do having made customisations to a piece of software is to apply those customisations in your own layer rather than in the original recipe. Thus, add a -a/--append option to the update-recipe subcommand which allows you to specify the layer to write a bbappend into. The bbappend will be created at the appropriate path within the specified layer directory (which may or may not be in your bblayers.conf) or if one already exists it will be updated appropriately. (This re-uses code written for recipetool appendfile.) Implements [YOCTO #7587]. (From OE-Core rev: 87d487ea4fdfb6cd30e3b3fad47732db12e86f23) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oeqa/selftest/devtool.py')
-rw-r--r--meta/lib/oeqa/selftest/devtool.py171
1 files changed, 171 insertions, 0 deletions
diff --git a/meta/lib/oeqa/selftest/devtool.py b/meta/lib/oeqa/selftest/devtool.py
index ad10af5826..4e22e1dfe4 100644
--- a/meta/lib/oeqa/selftest/devtool.py
+++ b/meta/lib/oeqa/selftest/devtool.py
@@ -524,6 +524,177 @@ class DevtoolTests(DevtoolBase):
524 break 524 break
525 self.assertTrue(matched, 'Unexpected diff remove line: %s' % line) 525 self.assertTrue(matched, 'Unexpected diff remove line: %s' % line)
526 526
527 def test_devtool_update_recipe_append(self):
528 # Check preconditions
529 workspacedir = os.path.join(self.builddir, 'workspace')
530 self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
531 testrecipe = 'mdadm'
532 recipefile = get_bb_var('FILE', testrecipe)
533 src_uri = get_bb_var('SRC_URI', testrecipe)
534 self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
535 result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
536 self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
537 # First, modify a recipe
538 tempdir = tempfile.mkdtemp(prefix='devtoolqa')
539 tempsrcdir = os.path.join(tempdir, 'source')
540 templayerdir = os.path.join(tempdir, 'layer')
541 self.track_for_cleanup(tempdir)
542 self.track_for_cleanup(workspacedir)
543 self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
544 # (don't bother with cleaning the recipe on teardown, we won't be building it)
545 result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir))
546 # Check git repo
547 self.assertTrue(os.path.isdir(os.path.join(tempsrcdir, '.git')), 'git repository for external source tree not found')
548 result = runCmd('git status --porcelain', cwd=tempsrcdir)
549 self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
550 result = runCmd('git symbolic-ref HEAD', cwd=tempsrcdir)
551 self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
552 # Add a commit
553 result = runCmd("sed 's!\\(#define VERSION\\W*\"[^\"]*\\)\"!\\1-custom\"!' -i ReadMe.c", cwd=tempsrcdir)
554 result = runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir)
555 self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe))
556 # Create a temporary layer and add it to bblayers.conf
557 self._create_temp_layer(templayerdir, True, 'selftestupdaterecipe')
558 # Create the bbappend
559 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
560 self.assertNotIn('WARNING:', result.output)
561 # Check recipe is still clean
562 result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
563 self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
564 # Check bbappend was created
565 splitpath = os.path.dirname(recipefile).split(os.sep)
566 appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1])
567 bbappendfile = self._check_bbappend(testrecipe, recipefile, appenddir)
568 patchfile = os.path.join(appenddir, testrecipe, '0001-Add-our-custom-version.patch')
569 self.assertTrue(os.path.exists(patchfile), 'Patch file not created')
570
571 # Check bbappend contents
572 expectedlines = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
573 '\n',
574 'SRC_URI += "file://0001-Add-our-custom-version.patch"\n',
575 '\n']
576 with open(bbappendfile, 'r') as f:
577 self.assertEqual(expectedlines, f.readlines())
578
579 # Check we can run it again and bbappend isn't modified
580 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
581 with open(bbappendfile, 'r') as f:
582 self.assertEqual(expectedlines, f.readlines())
583 # Drop new commit and check patch gets deleted
584 result = runCmd('git reset HEAD^', cwd=tempsrcdir)
585 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
586 self.assertFalse(os.path.exists(patchfile), 'Patch file not deleted')
587 expectedlines2 = ['FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n',
588 '\n']
589 with open(bbappendfile, 'r') as f:
590 self.assertEqual(expectedlines2, f.readlines())
591 # Put commit back and check we can run it if layer isn't in bblayers.conf
592 os.remove(bbappendfile)
593 result = runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir)
594 result = runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir)
595 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
596 self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output)
597 self.assertTrue(os.path.exists(patchfile), 'Patch file not created (with disabled layer)')
598 with open(bbappendfile, 'r') as f:
599 self.assertEqual(expectedlines, f.readlines())
600 # Deleting isn't expected to work under these circumstances
601
602 def test_devtool_update_recipe_append_git(self):
603 # Check preconditions
604 workspacedir = os.path.join(self.builddir, 'workspace')
605 self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
606 testrecipe = 'mtd-utils'
607 recipefile = get_bb_var('FILE', testrecipe)
608 src_uri = get_bb_var('SRC_URI', testrecipe)
609 self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
610 for entry in src_uri.split():
611 if entry.startswith('git://'):
612 git_uri = entry
613 break
614 result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
615 self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
616 # First, modify a recipe
617 tempdir = tempfile.mkdtemp(prefix='devtoolqa')
618 tempsrcdir = os.path.join(tempdir, 'source')
619 templayerdir = os.path.join(tempdir, 'layer')
620 self.track_for_cleanup(tempdir)
621 self.track_for_cleanup(workspacedir)
622 self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
623 # (don't bother with cleaning the recipe on teardown, we won't be building it)
624 result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir))
625 # Check git repo
626 self.assertTrue(os.path.isdir(os.path.join(tempsrcdir, '.git')), 'git repository for external source tree not found')
627 result = runCmd('git status --porcelain', cwd=tempsrcdir)
628 self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
629 result = runCmd('git symbolic-ref HEAD', cwd=tempsrcdir)
630 self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
631 # Add a commit
632 result = runCmd('echo "# Additional line" >> Makefile', cwd=tempsrcdir)
633 result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir)
634 self.add_command_to_tearDown('cd %s; rm -f %s/*.patch; git checkout .' % (os.path.dirname(recipefile), testrecipe))
635 # Create a temporary layer
636 os.makedirs(os.path.join(templayerdir, 'conf'))
637 with open(os.path.join(templayerdir, 'conf', 'layer.conf'), 'w') as f:
638 f.write('BBPATH .= ":${LAYERDIR}"\n')
639 f.write('BBFILES += "${LAYERDIR}/recipes-*/*/*.bbappend"\n')
640 f.write('BBFILE_COLLECTIONS += "oeselftesttemplayer"\n')
641 f.write('BBFILE_PATTERN_oeselftesttemplayer = "^${LAYERDIR}/"\n')
642 f.write('BBFILE_PRIORITY_oeselftesttemplayer = "999"\n')
643 f.write('BBFILE_PATTERN_IGNORE_EMPTY_oeselftesttemplayer = "1"\n')
644 self.add_command_to_tearDown('bitbake-layers remove-layer %s || true' % templayerdir)
645 result = runCmd('bitbake-layers add-layer %s' % templayerdir, cwd=self.builddir)
646 # Create the bbappend
647 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
648 self.assertNotIn('WARNING:', result.output)
649 # Check recipe is still clean
650 result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
651 self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
652 # Check bbappend was created
653 splitpath = os.path.dirname(recipefile).split(os.sep)
654 appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1])
655 bbappendfile = self._check_bbappend(testrecipe, recipefile, appenddir)
656 self.assertFalse(os.path.exists(os.path.join(appenddir, testrecipe)), 'Patch directory should not be created')
657
658 # Check bbappend contents
659 result = runCmd('git rev-parse HEAD', cwd=tempsrcdir)
660 expectedlines = ['SRCREV = "%s"\n' % result.output,
661 '\n',
662 'SRC_URI = "%s"\n' % git_uri,
663 '\n']
664 with open(bbappendfile, 'r') as f:
665 self.assertEqual(expectedlines, f.readlines())
666
667 # Check we can run it again and bbappend isn't modified
668 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
669 with open(bbappendfile, 'r') as f:
670 self.assertEqual(expectedlines, f.readlines())
671 # Drop new commit and check SRCREV changes
672 result = runCmd('git reset HEAD^', cwd=tempsrcdir)
673 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
674 self.assertFalse(os.path.exists(os.path.join(appenddir, testrecipe)), 'Patch directory should not be created')
675 result = runCmd('git rev-parse HEAD', cwd=tempsrcdir)
676 expectedlines = ['SRCREV = "%s"\n' % result.output,
677 '\n',
678 'SRC_URI = "%s"\n' % git_uri,
679 '\n']
680 with open(bbappendfile, 'r') as f:
681 self.assertEqual(expectedlines, f.readlines())
682 # Put commit back and check we can run it if layer isn't in bblayers.conf
683 os.remove(bbappendfile)
684 result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir)
685 result = runCmd('bitbake-layers remove-layer %s' % templayerdir, cwd=self.builddir)
686 result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
687 self.assertIn('WARNING: Specified layer is not currently enabled in bblayers.conf', result.output)
688 self.assertFalse(os.path.exists(os.path.join(appenddir, testrecipe)), 'Patch directory should not be created')
689 result = runCmd('git rev-parse HEAD', cwd=tempsrcdir)
690 expectedlines = ['SRCREV = "%s"\n' % result.output,
691 '\n',
692 'SRC_URI = "%s"\n' % git_uri,
693 '\n']
694 with open(bbappendfile, 'r') as f:
695 self.assertEqual(expectedlines, f.readlines())
696 # Deleting isn't expected to work under these circumstances
697
527 def test_devtool_extract(self): 698 def test_devtool_extract(self):
528 # Check preconditions 699 # Check preconditions
529 workspacedir = os.path.join(self.builddir, 'workspace') 700 workspacedir = os.path.join(self.builddir, 'workspace')