blob: 2252ab274b25c8c7ea57b629c0e62d4bdf3f0293 [file] [log] [blame]
"""This is the main tool for handling llvm builds, bisects etc."""
import os
from sys import exit
from modules.llvm import LLVMSubproject, LLVMSourceConfig, push_current_branch
from linaropy.git.clone import Clone
from linaropy.proj import Proj
from argparse import Action, ArgumentParser, RawTextHelpFormatter
from functools import partial
def die(message, config_to_dump=None):
"""Print an error message and exit."""
print(message)
if config_to_dump is not None:
dump_config(config_to_dump)
exit(1)
def get_worktree_root(env):
"""Get the path to the LLVM worktree corresponding to env."""
return os.path.join(env, "llvm")
def dump_config(config):
"""Dump the list of projects that are enabled in the given config."""
print("Projects linked:")
enabled = config.get_enabled_subprojects()
if not enabled:
print("none")
else:
for subproj in sorted(enabled):
print(" + {}".format(subproj))
def projects(args):
"""Add/remove subprojects based on the values in args."""
proj = Proj()
llvm_worktree_root = get_worktree_root(args.env)
llvm_repos_root = args.repos
config = LLVMSourceConfig(proj, llvm_worktree_root)
if not args.add and not args.remove:
# Nothing to change, just print the current configuration
dump_config(config)
exit(0)
to_add = {}
if args.add:
for subproj in args.add:
repo = Clone(proj, os.path.join(llvm_repos_root, subproj))
to_add[subproj] = repo
try:
config.update(to_add, args.remove)
except (EnvironmentError, ValueError) as exc:
die("Failed to update subprojects because:\n{}".format(str(exc)))
dump_config(config)
def push_branch(args):
"""Push current branch to origin."""
proj = Proj()
llvm_worktree_root = get_worktree_root(args.env)
config = LLVMSourceConfig(proj, llvm_worktree_root)
llvmBranch = Clone(proj, llvm_worktree_root).getbranch()
try:
config.for_each_enabled(partial(push_current_branch, proj))
except RuntimeError as exc:
die("Failed to push branch because: " + str(exc) + str(exc.__cause__))
##########################################################################
# Command line parsing #
##########################################################################
# If we decide we want shorthands for the subprojects, we can append to this
# list
valid_subprojects = list(LLVMSubproject.get_all_subprojects().keys())
options = ArgumentParser(formatter_class=RawTextHelpFormatter)
options.add_argument(
'--env',
required=True,
help="Path to the environment to update.")
options.add_argument(
'--repos', required=True,
help="Path to the directory containing the repositories for all LLVM subprojects.")
subcommands = options.add_subparsers()
# Subcommand for adding / removing subprojects
projs = subcommands.add_parser("projects", help="Add/remove LLVM subprojects.")
projs.set_defaults(run_command=projects)
# TODO: Overwriting previous values is not necessarily what users expect (so for
# instance --add S1 S2 --remove S3 --add S4 would lead to adding only S4). We
# can do better by using action='append', which would create a list (of lists?
# or of lists and scalars?) that we can flatten to obtain all the values passed
# by the user.
projs.add_argument(
'-a', '--add',
nargs='+',
choices=valid_subprojects,
metavar='subproject',
help="Link given subprojects. Valid values are:\n\t{}\n".format(
"\n\t".join(valid_subprojects)))
projs.add_argument(
'-r', '--remove',
nargs='+',
choices=valid_subprojects,
metavar='subproject',
help="Unlink given subprojects.")
# Subcommand for pushing the current branch to origin
push = subcommands.add_parser(
"push",
help="Push current branch to origin linaro-local/<user>/<branch>, for all linked subprojects.")
push.set_defaults(run_command=push_branch)
args = options.parse_args()
args.run_command(args)