def execute_branch_cut(target_version, hotfix_number): """Creates & pushes the new release branch to Github. Args: target_version: str. The release version. hotfix_number: int. The number for the hotfix branch. Raises: Exception. Actions tests are failing on the branch from which the new branch is cut. """ # Construct the new branch name. if not hotfix_number: new_branch_type, new_branch_name = _get_release_branch_type_and_name( target_version) else: new_branch_type, new_branch_name = _get_hotfix_branch_type_and_name( target_version, hotfix_number) # Do prerequisite checks. common.require_cwd_to_be_oppia() common.verify_local_repo_is_clean() common.verify_current_branch_name('develop') # Update the local repo. remote_alias = common.get_remote_alias( constants.release_constants.REMOTE_URLS) subprocess.check_call(['git', 'pull', remote_alias, 'develop']) verify_target_branch_does_not_already_exist(remote_alias, new_branch_name) if not hotfix_number: branch_to_check = 'develop' elif hotfix_number == 1: branch_to_check = 'release-%s' % target_version else: branch_to_check = 'release-%s-hotfix-%s' % (target_version, hotfix_number - 1) # The release coordinator should verify that tests are passing on # the parent branch before checking out the new branch. common.open_new_tab_in_browser_if_possible( 'https://github.com/oppia/oppia/actions?query=branch:%s' % branch_to_check) print('Please confirm: are Actions checks passing on %s? (y/n) ' % (branch_to_check)) answer = input().lower() if answer not in common.AFFIRMATIVE_CONFIRMATIONS: raise Exception('Tests should pass on %s before this script is run.' % (branch_to_check)) # Cut a new release or hotfix branch. if new_branch_type == constants.release_constants.BRANCH_TYPE_HOTFIX: verify_hotfix_number_is_one_ahead_of_previous_hotfix_number( remote_alias, target_version, hotfix_number) if hotfix_number == 1: branch_to_cut_from = 'release-%s' % target_version else: branch_to_cut_from = 'release-%s-hotfix-%s' % (target_version, hotfix_number - 1) print('Cutting a new hotfix branch: %s' % new_branch_name) subprocess.check_call(['git', 'checkout', branch_to_cut_from]) common.update_branch_with_upstream() subprocess.check_call( ['git', 'checkout', '-b', new_branch_name, branch_to_cut_from]) else: verify_target_version_compatible_with_latest_release(target_version) print('Cutting a new release branch: %s' % new_branch_name) subprocess.check_call(['git', 'checkout', '-b', new_branch_name]) # Push the new release branch to GitHub. if new_branch_type == constants.release_constants.BRANCH_TYPE_RELEASE: print('Pushing new %s branch to GitHub.' % new_branch_type) subprocess.check_call(['git', 'push', remote_alias, new_branch_name]) else: print('Please cherrypick the required PRs and push the branch ' 'to Github once this script is done.\n' 'Note: It is fine to push the branch only after creating the ' 'branch protection rule and doing all the cherrypicks.') print('') print('New %s branch successfully cut. You are now on branch %s' % (new_branch_type, new_branch_name)) print('Done!')
def execute_branch_cut(target_version, hotfix_number): """Creates & pushes the new release branch to Github. Args: target_version: str. The release version. hotfix_number: int. The number for the hotfix branch. Raises: Exception: Travis tests are failing on the branch from which the new branch is cut. """ # Construct the new branch name. if not hotfix_number: new_branch_type, new_branch_name = _get_release_branch_type_and_name( target_version) else: new_branch_type, new_branch_name = _get_hotfix_branch_type_and_name( target_version, hotfix_number) # Do prerequisite checks. common.require_cwd_to_be_oppia() common.verify_local_repo_is_clean() common.verify_current_branch_name('develop') # Update the local repo. remote_alias = common.get_remote_alias(release_constants.REMOTE_URL) subprocess.check_call(['git', 'pull', remote_alias, 'develop']) verify_target_branch_does_not_already_exist(remote_alias, new_branch_name) # The release coordinator should verify that tests are passing on the parent # branch before checking out the new branch. common.open_new_tab_in_browser_if_possible( 'https://travis-ci.org/oppia/oppia/branches') while True: if not hotfix_number: branch_to_check = 'develop' elif hotfix_number == 1: branch_to_check = 'release-%s' % target_version else: branch_to_check = 'release-%s-hotfix-%s' % (target_version, hotfix_number - 1) python_utils.PRINT( 'Please confirm: are Travis checks passing on %s? (y/n) ' % (branch_to_check)) answer = python_utils.INPUT().lower() if answer in release_constants.AFFIRMATIVE_CONFIRMATIONS: break elif answer: raise Exception( 'Tests should pass on %s before this script is run.' % (branch_to_check)) # Cut a new release or hotfix branch. if new_branch_type == release_constants.BRANCH_TYPE_HOTFIX: verify_hotfix_number_is_one_ahead_of_previous_hotfix_number( remote_alias, target_version, hotfix_number) if hotfix_number == 1: branch_to_cut_from = 'release-%s' % target_version else: branch_to_cut_from = 'release-%s-hotfix-%s' % (target_version, hotfix_number - 1) python_utils.PRINT('Cutting a new hotfix branch: %s' % new_branch_name) subprocess.check_call( ['git', 'checkout', '-b', new_branch_name, branch_to_cut_from]) else: verify_target_version_compatible_with_latest_release(target_version) python_utils.PRINT('Cutting a new release branch: %s' % new_branch_name) subprocess.check_call(['git', 'checkout', '-b', new_branch_name]) # Push the new release branch to GitHub. python_utils.PRINT('Pushing new %s branch to GitHub.' % new_branch_type) subprocess.check_call(['git', 'push', remote_alias, new_branch_name]) python_utils.PRINT('') python_utils.PRINT( 'New %s branch successfully cut. You are now on branch %s' % (new_branch_type, new_branch_name)) python_utils.PRINT('Done!') common.ask_user_to_confirm( 'Ask Sean (or Ben, if Sean isn\'t available) to create ' 'a new branch protection rule by:\n' '1. Going to this page: https://github.com/oppia/oppia/' 'settings/branch_protection_rules/new.\n' '2. Typing in the full branch name %s.\n' '3. Checking the box: Restrict who can push to matching ' 'branches (then add the oppia/release-coordinators team)\n' % (new_branch_name))
def execute_branch_cut(): """Pushes the new release branch to Github.""" parsed_args = _PARSER.parse_args() if parsed_args.new_version: target_version = parsed_args.new_version else: raise Exception('ERROR: A "new_version" arg must be specified.') # Construct the new branch name. hotfix_number = int(parsed_args.hotfix_number) if not hotfix_number: new_branch_type, new_branch_name = _get_release_branch_type_and_name( target_version) else: new_branch_type, new_branch_name = _get_hotfix_branch_type_and_name( target_version, hotfix_number) # Do prerequisite checks. common.require_cwd_to_be_oppia() common.verify_local_repo_is_clean() common.verify_current_branch_name('develop') # Update the local repo. remote_alias = common.get_remote_alias(release_constants.REMOTE_URL) subprocess.check_call(['git', 'pull', remote_alias, 'develop']) verify_target_branch_does_not_already_exist(remote_alias, new_branch_name) # The release coordinator should verify that tests are passing on develop # before checking out the release branch. common.open_new_tab_in_browser_if_possible( 'https://github.com/oppia/oppia#oppia---') while True: if not hotfix_number: branch_to_check = 'develop' elif hotfix_number == 1: branch_to_check = 'release-%s' % target_version else: branch_to_check = 'release-%s-hotfix-%s' % ( target_version, hotfix_number - 1) python_utils.PRINT( 'Please confirm: are Travis checks passing on %s? (y/n) ' % ( branch_to_check)) answer = python_utils.INPUT().lower() if answer in release_constants.AFFIRMATIVE_CONFIRMATIONS: break elif answer: python_utils.PRINT( 'Tests should pass on %s before this script is run. ' 'Exiting.' % branch_to_check) sys.exit() # Cut a new release or hotfix branch. if new_branch_type == release_constants.BRANCH_TYPE_HOTFIX: verify_hotfix_number_is_one_ahead_of_previous_hotfix_number( remote_alias, target_version, hotfix_number) if hotfix_number == 1: branch_to_cut_from = 'release-%s' % target_version else: branch_to_cut_from = 'release-%s-hotfix-%s' % ( target_version, hotfix_number - 1) python_utils.PRINT('Cutting a new hotfix branch: %s' % new_branch_name) subprocess.check_call([ 'git', 'checkout', '-b', new_branch_name, branch_to_cut_from]) else: verify_target_version_compatible_with_latest_release( target_version) python_utils.PRINT('Cutting a new release branch: %s' % new_branch_name) subprocess.check_call(['git', 'checkout', '-b', new_branch_name]) # Push the new release branch to GitHub. python_utils.PRINT('Pushing new %s branch to GitHub.' % new_branch_type) subprocess.check_call(['git', 'push', remote_alias, new_branch_name]) python_utils.PRINT('') python_utils.PRINT( 'New %s branch successfully cut. You are now on branch %s' % ( new_branch_type, new_branch_name)) python_utils.PRINT('Done!')