[OE-core] [meta-oe][PATCH] devtool: add sync command

Paul Eggleton paul.eggleton at linux.intel.com
Mon Oct 26 09:20:37 UTC 2015


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 <roylee17 at currantlabs.com>
> ---
>  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?


> +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?

Cheers,
Paul

-- 

Paul Eggleton
Intel Open Source Technology Centre



More information about the Openembedded-core mailing list