# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
+"""Devtool plugins module"""
import os
import sys
logger = logging.getLogger('devtool')
def exec_build_env_command(init_path, builddir, cmd, watch=False, **options):
+ """Run a program in bitbake build context"""
import bb
if not 'cwd' in options:
options["cwd"] = builddir
return bb.process.run('%s%s' % (init_prefix, cmd), **options)
def exec_watch(cmd, **options):
+ """Run program with stdout shown on sys.stdout"""
if isinstance(cmd, basestring) and not "shell" in options:
options["shell"] = True
return buf
def setup_tinfoil():
+ """Initialize tinfoil api from bitbake"""
import scriptpath
bitbakepath = scriptpath.add_bitbake_lib_path()
if not bitbakepath:
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+"""Devtool plugin containing the deploy subcommands"""
import os
import subprocess
logger = logging.getLogger('devtool')
def plugin_init(pluginlist):
+ """Plugin initialization"""
pass
def deploy(args, config, basepath, workspace):
+ """Entry point for the devtool 'deploy' subcommand"""
import re
if not args.recipename in workspace:
return 0
def undeploy(args, config, basepath, workspace):
-
+ """Entry point for the devtool 'undeploy' subcommand"""
deploy_file = os.path.join(basepath, 'target_deploy', args.target, args.recipename + '.list')
if not os.path.exists(deploy_file):
logger.error('%s has not been deployed' % args.recipename)
def register_commands(subparsers, context):
+ """Register devtool subcommands from the deploy plugin"""
parser_deploy = subparsers.add_parser('deploy-target', help='Deploy recipe output files to live target machine')
parser_deploy.add_argument('recipename', help='Recipe to deploy')
parser_deploy.add_argument('target', help='Live target machine running an ssh server: user@hostname[:destdir]')
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+"""Devtool standard plugins"""
import os
import sys
logger = logging.getLogger('devtool')
def plugin_init(pluginlist):
+ """Plugin initialization"""
pass
def add(args, config, basepath, workspace):
+ """Entry point for the devtool 'add' subcommand"""
import bb
import oe.recipeutils
def _check_compatible_recipe(pn, d):
+ """Check if the recipe is supported by devtool"""
if pn == 'perf':
logger.error("The perf recipe does not actually check out source and thus cannot be supported by this tool")
return False
def _get_recipe_file(cooker, pn):
+ """Find recipe file corresponding a package name"""
import oe.recipeutils
recipefile = oe.recipeutils.pn_to_recipe(cooker, pn)
if not recipefile:
def extract(args, config, basepath, workspace):
+ """Entry point for the devtool 'extract' subcommand"""
import bb
tinfoil = setup_tinfoil()
def _extract_source(srctree, keep_temp, devbranch, d):
+ """Extract sources of a recipe"""
import bb.event
import oe.recipeutils
def eventfilter(name, handler, event, d):
+ """Bitbake event filter for devtool extract operation"""
if name == 'base_eventhandler':
return True
else:
# are to handle e.g. linux-yocto's extra tasks
executed = []
def exec_task_func(func, report):
+ """Run specific bitbake task for a recipe"""
if not func in executed:
deps = crd.getVarFlag(func, 'deps')
if deps:
return initial_rev
def _add_md5(config, recipename, filename):
+ """Record checksum of a recipe to the md5-file of the workspace"""
import bb.utils
md5 = bb.utils.md5_file(filename)
with open(os.path.join(config.workspace_path, '.devtool_md5'), 'a') as f:
f.write('%s|%s|%s\n' % (recipename, os.path.relpath(filename, config.workspace_path), md5))
def _check_preserve(config, recipename):
+ """Check if a recipe was manually changed and needs to be saved in 'attic'
+ directory"""
import bb.utils
origfile = os.path.join(config.workspace_path, '.devtool_md5')
newfile = os.path.join(config.workspace_path, '.devtool_md5_new')
def modify(args, config, basepath, workspace):
+ """Entry point for the devtool 'modify' subcommand"""
import bb
import oe.recipeutils
def update_recipe(args, config, basepath, workspace):
+ """Entry point for the devtool 'update-recipe' subcommand"""
if not args.recipename in workspace:
logger.error("no recipe named %s in your workspace" % args.recipename)
return -1
mode = args.mode
def remove_patches(srcuri, patchlist):
- # Remove any patches that we don't need
+ """Remove patches"""
updated = False
for patch in patchlist:
patchfile = os.path.basename(patch)
def status(args, config, basepath, workspace):
+ """Entry point for the devtool 'status' subcommand"""
if workspace:
for recipe, value in workspace.iteritems():
print("%s: %s" % (recipe, value))
def reset(args, config, basepath, workspace):
+ """Entry point for the devtool 'reset' subcommand"""
import bb.utils
if args.recipename:
if args.all:
def build(args, config, basepath, workspace):
+ """Entry point for the devtool 'build' subcommand"""
import bb
if not args.recipename in workspace:
logger.error("no recipe named %s in your workspace" % args.recipename)
def register_commands(subparsers, context):
+ """Register devtool subcommands from this plugin"""
parser_add = subparsers.add_parser('add', help='Add a new recipe',
description='Adds a new recipe')
parser_add.add_argument('recipename', help='Name for new recipe to add')