def create_or_update(args): "Creates or updates a code review case." creds = new_credentials_config() g = GitRepo() cr_data_file = get_cr_data_file(g) safe_create_code_review_data_file(cr_data_file) with CodeReviewConfiguration.persisting(cr_data_file) as data: if g.current_branch() in data.branches: cr_data = data.branches[g.current_branch()] if len(cr_data.commits) > 1 and g.sha('HEAD~') == cr_data.commits[-2]: # the last commit was amended, so replace it: if g.sha('HEAD') != cr_data.commits[-1]: cr_data.commits[-1] = g.sha('HEAD') elif g.sha() not in cr_data.commits: cr_data.commits.append(g.sha()) if len(cr_data.commits) >= 2: use_hash = str('..'.join([cr_data.commits[0][0:8], cr_data.commits[-1][0:8]])) else: use_hash = str(cr_data.commits[-1]) logger.info('updating an existing code review.') update_code_review(cr_data, g, use_hash) else: data.set_branch(g.current_branch(), {'original_name': g.commit_messages()[0], 'commits': [g.sha('HEAD~'), g.sha()]}) logger.info('creating new code review.') create_code_review(data, g, creds)
def merge(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) from_branch = g.current_branch() branch_name = str(id(c.runstate.git_branch)) g.checkout_branch(branch_name, c.runstate.git_branch) try: g.checkout(branch_name) g.rebase(from_branch) g.checkout(from_branch) g.merge(c.runstate.git_branch) logger.info('rebased and merged {0} into {1}'.format( c.runstate.git_branch, from_branch)) except Exception as e: logger.warning('error attempting to merge branch: ' + c.runstate.git_branch) logger.error(e) finally: if g.current_branch != from_branch: g.checkout(from_branch) g.remove_branch(branch_name, force=False)
def create_branch(args): """ Takes a single branch name and (if necessary) creates a new branch. Then, populates the ``build/<branch>`` directory for the new branch using either the parent branch or ``master``. Safe to run multiple times (after a rebase) to update the build cache from master. Also calls :method:`~giza.operations.build_env.fix_build_environment()` to tweak the new build output to update hashes and on-disk copies of the environment to prevent unnecessary full-rebuilds from sphinx. """ conf = fetch_config(args) g = GitRepo(conf.paths.projectroot) branch = conf.runstate.git_branch base_branch = g.current_branch() if base_branch == branch: base_branch = 'master' logger.warning( 'seeding build data for branch "{0}" from "master"'.format(branch)) branch_builddir = os.path.join(conf.paths.projectroot, conf.paths.output, branch) base_builddir = os.path.join(conf.paths.projectroot, conf.paths.output, base_branch) if g.branch_exists(branch): logger.info('checking out branch "{0}"'.format(branch)) else: logger.info( 'creating and checking out a branch named "{0}"'.format(branch)) g.checkout_branch(branch) cmd = "rsync -r --times --checksum {0}/ {1}".format( base_builddir, branch_builddir) logger.info('seeding build directory for "{0}" from "{1}"'.format( branch, base_branch)) try: subprocess.check_call(args=cmd.split()) logger.info('branch creation complete.') except subprocess.CalledProcessError: logger.error(cmd) # get a new config here for the new branch conf = fetch_config(args) builders = get_existing_builders(conf) with BuildApp.new(pool_type='process', pool_size=conf.runstate.pool_size, force=conf.runstate.force).context() as app: app.exted_queue(fix_build_env_tasks(builders, conf))
def cherry_pick(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.cherry_pick(c.runstate.git_objects)
def cherry_pick(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.cherry_pick(c.runstate.git_objects)
def pull_rebase(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.update() logger.info('updated: ' + branch)
def create_branch(args): """ Takes a single branch name and (if necessary) creates a new branch. Then, populates the ``build/<branch>`` directory for the new branch using either the parent branch or ``master``. Safe to run multiple times (after a rebase) to update the build cache from master. Also calls :method:`~giza.operations.build_env.fix_build_environment()` to tweak the new build output to update hashes and on-disk copies of the environment to prevent unnecessary full-rebuilds from sphinx. """ conf = fetch_config(args) g = GitRepo(conf.paths.projectroot) branch = conf.runstate.git_branch base_branch = g.current_branch() if base_branch == branch: base_branch = 'master' logger.warning('seeding build data for branch "{0}" from "master"'.format(branch)) branch_builddir = os.path.join(conf.paths.projectroot, conf.paths.output, branch) base_builddir = os.path.join(conf.paths.projectroot, conf.paths.output, base_branch) if g.branch_exists(branch): logger.info('checking out branch "{0}"'.format(branch)) else: logger.info('creating and checking out a branch named "{0}"'.format(branch)) g.checkout_branch(branch) cmd = "rsync -r --times --checksum {0}/ {1}".format(base_builddir, branch_builddir) logger.info('seeding build directory for "{0}" from "{1}"'.format(branch, base_branch)) try: subprocess.check_call(args=cmd.split()) logger.info('branch creation complete.') except subprocess.CalledProcessError: logger.error(cmd) # get a new config here for the new branch conf = fetch_config(args) builders = get_existing_builders(conf) with BuildApp.new(pool_type='process', pool_size=conf.runstate.pool_size, force=conf.runstate.force).context() as app: app.exted_queue(fix_build_env_tasks(builders, conf))
def pull_rebase(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.update() logger.info('updated: ' + branch)
def apply_patch(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.am(patches=c.runstate.git_objects, repo='/'.join(['https://github.com', c.git.remote.upstream]), sign=c.runstate.git_sign_patch)
def apply_patch(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) if c.runstate.git_branch is None: c.runstate.git_branch = [g.current_branch()] for branch in c.runstate.git_branch: with g.branch(branch): g.am(patches=c.runstate.git_objects, repo='/'.join(['https://github.com', c.git.remote.upstream]), sign=c.runstate.git_sign_patch)
def create_or_update(args): "Creates or updates a code review case." creds = new_credentials_config() g = GitRepo() cr_data_file = get_cr_data_file(g) safe_create_code_review_data_file(cr_data_file) with CodeReviewConfiguration.persisting(cr_data_file) as data: if g.current_branch() in data.branches: cr_data = data.branches[g.current_branch()] if len(cr_data.commits) > 1 and g.sha( 'HEAD~') == cr_data.commits[-2]: # the last commit was amended, so replace it: if g.sha('HEAD') != cr_data.commits[-1]: cr_data.commits[-1] = g.sha('HEAD') elif g.sha() not in cr_data.commits: cr_data.commits.append(g.sha()) if len(cr_data.commits) >= 2: use_hash = str('..'.join( [cr_data.commits[0][0:8], cr_data.commits[-1][0:8]])) else: use_hash = str(cr_data.commits[-1]) logger.info('updating an existing code review.') update_code_review(cr_data, g, use_hash) else: data.set_branch( g.current_branch(), { 'original_name': g.commit_messages()[0], 'commits': [g.sha('HEAD~'), g.sha()] }) logger.info('creating new code review.') create_code_review(data, g, creds)
def merge(args): c = fetch_config(args) g = GitRepo(c.paths.projectroot) from_branch = g.current_branch() branch_name = str(id(c.runstate.git_branch)) g.checkout_branch(branch_name, c.runstate.git_branch) try: g.checkout(branch_name) g.rebase(from_branch) g.checkout(from_branch) g.merge(c.runstate.git_branch) logger.info('rebased and merged {0} into {1}'.format(c.runstate.git_branch, from_branch)) except Exception as e: logger.warning('error attempting to merge branch: ' + c.runstate.git_branch) logger.error(e) finally: if g.current_branch != from_branch: g.checkout(from_branch) g.remove_branch(branch_name, force=False)