summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2017-10-31 16:48:05 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-11-11 12:14:27 +0000
commit125e0b72b7b419368761ffbbf38987f91af4523b (patch)
tree82028e3ca3c653e516429731bbe9b90184f33a06 /scripts
parent9a80078e4b8e01d9bb49288f214f40e8497aa3ac (diff)
downloadpoky-125e0b72b7b419368761ffbbf38987f91af4523b.tar.gz
devtool: implement conditional patch handling
If you have a recipe that uses overrides to conditionally extend SRC_URI to add additional patches, then you will often need to update those patches if you're making other changes to the source tree (for example if you're upgrading the underlying source). Make this possible with devtool by creating devtool-override-* branches for each override that conditionally appends/prepends SRC_URI, and have devtool update-recipe / finish check each branch out in turn and update the corresponding patches. A current example of a recipe that does this is the quota recipe - it applies an additional patch if musl is the selected C library (i.e. libc-musl is in OVERRIDES). Note that use of this functionality does require some care - in particular, updates to patches that appear on the main branch (named "devtool" by default) should be made there and not only on one of the specific devtool-override-* branches that are created for each override. The recommended procedure is to make the changes you want to make to the main branch first, then check out and rebase each devtool-override-* branch, testing each one by activating the corresponding configuration, and then finally run devtool finish. Fixes [YOCTO #11516]. (From OE-Core rev: aa87603d1ffd695027847f4df75c0406cf4e14d8) Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/lib/devtool/standard.py176
-rw-r--r--scripts/lib/devtool/upgrade.py3
2 files changed, 153 insertions, 26 deletions
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index d55d504a14..26187a0c41 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -35,6 +35,8 @@ from devtool import parse_recipe
35 35
36logger = logging.getLogger('devtool') 36logger = logging.getLogger('devtool')
37 37
38override_branch_prefix = 'devtool-override-'
39
38 40
39def add(args, config, basepath, workspace): 41def add(args, config, basepath, workspace):
40 """Entry point for the devtool 'add' subcommand""" 42 """Entry point for the devtool 'add' subcommand"""
@@ -425,7 +427,7 @@ def extract(args, config, basepath, workspace):
425 """Entry point for the devtool 'extract' subcommand""" 427 """Entry point for the devtool 'extract' subcommand"""
426 import bb 428 import bb
427 429
428 tinfoil = setup_tinfoil(basepath=basepath) 430 tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
429 if not tinfoil: 431 if not tinfoil:
430 # Error already shown 432 # Error already shown
431 return 1 433 return 1
@@ -435,7 +437,7 @@ def extract(args, config, basepath, workspace):
435 return 1 437 return 1
436 438
437 srctree = os.path.abspath(args.srctree) 439 srctree = os.path.abspath(args.srctree)
438 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, False, config, basepath, workspace, args.fixed_setup, rd, tinfoil) 440 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, False, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=args.no_overrides)
439 logger.info('Source tree extracted to %s' % srctree) 441 logger.info('Source tree extracted to %s' % srctree)
440 442
441 if initial_rev: 443 if initial_rev:
@@ -449,7 +451,7 @@ def sync(args, config, basepath, workspace):
449 """Entry point for the devtool 'sync' subcommand""" 451 """Entry point for the devtool 'sync' subcommand"""
450 import bb 452 import bb
451 453
452 tinfoil = setup_tinfoil(basepath=basepath) 454 tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
453 if not tinfoil: 455 if not tinfoil:
454 # Error already shown 456 # Error already shown
455 return 1 457 return 1
@@ -459,7 +461,7 @@ def sync(args, config, basepath, workspace):
459 return 1 461 return 1
460 462
461 srctree = os.path.abspath(args.srctree) 463 srctree = os.path.abspath(args.srctree)
462 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, True, config, basepath, workspace, args.fixed_setup, rd, tinfoil) 464 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, True, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=True)
463 logger.info('Source tree %s synchronized' % srctree) 465 logger.info('Source tree %s synchronized' % srctree)
464 466
465 if initial_rev: 467 if initial_rev:
@@ -470,7 +472,7 @@ def sync(args, config, basepath, workspace):
470 tinfoil.shutdown() 472 tinfoil.shutdown()
471 473
472 474
473def _extract_source(srctree, keep_temp, devbranch, sync, config, basepath, workspace, fixed_setup, d, tinfoil): 475def _extract_source(srctree, keep_temp, devbranch, sync, config, basepath, workspace, fixed_setup, d, tinfoil, no_overrides=False):
474 """Extract sources of a recipe""" 476 """Extract sources of a recipe"""
475 import oe.recipeutils 477 import oe.recipeutils
476 import oe.patch 478 import oe.patch
@@ -500,6 +502,16 @@ def _extract_source(srctree, keep_temp, devbranch, sync, config, basepath, works
500 bb.utils.mkdirhier(srctree) 502 bb.utils.mkdirhier(srctree)
501 os.rmdir(srctree) 503 os.rmdir(srctree)
502 504
505 extra_overrides = []
506 if not no_overrides:
507 history = d.varhistory.variable('SRC_URI')
508 for event in history:
509 if not 'flag' in event:
510 if event['op'].startswith(('_append[', '_prepend[')):
511 extra_overrides.append(event['op'].split('[')[1].split(']')[0])
512 if extra_overrides:
513 logger.info('SRC_URI contains some conditional appends/prepends - will create branches to represent these')
514
503 initial_rev = None 515 initial_rev = None
504 516
505 appendexisted = False 517 appendexisted = False
@@ -542,6 +554,8 @@ def _extract_source(srctree, keep_temp, devbranch, sync, config, basepath, works
542 if not is_kernel_yocto: 554 if not is_kernel_yocto:
543 f.write('PATCHTOOL = "git"\n') 555 f.write('PATCHTOOL = "git"\n')
544 f.write('PATCH_COMMIT_FUNCTIONS = "1"\n') 556 f.write('PATCH_COMMIT_FUNCTIONS = "1"\n')
557 if extra_overrides:
558 f.write('DEVTOOL_EXTRA_OVERRIDES = "%s"\n' % ':'.join(extra_overrides))
545 f.write('inherit devtool-source\n') 559 f.write('inherit devtool-source\n')
546 f.write('###--- _extract_source\n') 560 f.write('###--- _extract_source\n')
547 561
@@ -702,12 +716,13 @@ def modify(args, config, basepath, workspace):
702 """Entry point for the devtool 'modify' subcommand""" 716 """Entry point for the devtool 'modify' subcommand"""
703 import bb 717 import bb
704 import oe.recipeutils 718 import oe.recipeutils
719 import oe.patch
705 720
706 if args.recipename in workspace: 721 if args.recipename in workspace:
707 raise DevtoolError("recipe %s is already in your workspace" % 722 raise DevtoolError("recipe %s is already in your workspace" %
708 args.recipename) 723 args.recipename)
709 724
710 tinfoil = setup_tinfoil(basepath=basepath) 725 tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
711 try: 726 try:
712 rd = parse_recipe(config, tinfoil, args.recipename, True) 727 rd = parse_recipe(config, tinfoil, args.recipename, True)
713 if not rd: 728 if not rd:
@@ -742,14 +757,16 @@ def modify(args, config, basepath, workspace):
742 757
743 initial_rev = None 758 initial_rev = None
744 commits = [] 759 commits = []
760 check_commits = False
745 if not args.no_extract: 761 if not args.no_extract:
746 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, False, config, basepath, workspace, args.fixed_setup, rd, tinfoil) 762 initial_rev, _ = _extract_source(srctree, args.keep_temp, args.branch, False, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=args.no_overrides)
747 if not initial_rev: 763 if not initial_rev:
748 return 1 764 return 1
749 logger.info('Source tree extracted to %s' % srctree) 765 logger.info('Source tree extracted to %s' % srctree)
750 # Get list of commits since this revision 766 # Get list of commits since this revision
751 (stdout, _) = bb.process.run('git rev-list --reverse %s..HEAD' % initial_rev, cwd=srctree) 767 (stdout, _) = bb.process.run('git rev-list --reverse %s..HEAD' % initial_rev, cwd=srctree)
752 commits = stdout.split() 768 commits = stdout.split()
769 check_commits = True
753 else: 770 else:
754 if os.path.exists(os.path.join(srctree, '.git')): 771 if os.path.exists(os.path.join(srctree, '.git')):
755 # Check if it's a tree previously extracted by us 772 # Check if it's a tree previously extracted by us
@@ -757,6 +774,8 @@ def modify(args, config, basepath, workspace):
757 (stdout, _) = bb.process.run('git branch --contains devtool-base', cwd=srctree) 774 (stdout, _) = bb.process.run('git branch --contains devtool-base', cwd=srctree)
758 except bb.process.ExecutionError: 775 except bb.process.ExecutionError:
759 stdout = '' 776 stdout = ''
777 if stdout:
778 check_commits = True
760 for line in stdout.splitlines(): 779 for line in stdout.splitlines():
761 if line.startswith('*'): 780 if line.startswith('*'):
762 (stdout, _) = bb.process.run('git rev-parse devtool-base', cwd=srctree) 781 (stdout, _) = bb.process.run('git rev-parse devtool-base', cwd=srctree)
@@ -766,6 +785,30 @@ def modify(args, config, basepath, workspace):
766 (stdout, _) = bb.process.run('git rev-parse HEAD', cwd=srctree) 785 (stdout, _) = bb.process.run('git rev-parse HEAD', cwd=srctree)
767 initial_rev = stdout.rstrip() 786 initial_rev = stdout.rstrip()
768 787
788 branch_patches = {}
789 if check_commits:
790 # Check if there are override branches
791 (stdout, _) = bb.process.run('git branch', cwd=srctree)
792 branches = []
793 for line in stdout.rstrip().splitlines():
794 branchname = line[2:].rstrip()
795 if branchname.startswith(override_branch_prefix):
796 branches.append(branchname)
797 if branches:
798 logger.warn('SRC_URI is conditionally overridden in this recipe, thus several %s* branches have been created, one for each override that makes changes to SRC_URI. It is recommended that you make changes to the %s branch first, then checkout and rebase each %s* branch and update any unique patches there (duplicates on those branches will be ignored by devtool finish/update-recipe)' % (override_branch_prefix, args.branch, override_branch_prefix))
799 branches.insert(0, args.branch)
800 seen_patches = []
801 for branch in branches:
802 branch_patches[branch] = []
803 (stdout, _) = bb.process.run('git log devtool-base..%s' % branch, cwd=srctree)
804 for line in stdout.splitlines():
805 line = line.strip()
806 if line.startswith(oe.patch.GitApplyTree.patch_line_prefix):
807 origpatch = line[len(oe.patch.GitApplyTree.patch_line_prefix):].split(':', 1)[-1].strip()
808 if not origpatch in seen_patches:
809 seen_patches.append(origpatch)
810 branch_patches[branch].append(origpatch)
811
769 # Need to grab this here in case the source is within a subdirectory 812 # Need to grab this here in case the source is within a subdirectory
770 srctreebase = srctree 813 srctreebase = srctree
771 814
@@ -808,6 +851,11 @@ def modify(args, config, basepath, workspace):
808 f.write('\n# initial_rev: %s\n' % initial_rev) 851 f.write('\n# initial_rev: %s\n' % initial_rev)
809 for commit in commits: 852 for commit in commits:
810 f.write('# commit: %s\n' % commit) 853 f.write('# commit: %s\n' % commit)
854 if branch_patches:
855 for branch in branch_patches:
856 if branch == args.branch:
857 continue
858 f.write('# patches_%s: %s\n' % (branch, ','.join(branch_patches[branch])))
811 859
812 update_unlockedsigs(basepath, workspace, args.fixed_setup, [pn]) 860 update_unlockedsigs(basepath, workspace, args.fixed_setup, [pn])
813 861
@@ -1019,8 +1067,14 @@ def _get_patchset_revs(srctree, recipe_path, initial_rev=None):
1019 """ 1067 """
1020 import bb 1068 import bb
1021 1069
1070 # Get current branch
1071 stdout, _ = bb.process.run('git rev-parse --abbrev-ref HEAD',
1072 cwd=srctree)
1073 branchname = stdout.rstrip()
1074
1022 # Parse initial rev from recipe if not specified 1075 # Parse initial rev from recipe if not specified
1023 commits = [] 1076 commits = []
1077 patches = []
1024 with open(recipe_path, 'r') as f: 1078 with open(recipe_path, 'r') as f:
1025 for line in f: 1079 for line in f:
1026 if line.startswith('# initial_rev:'): 1080 if line.startswith('# initial_rev:'):
@@ -1028,6 +1082,8 @@ def _get_patchset_revs(srctree, recipe_path, initial_rev=None):
1028 initial_rev = line.split(':')[-1].strip() 1082 initial_rev = line.split(':')[-1].strip()
1029 elif line.startswith('# commit:'): 1083 elif line.startswith('# commit:'):
1030 commits.append(line.split(':')[-1].strip()) 1084 commits.append(line.split(':')[-1].strip())
1085 elif line.startswith('# patches_%s:' % branchname):
1086 patches = line.split(':')[-1].strip().split(',')
1031 1087
1032 update_rev = initial_rev 1088 update_rev = initial_rev
1033 changed_revs = None 1089 changed_revs = None
@@ -1054,7 +1110,7 @@ def _get_patchset_revs(srctree, recipe_path, initial_rev=None):
1054 if rev in newcommits: 1110 if rev in newcommits:
1055 changed_revs.append(rev) 1111 changed_revs.append(rev)
1056 1112
1057 return initial_rev, update_rev, changed_revs 1113 return initial_rev, update_rev, changed_revs, patches
1058 1114
1059def _remove_file_entries(srcuri, filelist): 1115def _remove_file_entries(srcuri, filelist):
1060 """Remove file:// entries from SRC_URI""" 1116 """Remove file:// entries from SRC_URI"""
@@ -1126,6 +1182,7 @@ def _export_patches(srctree, rd, start_rev, destdir, changed_revs=None):
1126 1182
1127 existing_patches = dict((os.path.basename(path), path) for path in 1183 existing_patches = dict((os.path.basename(path), path) for path in
1128 oe.recipeutils.get_recipe_patches(rd)) 1184 oe.recipeutils.get_recipe_patches(rd))
1185 logger.debug('Existing patches: %s' % existing_patches)
1129 1186
1130 # Generate patches from Git, exclude local files directory 1187 # Generate patches from Git, exclude local files directory
1131 patch_pathspec = _git_exclude_path(srctree, 'oe-local-files') 1188 patch_pathspec = _git_exclude_path(srctree, 'oe-local-files')
@@ -1414,7 +1471,7 @@ def _update_recipe_patch(recipename, workspace, srctree, rd, appendlayerdir, wil
1414 raise DevtoolError('unable to find workspace bbappend for recipe %s' % 1471 raise DevtoolError('unable to find workspace bbappend for recipe %s' %
1415 recipename) 1472 recipename)
1416 1473
1417 initial_rev, update_rev, changed_revs = _get_patchset_revs(srctree, append, initial_rev) 1474 initial_rev, update_rev, changed_revs, filter_patches = _get_patchset_revs(srctree, append, initial_rev)
1418 if not initial_rev: 1475 if not initial_rev:
1419 raise DevtoolError('Unable to find initial revision - please specify ' 1476 raise DevtoolError('Unable to find initial revision - please specify '
1420 'it with --initial-rev') 1477 'it with --initial-rev')
@@ -1429,22 +1486,32 @@ def _update_recipe_patch(recipename, workspace, srctree, rd, appendlayerdir, wil
1429 tempdir = tempfile.mkdtemp(prefix='devtool') 1486 tempdir = tempfile.mkdtemp(prefix='devtool')
1430 try: 1487 try:
1431 local_files_dir = tempfile.mkdtemp(dir=tempdir) 1488 local_files_dir = tempfile.mkdtemp(dir=tempdir)
1432 srctreebase = workspace[recipename]['srctreebase'] 1489 if filter_patches:
1433 upd_f, new_f, del_f = _export_local_files(srctree, rd, local_files_dir, srctreebase) 1490 upd_f = {}
1491 new_f = {}
1492 del_f = {}
1493 else:
1494 srctreebase = workspace[recipename]['srctreebase']
1495 upd_f, new_f, del_f = _export_local_files(srctree, rd, local_files_dir, srctreebase)
1434 1496
1435 remove_files = [] 1497 remove_files = []
1436 if not no_remove: 1498 if not no_remove:
1437 # Get all patches from source tree and check if any should be removed 1499 # Get all patches from source tree and check if any should be removed
1438 all_patches_dir = tempfile.mkdtemp(dir=tempdir) 1500 all_patches_dir = tempfile.mkdtemp(dir=tempdir)
1439 upd_p, new_p, del_p = _export_patches(srctree, rd, initial_rev, 1501 _, _, del_p = _export_patches(srctree, rd, initial_rev,
1440 all_patches_dir) 1502 all_patches_dir)
1441 # Remove deleted local files and patches 1503 # Remove deleted local files and patches
1442 remove_files = list(del_f.values()) + list(del_p.values()) 1504 remove_files = list(del_f.values()) + list(del_p.values())
1443 1505
1444 # Get updated patches from source tree 1506 # Get updated patches from source tree
1445 patches_dir = tempfile.mkdtemp(dir=tempdir) 1507 patches_dir = tempfile.mkdtemp(dir=tempdir)
1446 upd_p, new_p, del_p = _export_patches(srctree, rd, update_rev, 1508 upd_p, new_p, _ = _export_patches(srctree, rd, update_rev,
1447 patches_dir, changed_revs) 1509 patches_dir, changed_revs)
1510 logger.debug('Pre-filtering: update: %s, new: %s' % (dict(upd_p), dict(new_p)))
1511 if filter_patches:
1512 new_p = {}
1513 upd_p = {k:v for k,v in upd_p.items() if k in filter_patches}
1514 remove_files = [f for f in remove_files if f in filter_patches]
1448 updatefiles = False 1515 updatefiles = False
1449 updaterecipe = False 1516 updaterecipe = False
1450 destpath = None 1517 destpath = None
@@ -1556,18 +1623,73 @@ def _guess_recipe_update_mode(srctree, rdata):
1556 1623
1557 return 'patch' 1624 return 'patch'
1558 1625
1559def _update_recipe(recipename, workspace, rd, mode, appendlayerdir, wildcard_version, no_remove, initial_rev, no_report_remove=False, dry_run_outdir=None): 1626def _update_recipe(recipename, workspace, rd, mode, appendlayerdir, wildcard_version, no_remove, initial_rev, no_report_remove=False, dry_run_outdir=None, no_overrides=False):
1560 srctree = workspace[recipename]['srctree'] 1627 srctree = workspace[recipename]['srctree']
1561 if mode == 'auto': 1628 if mode == 'auto':
1562 mode = _guess_recipe_update_mode(srctree, rd) 1629 mode = _guess_recipe_update_mode(srctree, rd)
1563 1630
1564 if mode == 'srcrev': 1631 override_branches = []
1565 updated, appendfile, removed = _update_recipe_srcrev(recipename, workspace, srctree, rd, appendlayerdir, wildcard_version, no_remove, no_report_remove, dry_run_outdir) 1632 mainbranch = None
1566 elif mode == 'patch': 1633 startbranch = None
1567 updated, appendfile, removed = _update_recipe_patch(recipename, workspace, srctree, rd, appendlayerdir, wildcard_version, no_remove, no_report_remove, initial_rev, dry_run_outdir) 1634 if not no_overrides:
1568 else: 1635 stdout, _ = bb.process.run('git branch', cwd=srctree)
1569 raise DevtoolError('update_recipe: invalid mode %s' % mode) 1636 other_branches = []
1570 return updated, appendfile, removed 1637 for line in stdout.splitlines():
1638 branchname = line[2:]
1639 if line.startswith('* '):
1640 startbranch = branchname
1641 if branchname.startswith(override_branch_prefix):
1642 override_branches.append(branchname)
1643 else:
1644 other_branches.append(branchname)
1645
1646 if override_branches:
1647 logger.debug('_update_recipe: override branches: %s' % override_branches)
1648 logger.debug('_update_recipe: other branches: %s' % other_branches)
1649 if startbranch.startswith(override_branch_prefix):
1650 if len(other_branches) == 1:
1651 mainbranch = other_branches[1]
1652 else:
1653 raise DevtoolError('Unable to determine main branch - please check out the main branch in source tree first')
1654 else:
1655 mainbranch = startbranch
1656
1657 checkedout = None
1658 anyupdated = False
1659 appendfile = None
1660 allremoved = []
1661 if override_branches:
1662 logger.info('Handling main branch (%s)...' % mainbranch)
1663 if startbranch != mainbranch:
1664 bb.process.run('git checkout %s' % mainbranch, cwd=srctree)
1665 checkedout = mainbranch
1666 try:
1667 branchlist = [mainbranch] + override_branches
1668 for branch in branchlist:
1669 crd = bb.data.createCopy(rd)
1670 if branch != mainbranch:
1671 logger.info('Handling branch %s...' % branch)
1672 override = branch[len(override_branch_prefix):]
1673 crd.appendVar('OVERRIDES', ':%s' % override)
1674 bb.process.run('git checkout %s' % branch, cwd=srctree)
1675 checkedout = branch
1676
1677 if mode == 'srcrev':
1678 updated, appendf, removed = _update_recipe_srcrev(recipename, workspace, srctree, crd, appendlayerdir, wildcard_version, no_remove, no_report_remove, dry_run_outdir)
1679 elif mode == 'patch':
1680 updated, appendf, removed = _update_recipe_patch(recipename, workspace, srctree, crd, appendlayerdir, wildcard_version, no_remove, no_report_remove, initial_rev, dry_run_outdir)
1681 else:
1682 raise DevtoolError('update_recipe: invalid mode %s' % mode)
1683 if updated:
1684 anyupdated = True
1685 if appendf:
1686 appendfile = appendf
1687 allremoved.extend(removed)
1688 finally:
1689 if startbranch and checkedout != startbranch:
1690 bb.process.run('git checkout %s' % startbranch, cwd=srctree)
1691
1692 return anyupdated, appendfile, allremoved
1571 1693
1572def update_recipe(args, config, basepath, workspace): 1694def update_recipe(args, config, basepath, workspace):
1573 """Entry point for the devtool 'update-recipe' subcommand""" 1695 """Entry point for the devtool 'update-recipe' subcommand"""
@@ -1593,7 +1715,7 @@ def update_recipe(args, config, basepath, workspace):
1593 if args.dry_run: 1715 if args.dry_run:
1594 dry_run_output = tempfile.TemporaryDirectory(prefix='devtool') 1716 dry_run_output = tempfile.TemporaryDirectory(prefix='devtool')
1595 dry_run_outdir = dry_run_output.name 1717 dry_run_outdir = dry_run_output.name
1596 updated, _, _ = _update_recipe(args.recipename, workspace, rd, args.mode, args.append, args.wildcard_version, args.no_remove, args.initial_rev, dry_run_outdir=dry_run_outdir) 1718 updated, _, _ = _update_recipe(args.recipename, workspace, rd, args.mode, args.append, args.wildcard_version, args.no_remove, args.initial_rev, dry_run_outdir=dry_run_outdir, no_overrides=args.no_overrides)
1597 1719
1598 if updated: 1720 if updated:
1599 rf = rd.getVar('FILE') 1721 rf = rd.getVar('FILE')
@@ -1816,7 +1938,7 @@ def finish(args, config, basepath, workspace):
1816 if args.dry_run: 1938 if args.dry_run:
1817 dry_run_output = tempfile.TemporaryDirectory(prefix='devtool') 1939 dry_run_output = tempfile.TemporaryDirectory(prefix='devtool')
1818 dry_run_outdir = dry_run_output.name 1940 dry_run_outdir = dry_run_output.name
1819 updated, appendfile, removed = _update_recipe(args.recipename, workspace, rd, args.mode, appendlayerdir, wildcard_version=True, no_remove=False, no_report_remove=removing_original, initial_rev=args.initial_rev, dry_run_outdir=dry_run_outdir) 1941 updated, appendfile, removed = _update_recipe(args.recipename, workspace, rd, args.mode, appendlayerdir, wildcard_version=True, no_remove=False, no_report_remove=removing_original, initial_rev=args.initial_rev, dry_run_outdir=dry_run_outdir, no_overrides=args.no_overrides)
1820 removed = [os.path.relpath(pth, recipedir) for pth in removed] 1942 removed = [os.path.relpath(pth, recipedir) for pth in removed]
1821 1943
1822 # Remove any old files in the case of an upgrade 1944 # Remove any old files in the case of an upgrade
@@ -1959,6 +2081,7 @@ def register_commands(subparsers, context):
1959 group.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true") 2081 group.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true")
1960 group.add_argument('--no-same-dir', help='Force build in a separate build directory', action="store_true") 2082 group.add_argument('--no-same-dir', help='Force build in a separate build directory', action="store_true")
1961 parser_modify.add_argument('--branch', '-b', default="devtool", help='Name for development branch to checkout (when not using -n/--no-extract) (default "%(default)s")') 2083 parser_modify.add_argument('--branch', '-b', default="devtool", help='Name for development branch to checkout (when not using -n/--no-extract) (default "%(default)s")')
2084 parser_modify.add_argument('--no-overrides', '-O', action="store_true", help='Do not create branches for other override configurations')
1962 parser_modify.add_argument('--keep-temp', help='Keep temporary directory (for debugging)', action="store_true") 2085 parser_modify.add_argument('--keep-temp', help='Keep temporary directory (for debugging)', action="store_true")
1963 parser_modify.set_defaults(func=modify, fixed_setup=context.fixed_setup) 2086 parser_modify.set_defaults(func=modify, fixed_setup=context.fixed_setup)
1964 2087
@@ -1968,6 +2091,7 @@ def register_commands(subparsers, context):
1968 parser_extract.add_argument('recipename', help='Name of recipe to extract the source for') 2091 parser_extract.add_argument('recipename', help='Name of recipe to extract the source for')
1969 parser_extract.add_argument('srctree', help='Path to where to extract the source tree') 2092 parser_extract.add_argument('srctree', help='Path to where to extract the source tree')
1970 parser_extract.add_argument('--branch', '-b', default="devtool", help='Name for development branch to checkout (default "%(default)s")') 2093 parser_extract.add_argument('--branch', '-b', default="devtool", help='Name for development branch to checkout (default "%(default)s")')
2094 parser_extract.add_argument('--no-overrides', '-O', action="store_true", help='Do not create branches for other override configurations')
1971 parser_extract.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)') 2095 parser_extract.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)')
1972 parser_extract.set_defaults(func=extract, fixed_setup=context.fixed_setup) 2096 parser_extract.set_defaults(func=extract, fixed_setup=context.fixed_setup)
1973 2097
@@ -1999,6 +2123,7 @@ def register_commands(subparsers, context):
1999 parser_update_recipe.add_argument('--append', '-a', help='Write changes to a bbappend in the specified layer instead of the recipe', metavar='LAYERDIR') 2123 parser_update_recipe.add_argument('--append', '-a', help='Write changes to a bbappend in the specified layer instead of the recipe', metavar='LAYERDIR')
2000 parser_update_recipe.add_argument('--wildcard-version', '-w', help='In conjunction with -a/--append, use a wildcard to make the bbappend apply to any recipe version', action='store_true') 2124 parser_update_recipe.add_argument('--wildcard-version', '-w', help='In conjunction with -a/--append, use a wildcard to make the bbappend apply to any recipe version', action='store_true')
2001 parser_update_recipe.add_argument('--no-remove', '-n', action="store_true", help='Don\'t remove patches, only add or update') 2125 parser_update_recipe.add_argument('--no-remove', '-n', action="store_true", help='Don\'t remove patches, only add or update')
2126 parser_update_recipe.add_argument('--no-overrides', '-O', action="store_true", help='Do not handle other override branches (if they exist)')
2002 parser_update_recipe.add_argument('--dry-run', '-N', action="store_true", help='Dry-run (just report changes instead of writing them)') 2127 parser_update_recipe.add_argument('--dry-run', '-N', action="store_true", help='Dry-run (just report changes instead of writing them)')
2003 parser_update_recipe.set_defaults(func=update_recipe) 2128 parser_update_recipe.set_defaults(func=update_recipe)
2004 2129
@@ -2023,5 +2148,6 @@ def register_commands(subparsers, context):
2023 parser_finish.add_argument('--mode', '-m', choices=['patch', 'srcrev', 'auto'], default='auto', help='Update mode (where %(metavar)s is %(choices)s; default is %(default)s)', metavar='MODE') 2148 parser_finish.add_argument('--mode', '-m', choices=['patch', 'srcrev', 'auto'], default='auto', help='Update mode (where %(metavar)s is %(choices)s; default is %(default)s)', metavar='MODE')
2024 parser_finish.add_argument('--initial-rev', help='Override starting revision for patches') 2149 parser_finish.add_argument('--initial-rev', help='Override starting revision for patches')
2025 parser_finish.add_argument('--force', '-f', action="store_true", help='Force continuing even if there are uncommitted changes in the source tree repository') 2150 parser_finish.add_argument('--force', '-f', action="store_true", help='Force continuing even if there are uncommitted changes in the source tree repository')
2151 parser_finish.add_argument('--no-overrides', '-O', action="store_true", help='Do not handle other override branches (if they exist)')
2026 parser_finish.add_argument('--dry-run', '-N', action="store_true", help='Dry-run (just report changes instead of writing them)') 2152 parser_finish.add_argument('--dry-run', '-N', action="store_true", help='Dry-run (just report changes instead of writing them)')
2027 parser_finish.set_defaults(func=finish) 2153 parser_finish.set_defaults(func=finish)
diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py
index 3cb523c2f4..f6141bfdc3 100644
--- a/scripts/lib/devtool/upgrade.py
+++ b/scripts/lib/devtool/upgrade.py
@@ -474,7 +474,7 @@ def upgrade(args, config, basepath, workspace):
474 rf = None 474 rf = None
475 try: 475 try:
476 logger.info('Extracting current version source...') 476 logger.info('Extracting current version source...')
477 rev1, srcsubdir1 = standard._extract_source(srctree, False, 'devtool-orig', False, config, basepath, workspace, args.fixed_setup, rd, tinfoil) 477 rev1, srcsubdir1 = standard._extract_source(srctree, False, 'devtool-orig', False, config, basepath, workspace, args.fixed_setup, rd, tinfoil, no_overrides=args.no_overrides)
478 logger.info('Extracting upgraded version source...') 478 logger.info('Extracting upgraded version source...')
479 rev2, md5, sha256, srcbranch, srcsubdir2 = _extract_new_source(args.version, srctree, args.no_patch, 479 rev2, md5, sha256, srcbranch, srcsubdir2 = _extract_new_source(args.version, srctree, args.no_patch,
480 args.srcrev, args.srcbranch, args.branch, args.keep_temp, 480 args.srcrev, args.srcbranch, args.branch, args.keep_temp,
@@ -513,6 +513,7 @@ def register_commands(subparsers, context):
513 parser_upgrade.add_argument('--srcbranch', '-B', help='Branch in source repository containing the revision to use (if fetching from an SCM such as git)') 513 parser_upgrade.add_argument('--srcbranch', '-B', help='Branch in source repository containing the revision to use (if fetching from an SCM such as git)')
514 parser_upgrade.add_argument('--branch', '-b', default="devtool", help='Name for new development branch to checkout (default "%(default)s")') 514 parser_upgrade.add_argument('--branch', '-b', default="devtool", help='Name for new development branch to checkout (default "%(default)s")')
515 parser_upgrade.add_argument('--no-patch', action="store_true", help='Do not apply patches from the recipe to the new source code') 515 parser_upgrade.add_argument('--no-patch', action="store_true", help='Do not apply patches from the recipe to the new source code')
516 parser_upgrade.add_argument('--no-overrides', '-O', action="store_true", help='Do not create branches for other override configurations')
516 group = parser_upgrade.add_mutually_exclusive_group() 517 group = parser_upgrade.add_mutually_exclusive_group()
517 group.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true") 518 group.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true")
518 group.add_argument('--no-same-dir', help='Force build in a separate build directory', action="store_true") 519 group.add_argument('--no-same-dir', help='Force build in a separate build directory', action="store_true")