summaryrefslogtreecommitdiffstats
path: root/scripts/lib/devtool/standard.py
diff options
context:
space:
mode:
authorTzu-Jung Lee <roylee17@currantlabs.com>2015-11-09 02:30:32 -0800
committerRichard Purdie <richard.purdie@linuxfoundation.org>2015-11-25 08:08:09 +0000
commit8ae27fa07be08b2c841d8e9a29ea1c909136f170 (patch)
treef796f53e07debd9644cd7442f64b74af424a5d4a /scripts/lib/devtool/standard.py
parent6bfa1dcc6ee28e6137359d9d32a4f6fe45bddb03 (diff)
downloadpoky-8ae27fa07be08b2c841d8e9a29ea1c909136f170.tar.gz
devtool: add sync command
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. (From OE-Core rev: e2fe4c99f1020a20b579832c4feafcd0e9bc2f75) Signed-off-by: Tzu-Jung Lee <roylee17@currantlabs.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/lib/devtool/standard.py')
-rw-r--r--scripts/lib/devtool/standard.py100
1 files changed, 79 insertions, 21 deletions
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index 1285974d44..7d7c77a6e9 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -238,7 +238,29 @@ def extract(args, config, basepath, workspace):
238 return 1 238 return 1
239 239
240 srctree = os.path.abspath(args.srctree) 240 srctree = os.path.abspath(args.srctree)
241 initial_rev = _extract_source(srctree, args.keep_temp, args.branch, rd) 241 initial_rev = _extract_source(srctree, args.keep_temp, args.branch, False, rd)
242 logger.info('Source tree extracted to %s' % srctree)
243
244 if initial_rev:
245 return 0
246 else:
247 return 1
248
249def sync(args, config, basepath, workspace):
250 """Entry point for the devtool 'sync' subcommand"""
251 import bb
252
253 tinfoil = _prep_extract_operation(config, basepath, args.recipename)
254 if not tinfoil:
255 # Error already shown
256 return 1
257
258 rd = parse_recipe(config, tinfoil, args.recipename, True)
259 if not rd:
260 return 1
261
262 srctree = os.path.abspath(args.srctree)
263 initial_rev = _extract_source(srctree, args.keep_temp, args.branch, True, rd)
242 logger.info('Source tree extracted to %s' % srctree) 264 logger.info('Source tree extracted to %s' % srctree)
243 265
244 if initial_rev: 266 if initial_rev:
@@ -293,7 +315,7 @@ def _prep_extract_operation(config, basepath, recipename):
293 return tinfoil 315 return tinfoil
294 316
295 317
296def _extract_source(srctree, keep_temp, devbranch, d): 318def _extract_source(srctree, keep_temp, devbranch, sync, d):
297 """Extract sources of a recipe""" 319 """Extract sources of a recipe"""
298 import bb.event 320 import bb.event
299 import oe.recipeutils 321 import oe.recipeutils
@@ -312,21 +334,26 @@ def _extract_source(srctree, keep_temp, devbranch, d):
312 334
313 _check_compatible_recipe(pn, d) 335 _check_compatible_recipe(pn, d)
314 336
315 if os.path.exists(srctree): 337 if sync:
316 if not os.path.isdir(srctree): 338 if not os.path.exists(srctree):
317 raise DevtoolError("output path %s exists and is not a directory" % 339 raise DevtoolError("output path %s does not exist" % srctree)
318 srctree) 340 else:
319 elif os.listdir(srctree): 341 if os.path.exists(srctree):
320 raise DevtoolError("output path %s already exists and is " 342 if not os.path.isdir(srctree):
321 "non-empty" % srctree) 343 raise DevtoolError("output path %s exists and is not a directory" %
344 srctree)
345 elif os.listdir(srctree):
346 raise DevtoolError("output path %s already exists and is "
347 "non-empty" % srctree)
322 348
323 if 'noexec' in (d.getVarFlags('do_unpack', False) or []): 349 if 'noexec' in (d.getVarFlags('do_unpack', False) or []):
324 raise DevtoolError("The %s recipe has do_unpack disabled, unable to " 350 raise DevtoolError("The %s recipe has do_unpack disabled, unable to "
325 "extract source" % pn) 351 "extract source" % pn)
326 352
327 # Prepare for shutil.move later on 353 if not sync:
328 bb.utils.mkdirhier(srctree) 354 # Prepare for shutil.move later on
329 os.rmdir(srctree) 355 bb.utils.mkdirhier(srctree)
356 os.rmdir(srctree)
330 357
331 # We don't want notes to be printed, they are too verbose 358 # We don't want notes to be printed, they are too verbose
332 origlevel = bb.logger.getEffectiveLevel() 359 origlevel = bb.logger.getEffectiveLevel()
@@ -430,13 +457,35 @@ def _extract_source(srctree, keep_temp, devbranch, d):
430 if haspatches: 457 if haspatches:
431 bb.process.run('git checkout patches', cwd=srcsubdir) 458 bb.process.run('git checkout patches', cwd=srcsubdir)
432 459
433 # Move oe-local-files directory to srctree 460 tempdir_localdir = os.path.join(tempdir, 'oe-local-files')
434 if os.path.exists(os.path.join(tempdir, 'oe-local-files')): 461 srctree_localdir = os.path.join(srctree, 'oe-local-files')
435 logger.info('Adding local source files to srctree...')
436 shutil.move(os.path.join(tempdir, 'oe-local-files'), srcsubdir)
437 462
463 if sync:
464 bb.process.run('git fetch file://' + srcsubdir + ' ' + devbranch + ':' + devbranch, cwd=srctree)
465
466 # Move oe-local-files directory to srctree
467 # As the oe-local-files is not part of the constructed git tree,
468 # remove them directly during the synchrounizating might surprise
469 # the users. Instead, we move it to oe-local-files.bak and remind
470 # user in the log message.
471 if os.path.exists(srctree_localdir + '.bak'):
472 shutil.rmtree(srctree_localdir, srctree_localdir + '.bak')
473
474 if os.path.exists(srctree_localdir):
475 logger.info('Backing up current local file directory %s' % srctree_localdir)
476 shutil.move(srctree_localdir, srctree_localdir + '.bak')
477
478 if os.path.exists(tempdir_localdir):
479 logger.info('Syncing local source files to srctree...')
480 shutil.copytree(tempdir_localdir, srctree_localdir)
481 else:
482 # Move oe-local-files directory to srctree
483 if os.path.exists(tempdir_localdir):
484 logger.info('Adding local source files to srctree...')
485 shutil.move(tempdir_localdir, srcsubdir)
486
487 shutil.move(srcsubdir, srctree)
438 488
439 shutil.move(srcsubdir, srctree)
440 finally: 489 finally:
441 bb.logger.setLevel(origlevel) 490 bb.logger.setLevel(origlevel)
442 491
@@ -544,7 +593,7 @@ def modify(args, config, basepath, workspace):
544 commits = [] 593 commits = []
545 srctree = os.path.abspath(args.srctree) 594 srctree = os.path.abspath(args.srctree)
546 if args.extract: 595 if args.extract:
547 initial_rev = _extract_source(args.srctree, False, args.branch, rd) 596 initial_rev = _extract_source(args.srctree, False, args.branch, False, rd)
548 if not initial_rev: 597 if not initial_rev:
549 return 1 598 return 1
550 logger.info('Source tree extracted to %s' % srctree) 599 logger.info('Source tree extracted to %s' % srctree)
@@ -1119,6 +1168,15 @@ def register_commands(subparsers, context):
1119 parser_extract.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)') 1168 parser_extract.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)')
1120 parser_extract.set_defaults(func=extract) 1169 parser_extract.set_defaults(func=extract)
1121 1170
1171 parser_sync = subparsers.add_parser('sync', help='Synchronize the source for an existing recipe',
1172 description='Synchronize the source for an existing recipe',
1173 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
1174 parser_sync.add_argument('recipename', help='Name for recipe to sync the source for')
1175 parser_sync.add_argument('srctree', help='Path to where to sync the source tree')
1176 parser_sync.add_argument('--branch', '-b', default="devtool", help='Name for development branch to checkout')
1177 parser_sync.add_argument('--keep-temp', action="store_true", help='Keep temporary directory (for debugging)')
1178 parser_sync.set_defaults(func=sync)
1179
1122 parser_update_recipe = subparsers.add_parser('update-recipe', help='Apply changes from external source tree to recipe', 1180 parser_update_recipe = subparsers.add_parser('update-recipe', help='Apply changes from external source tree to recipe',
1123 description='Applies changes from external source tree to a recipe (updating/adding/removing patches as necessary, or by updating SRCREV)') 1181 description='Applies changes from external source tree to a recipe (updating/adding/removing patches as necessary, or by updating SRCREV)')
1124 parser_update_recipe.add_argument('recipename', help='Name of recipe to update') 1182 parser_update_recipe.add_argument('recipename', help='Name of recipe to update')