On Wed, Nov 4, 2015 at 7:48 AM, Paul Eggleton <[email protected] > wrote:
> On Monday 26 October 2015 10:29:24 Tzu-Jung Lee wrote: > > Hi Paul > > > > On Mon, Oct 26, 2015 at 2:20 AM, Paul Eggleton < > > > > [email protected]> wrote: > > > Hi Tzu-Jung, > > > > > > Thanks for the patch. > > > > > > On Wednesday 21 October 2015 23:06:45 Tzu-Jung Lee wrote: > > > > The sync command is similar to the extract command, except it > > > > fetches the sync'ed and patched branch to an existing git repository. > > > > > > > > This enables users to keep track the upstream development while > > > > maintaining their own local git repository at the same time. > > > > > > > > Signed-off-by: Tzu-Jung Lee <[email protected]> > > > > --- > > > > > > > > scripts/lib/devtool/standard.py | 73 > > > > > > > > +++++++++++++++++++++++++++++++---------- 1 file changed, 56 > > > > > > insertions(+), > > > > > > > 17 deletions(-) > > > > > > > > diff --git a/scripts/lib/devtool/standard.py > > > > b/scripts/lib/devtool/standard.py index 5d7e903..2c6b7b3 100644 > > > > --- a/scripts/lib/devtool/standard.py > > > > +++ b/scripts/lib/devtool/standard.py > > > > > > > > @@ -234,7 +234,29 @@ def extract(args, config, basepath, workspace): > > > > return 1 > > > > > > > > srctree = os.path.abspath(args.srctree) > > > > > > > > - initial_rev = _extract_source(srctree, args.keep_temp, > args.branch, > > > > > > rd) > > > > > > > + initial_rev = _extract_source(srctree, args.keep_temp, > args.branch, > > > > False, rd) > > > > + logger.info('Source tree extracted to %s' % srctree) > > > > + > > > > + if initial_rev: > > > > + return 0 > > > > + else: > > > > + return 1 > > > > > > Hmm, so your patch shows this check being added but it's there in > master. > > > Are > > > you patching an older version? > > > > Not really, it was patched against the tip of master. > > But git is sometimes confused by the boundary of back-to-back similar > > functions. > > So that checks are actually belongs to "def sync", which was copied from > > "def extract" > > > > def extract > > ... > > -------------------- > > > > | [checks] > > | > > | def sync > > | > > | ... > > > > -------------------- > > [checks] > > > > > +def sync(args, config, basepath, workspace): > > > > + """Entry point for the devtool 'sync' subcommand""" > > > > + import bb > > > > + > > > > + tinfoil = _prep_extract_operation(config, basepath, > > > > args.recipename) > > > > + if not tinfoil: > > > > + # Error already shown > > > > + return 1 > > > > + > > > > + rd = parse_recipe(config, tinfoil, args.recipename, True) > > > > + if not rd: > > > > + return 1 > > > > + > > > > + srctree = os.path.abspath(args.srctree) > > > > + initial_rev = _extract_source(srctree, args.keep_temp, > args.branch, > > > > True, rd) logger.info('Source tree extracted to %s' % srctree) > > > > > > > > if initial_rev: > > > > @@ -289,7 +311,7 @@ def _prep_extract_operation(config, basepath, > > > > recipename): return tinfoil > > > > > > > > > > > > -def _extract_source(srctree, keep_temp, devbranch, d): > > > > > > > > +def _extract_source(srctree, keep_temp, devbranch, sync, d): > > > > """Extract sources of a recipe""" > > > > import bb.event > > > > import oe.recipeutils > > > > > > > > @@ -308,21 +330,26 @@ def _extract_source(srctree, keep_temp, > devbranch, > > > > > > d): > > > > _check_compatible_recipe(pn, d) > > > > > > > > - if os.path.exists(srctree): > > > > - if not os.path.isdir(srctree): > > > > - raise DevtoolError("output path %s exists and is not a > > > > directory" % - srctree) > > > > - elif os.listdir(srctree): > > > > - raise DevtoolError("output path %s already exists and > is " > > > > - "non-empty" % srctree) > > > > + if sync: > > > > + if not os.path.exists(srctree): > > > > + raise DevtoolError("output path %s does not exist" % > > > > srctree) + else: > > > > + if os.path.exists(srctree): > > > > + if not os.path.isdir(srctree): > > > > + raise DevtoolError("output path %s exists and is > not a > > > > directory" % + srctree) > > > > + elif os.listdir(srctree): > > > > + raise DevtoolError("output path %s already exists > and > > > > > > is " > > > > > > > + "non-empty" % srctree) > > > > > > > > - if 'noexec' in (d.getVarFlags('do_unpack', False) or []): > > > > - raise DevtoolError("The %s recipe has do_unpack disabled, > > > > > > unable to > > > > > > > " - "extract source" % pn) > > > > + if 'noexec' in (d.getVarFlags('do_unpack', False) or []): > > > > + raise DevtoolError("The %s recipe has do_unpack > disabled, > > > > unable to " + "extract source" % pn) > > > > > > > > - # Prepare for shutil.move later on > > > > - bb.utils.mkdirhier(srctree) > > > > - os.rmdir(srctree) > > > > + if not sync: > > > > + # Prepare for shutil.move later on > > > > + bb.utils.mkdirhier(srctree) > > > > + os.rmdir(srctree) > > > > > > > > # We don't want notes to be printed, they are too verbose > > > > origlevel = bb.logger.getEffectiveLevel() > > > > > > > > @@ -431,8 +458,11 @@ def _extract_source(srctree, keep_temp, > devbranch, > > > > > > d): > > > > logger.info('Adding local source files to srctree...') > > > > shutil.move(os.path.join(tempdir, 'oe-local-files'), > > > > > > srcsubdir) > > > > > > > + if sync: > > > > + bb.process.run('git fetch file://' + srcsubdir + ' ' + > > > > devbranch + ':' + devbranch, cwd=srctree) > > > > + else: > > > > + shutil.move(srcsubdir, srctree) > > > > > > > > - shutil.move(srcsubdir, srctree) > > > > > > > > finally: > > > > bb.logger.setLevel(origlevel) > > > > > > > > @@ -532,7 +562,7 @@ def modify(args, config, basepath, workspace): > > > > commits = [] > > > > srctree = os.path.abspath(args.srctree) > > > > > > > > if args.extract: > > > > - initial_rev = _extract_source(args.srctree, False, > args.branch, > > > > > > rd) > > > > > > > + initial_rev = _extract_source(args.srctree, False, > args.branch, > > > > > > > > False, rd) if not initial_rev: > > > > return 1 > > > > > > > > logger.info('Source tree extracted to %s' % srctree) > > > > > > > > @@ -1107,6 +1137,15 @@ def register_commands(subparsers, context): > > > > parser_extract.add_argument('--keep-temp', action="store_true", > > > > > > > > help='Keep temporary directory (for debugging)') > > > > parser_extract.set_defaults(func=extract) > > > > > > > > + parser_sync = subparsers.add_parser('sync', help='Synchronize > the > > > > source for an existing recipe', + > > > > description='Synchronize the source for an existing recipe', + > > > > > > > > formatter_class=argparse.ArgumentDefaultsHelpFormatter) + > > > > parser_sync.add_argument('recipename', help='Name for recipe to sync > the > > > > source for') + parser_sync.add_argument('srctree', help='Path to > > > > where > > > > to sync the source tree') + parser_sync.add_argument('--branch', > > > > '-b', > > > > default="devtool", help='Name for development branch to checkout') + > > > > parser_sync.add_argument('--keep-temp', action="store_true", > help='Keep > > > > temporary directory (for debugging)') + > > > > parser_sync.set_defaults(func=sync) > > > > + > > > > > > > > parser_update_recipe = subparsers.add_parser('update-recipe', > > > > > > > > help='Apply changes from external source tree to recipe', > > > > description='Applies changes from external source tree to a recipe > > > > (updating/adding/removing patches as necessary, or by updating > SRCREV)') > > > > parser_update_recipe.add_argument('recipename', help='Name of recipe > to > > > > update') > > > > > > Exploring the use case a bit more, do you anticipate using this sync > > > command > > > in conjunction with a recipe that's in the workspace, or standalone? > > > > The use case is for workspace to keep git repos up-to-date. (Kind of > > rebasing) So the assumption is that the recipes have a corresponding git > > repository already, which could be an existing internal one, or a freshly > > constructed by an earlier devtool modify/extract. For standalone recipes, > > they can still go through the workspace :-) > > I guess what I was wondering was is there a way we can better fit this in > with > devtool's workflow for when the recipe is in the workspace. However, other > than > perhaps not expecting the path to the source tree when the recipe is in the > workspace I can't think of anything though. I guess we can always improve > it > later. > Maybe we can fit it like the following: 1. Start to modify a recipe by either: a. reusing an existing <srctree> $ devtool modify <recipename> <srctree> b. or creating a new one with the -x option $ devtool modify <recipename> -x <srctree> 2. Work on the <srctree> 3. After a while, the upstream of <recipename> moves forward before we contribute our changes back. 4. Sync up the upstream changes into <srctree> with a new branch <branchname> $ devtool sync <recipename> <srctree> --branch <branchname> 5. Rebase our working branch onto the tip of the upstream <branchname> $ git rebase <branchname> devtool [ Repeat 2 - 5 ] 6. Apply the changes back to the recipe. $ devtool update-recipe <branchname> - Roy > Acked-by: Paul Eggleton <[email protected]> > > Cheers, > Paul > > -- > > Paul Eggleton > Intel Open Source Technology Centre >
-- _______________________________________________ Openembedded-core mailing list [email protected] http://lists.openembedded.org/mailman/listinfo/openembedded-core
