#!/usr/bin/env bash set -e # Requirements: # sudo apt-get install xclip # e.g. 1908 ROLL # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --pre-roll # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --roll # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 251904 --new-branch 1908 --new-revision 259084 --chrome --info # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --pre-roll # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --roll # ./start_dartium_roll.sh --verbose --directory ~/dartium-roll --old-branch 1847 --old-revision 167304 --new-branch 1908 --new-revision 169907 --blink --info # e.g., 1916 ROLL # ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 259084 --new-branch 1916 --new-revision 260298 --chrome --pre-roll # ~/./start_dartium_roll.sh --verbose --directory /media/TB/dartium-1916 --old-branch 1908 --old-revision 169907 --new-branch 1916 --new-revision 170313 --blink --pre-roll E_INVALID_ARG=128 function usage { echo "Usage: $0 [--options]" echo "Options:" echo " --[no-]verbose: display information about each step" echo " --directory base: base directory of local git repository" echo " (e.g., ~/dartium-roll implies directory" echo " ~/dartium-roll/src and" echo " ~/dartium-roll/src/third_party/WebKit)**" echo " --chrome: for the Chrome branch (not with --blink)**" echo " --blink: for the Blink branch (not with --chrome)**" echo " --old-branch name: name of previous true branch (e.g., use 1847" echo " for version 34.0.1847.92) *" echo " --old-revision revision: revision of base trunk for $OLD version *" echo " --new-branch name: name of new true branch to create *" echo " --new-revision revision: revision of base trunk for new branch *" echo " --pre-roll: display commands to prepare for the roll" echo " --roll: display Git commands to execute for creating" echo " branches for the roll" echo " --info: display hashes for $BASE and $LAST on each" echo " branch (stripped$OLD, trunkdata$OLD, and" echo " trunkdata$NEW)" echo " --help: this message" echo echo "* - required" echo echo "* Script will prompt interactively if options not given." echo "** Argument must be specified." echo exit 1 } function verbose_message { if [ "$do_verbose" = 1 ]; then if [ "${1}" = "" ]; then echo else echo -e "...${1}..." fi fi } # Does the file src/.git/config contains the added lines pointing to the chrome # remote dart$OLD and dart$NEW branches for src/ (e.g, dart1847 and dart1908): # # [svn-remote "dart$OLD"] # url = svn://svn.chromium.org/chrome/branches/dart/$OLD/src # fetch = :refs/remotes/dart1847 # [svn-remote "dart$NEW"] # url = svn://svn.chromium.org/chrome/branches/dart/$NEW/src # fetch = :refs/remotes/dart1908 # # and does the file src/third_party/WebKit/.git/config contains the added lines # for blink: # # [svn-remote "dart$OLD"] # url = svn://svn.chromium.org/blink/branches/dart/$OLD/src # fetch = :refs/remotes/dart1847 # [svn-remote "dart$NEW"] # url = svn://svn.chromium.org/blink/branches/dart/$NEW/src # fetch = :refs/remotes/dart1908 # function validate_remotes { verbose_message "Validating Remotes" if [ "$do_which" = "chrome" ]; then # Ensure remote for old Dartium release exist (e.g., remotes/dart1847) remote_dart_last=$(git branch -a | grep "remotes/dart${do_old_branch}") # Ensure remote for new Dartium release exist (e.g., remotes/dart1908) remote_dart_new=$(git branch -a | grep "remotes/dart${do_new_branch}") if [ "$remote_dart_last" = "" ]; then $(display_error "missing old remotes/dart${do_old_branch}") exit -1 fi if [ "$remote_dart_new" = "" ]; then $(display_error "missing new remotes/dart${do_new_branch}") exit -1 fi elif [ "$do_which" = "blink" ]; then # Ensure remote for old Dartium release exist (e.g., remotes/dart1847) remote_dart_last=$(git branch -a | grep "remotes/blink-svn/${do_old_branch}") # Ensure remote for new Dartium release exist (e.g., remotes/dart1908) remote_dart_new=$(git branch -a | grep "remotes/blink-svn/multivm-${do_new_branch}") if [ "$remote_dart_last" = "" ]; then $(display_error "missing old remotes/blink-svn/${do_old_branch}") exit -1 fi if [ "$remote_dart_new" = "" ]; then $(display_error "missing new remotes/blink-svn/multivm-${do_new_branch}") exit -1 fi else $(display_error "--chrome or --blink must be specified") exit -1 fi } function stripped_exist { local branch_name=$(git branch --no-color --list $(stripped_name) | sed 's/^[ \t\*]*//') echo $branch_name } # Does the branch trunkdart$OLD or trunkdart$NEW exist where $OLD is previous # branch (e.g. 1847) and $NEW is new branch to roll (e.g., 1908) # $(trunk_exist ${do_old_branch}) or $(trunk_exist ${do_new_branch}) # Strip out the spaces and * (implies current branch) then return the branch name. function trunk_exist { local branch_name=$(git branch --list --no-color trunkdart${1} | sed 's/^[ \t\*]*//' | tail -n 1) echo $branch_name } function validate_repository { verbose_message "Validating Repository" strip_branch=${stripped_name} # Validate that branches exist. stripped_found=${stripped_exist} old_branch_found=$(trunk_exist ${do_old_branch}) new_branch_found=$(trunk_exist ${do_new_branch}) if [ "$stripped_found" != "" ]; then $(display_error "branch ${strip_branch} already exist") exit -1 fi if [ "$old_branch_found" != "" ]; then $(display_error "branch trunkdart${do_old_branch} already exist") exit -1 fi if [ "$new_branch_found" != "" ]; then $(display_error "branch trunkdart${do_new_branch} already exist") exit -1 fi } function display_error() { echo -e "\n\e[1;31mERROR: ${1}\e[0m\n" >&2 exit 1 } # Given a revision number $1 return the trunk's hash code for that revision. function hash_trunk_revision { # Chrome trunk hash code for [NewChromeCommit] hash_trunk=$(git log master --grep=src@${1} --pretty=format:'%H' -n 1) } # Return the last revision for a branch. Used by new trunk roll for the # DEPS file for the last revision to use during build. function last_revision() { echo $(git svn log ${1} --oneline -1 | cut -d '|' -f1 | sed "s/r//") } # Return the branch for strippedOOOO use bash line: # $(stripped_name) function stripped_name { echo "stripped${do_old_branch}" } # Give a branch name return the trunk release for that branch. function trunkdart_name { echo "trunkdart${1}" } # Compute the hash codes for the previous branch hash_base is the first commit # and hash_last is final commit. function hash_codes_base_last { # Get the first commit for previous Dartium roll on chrome branch. hash_base=$(git rev-list ${1} --pretty=format:'%H' | tail -n 1) # Get the last commit for previous Dartium roll on chrome branch. hash_last=$(git log ${1} --pretty=format:'%H' -1) } # Compute the hash codes for the previous branch hash_base is the first commit # and hash_last is final commit. function hash_codes_base2_last2 { # Get the last commit for previous Dartium roll on chrome branch. hash_last2=$(git log ${1} --pretty=format:'%H' -1) local search if [ "$do_which" = "chrome" ]; then search="chrome/trunk/src@${do_old_revision}" else search="blink/branches/dart/multivm-${do_new_revision}@${do_old_revision}" fi # Get the first commit for previous Dartium roll on chrome branch. hash_base2=$(git log ${1} --grep=@${do_old_revision} --pretty=format:'%H' | tail -1) } # Pad right/left up to 80 spaces. # Parameter $1 string to pad. # Parameter $2 is max length to post-pad with spaces. # Parameter $3 if specified padd to the right otherwise pad to the right. # Returns string right padded with spaces. function space_pad() { local spaces=$(printf '%0.1s' " "{1..80}) local spaces_pad=${spaces:0:$2} local padding=$(printf "%s" "${spaces_pad:${#1}}") if [[ "$3" = "" ]]; then # Pad to the right [default]. echo "${1}${padding}" else # Pad to the left. echo "${padding}${1}" fi } # Format the line '| URL: |'. # Paramter $1 - url to format # Returns the formatted and space padded line for display_hashes. function display_url() { # Line length is 65, skipped # 9 characters at beginning '| URL: ' # and last character '|'. Up to 55 characters of padding. local format_url=$(space_pad $1 55) local valid_url=$(valid_branch_url $1) if [[ "$valid_url" = "" ]]; then # Error format padding is same as above remote_url 55; local format_err=$(space_pad "WARNING ON TRUNK - FIX IMMEDIATELY" 55) # Output in red, the problem, both lines the URL and the warning message. echo -e "| URL: \e[1;31m${format_url}\e[0m|\n| \e[1;31m${format_err}\e[0m|" else # URL looks good. echo "| URL: ${format_url}|" fi } function display_hashes { if [ "$do_info_hashes" = 1 ]; then local format_which=$(space_pad $do_which 6 1) stripped_branch=$(stripped_name) # stripped$OLD found stripped_found=$(stripped_exist) if [ "$stripped_found" != "" ]; then hash_codes_base_last ${stripped_branch} hash_trunk_revision ${do_old_revision} # Display the first/last commit hash for stripped$OLD branch and the # trunk hash for $OLD@do_last_revsion. echo "=================================================================" local format_branch=$(space_pad $stripped_branch 32 1) echo "| \$OLD: ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |" local remote_url=$(url_branch $stripped_branch) # TODO(terry): Testing failure below remove before checkin # local remote_url=$(url_branch "master") echo "$(display_url $remote_url)" echo "|---------------------------------------------------------------|" local format_hash=$(space_pad $hash_base 51) echo "| \$BASE | ${format_hash} |" echo "|---------------------------------------------------------------|" format_hash=$(space_pad $hash_last 51) echo "| \$LAST | ${format_hash} |" echo "=================================================================" echo else echo "${stripped_branch} not found" echo fi # trunkdart$OLD found branch_trunkdart_old=$(trunkdart_name ${do_old_branch}) old_branch_found=$(trunk_exist ${do_old_branch}) if [ "$old_branch_found" != "" ]; then hash_codes_base2_last2 ${branch_trunkdart_old} hash_trunk_revision ${do_old_revision} # Display the first/last commit hash for trunkdart$OLD branch and the # trunk hash for $OLD@do_last_revsion. echo "=================================================================" local format_branch=$(space_pad $branch_trunkdart_old 32 1) echo "| \$OLD ${format_which} dart${do_old_branch}@${do_old_revision}${format_branch} |" local remote_url=$(url_branch $branch_trunkdart_old) echo "$(display_url $remote_url)" echo "|---------------------------------------------------------------|" local format_base2=$(space_pad $hash_base2 51) echo "| \$BASE2 | ${format_base2} |" echo "|---------------------------------------------------------------|" local format_last2=$(space_pad $hash_last2 51) echo "| \$LAST2 | ${format_last2} |" echo "=================================================================" echo else echo "${branch_trunkdart_old} not found" echo fi # trunkdart$NEW found branch_trunkdart_new=$(trunkdart_name ${do_new_branch}) new_branch_found=$(trunk_exist ${do_new_branch}) if [ "$new_branch_found" != "" ]; then hash_trunk_revision ${do_new_revision} # Display the trunk hash for $NEW@do_new_revsion. echo "=================================================================" local format_branch=$(space_pad $branch_trunkdart_new 32 1) echo "| \$NEW ${format_which} dart${do_new_branch}@${do_new_revision}${format_branch} |" local remote_url=$(url_branch $branch_trunkdart_new) echo "$(display_url $remote_url)" echo "|---------------------------------------------------------------|" local revision=$(last_revision $branch_trunkdart_new) local format_revision=$(space_pad $revision 43) echo "| last revision | ${format_revision} |" echo "=================================================================" echo else echo "${branch_trunkdart_new} not found" echo fi fi } function switch_branch() { $(git checkout ${1} --quiet) local curr_branch=$(git name-rev --name-only HEAD) if [[ "$curr_branch" != "$1" ]]; then $(display_error "Unable to switch to branch $1 - pending commits/add?") exit -1 fi echo $curr_branch } # Check that the branch is not pointing to either blink or chrome trunk. # These branches should be pointing to either: # svn://svn.chromium.org/chrome/branches/dart/NNNN # svn://svn.chromium.org/blink/branches/dart/NNNN # # $1 parameter - branch-name to make current branch and check repository # name. function check_branch() { local old_branch=$(git name-rev --name-only HEAD) local curr_branch=$(switch_branch $1) local trunk_url; if [ "$do_which" = "chrome" ]; then # Chrome trunk_url='Committing to svn://svn.chromium.org/chrome/trunk/src ...' elif [ "$do_which" = "blink" ]; then # Blink trunk_url='Committing to svn://svn.chromium.org/blink/trunk ...' else $(display_error "Neither blink or chrome specified") exit -1 fi local remote_commit=$(git svn dcommit --dry-run | head -1 | grep "${trunk_url}") curr_branch=$(switch_branch $old_branch) if [[ "$curr_branch" != "$old_branch" ]]; then $(display_error "Unable to switch back to original branch ${old_branch}") exit -1 fi if [[ "$remote_commit" != "" ]]; then $(display_error "Branch ${1} is NOT pointing to the Dart branch repository but pointing to trunk.") exit -1 fi echo "Local branch '${1}' is based on the remote branch/dart repository." } # Given an URL of a remote repository passed as parameter $1 (e.g., from # url_branch function) return the URL passed in if valid or return empty # string "". function valid_branch_url() { # Compute what the remote repository should be: # svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}/src # e.g., svn://svn.chromium.org/chrome/branches/dart/1847/src # or blink: # svn://svn.chromium.org/blink/branches/dart/${do_old_branch} # e.g., svn://svn.chromium.org/blink/branches/dart/1847 local src_dir="" if [[ "$do_which" = "chrome" ]]; then src_dir="/src" fi local old_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_old_branch}${src_dir}" local new_remote="svn://svn.chromium.org/${do_which}/branches/dart/${do_new_branch}${src_dir}" echo $(echo "$1" | grep -e "${old_remote}" -e "${new_remote}") } # Returns the remote repository URL associated with a branch. # Parameter $1 is the branch name. function url_branch() { local old_branch=$(git name-rev --name-only HEAD) local curr_branch=$(switch_branch $1) local remote_commit=$(git svn dcommit --dry-run | head -1 | sed 's/Committing to //' | sed 's/ ...//') curr_branch=$(switch_branch $old_branch) echo "${remote_commit}" } # Ensure that any created branches (stripped$OLD, trunkdart$OLD and # trunkdart$NEW) are not pointing to either the blink or chrome trunks. function validate_branches() { # stripped branch local stripped_found=$(stripped_exist) if [ "$stripped_found" != "" ]; then local branch_name=$(stripped_name) local check_result=$(check_branch ${branch_name}) printf "%s\n" "$check_result" fi # trunkdart$OLD local branch_trunkdart_old=$(trunkdart_name ${do_old_branch}) local old_branch_found=$(trunk_exist ${do_old_branch}) if [ "$old_branch_found" != "" ]; then local check_result=$(check_branch $branch_trunkdart_old) printf "%s\n" "$check_result" fi # trunkdart$NEW local branch_trunkdart_new=$(trunkdart_name ${do_new_branch}) local new_branch_found=$(trunk_exist ${do_new_branch}) if [ "$new_branch_found" != "" ]; then local check_result=$(check_branch $branch_trunkdart_new) printf "%s\n" "$check_result" fi } function display_roll_commands() { if [ "$roll_branches" = 1 ]; then if [ "$do_which" = "chrome" ]; then roll_chrome_commands elif [ "$do_which" = "blink" ]; then roll_blink_commands fi fi } # Show commands to create SVN branch folder and remote repository for new roll. function display_remote_repository_creation() { # TODO(terry): Use the diretory passed in instead of hard-coded dartium-NNNN # TODO(terry): Should execute each command with a Y or N and command runs. # TODO(terry): Echo output from commands especially clone and rebase using "OUTPUT=$(git cl rebase); echo $OUTPUT" # TODO(terry): Add ability to copy to clipboard programmatically us 'echo "hi" | xclip -selection clipboard' # copies hi to clipboard. echo "Do the following pre-roll setup" if [ "$do_which" = "chrome" ]; then echo " mkdir dartium-${do_new_branch}" echo " cd dartium-${do_new_branch}" echo " svn mkdir -m \"Preparing Chrome 35/${do_new_branch} branch\" "\ "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}" echo " svn cp -m \"Branching for ${do_new_branch} @${do_new_revision}\" "\ "svn://svn.chromium.org/chrome/trunk/src@${do_new_revision} "\ "svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src" echo " git svn clone -r241107 svn://svn.chromium.org/chrome/trunk/src src" echo echo " cd src" echo " git cl rebase" echo echo "-----After rebase finishes-----" echo echo " 1. Add the below lines to src/.git/config" echo echo "[svn-remote \"dart${do_old_branch}\"]" echo " url = svn://svn.chromium.org/chrome/branches/dart/${do_old_branch}/src" echo " fetch = :refs/remotes/dart${do_old_branch}" echo "[svn-remote \"dart${do_new_branch}\"]" echo " url = svn://svn.chromium.org/chrome/branches/dart/${do_new_branch}/src" echo " fetch = :refs/remotes/dart${do_new_branch}" echo echo " 2. Get the code" echo echo " cd src" echo " git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}" elif [ "$do_which" = "blink" ]; then echo " Directory dartium-${do_new_branch} exists." echo " cd dartium-${do_new_branch}" echo " svn cp -m \"Branching ${do_new_branch} @${do_new_revision}\" "\ "svn://svn.chromium.org/blink/trunk@${do_new_revision} "\ "svn://svn.chromium.org/blink/branches/dart/${do_new_branch}" echo " git svn clone --trunk=trunk --branches=branches/dart"\ " --prefix=blink-svn/ -r165883:HEAD " \ "svn://svn.chromium.org/blink src/third_party/WebKit" echo echo " cd src/third_party/WebKit" echo " git cl rebase" echo echo "-----After rebase finishes-----" echo echo " 1. Add the below lines to src/third_party/WebKit/.git/config" echo echo "[svn-remote \"dart${do_old_branch}\"]" echo " url = svn://svn.chromium.org/blink/branches/dart/${do_old_branch}" echo " fetch = :refs/remotes/dart${do_old_branch}" echo "[svn-remote \"dart${do_new_branch}\"]" echo " url = svn://svn.chromium.org/blink/branches/dart/${do_new_branch}" echo " fetch = :refs/remotes/dart${do_new_branch}" echo echo " 2. Get the code" echo echo " cd src/third_party/WebKit" #TODO(terry): Should the fetch be remotes/blink-svn/multivm-${do_new_branch} echo " git svn fetch dart${do_old_branch} && git svn fetch dart${do_new_branch}" fi } # Displays each of the 3 steps, of GIT commands, to create the # branches for a Dartium roll. # # Givin the following Dartium roll information: # Previous Dartium roll 1847 @251094 ($OLD) # New Dartium roll to make 1908 @ 259084 ($NEW) # # Three branches will be created a stripped[$OLD], trunkdart[$OLD] # and trunkdart[$NEW]. # # |==============================================| # | $OLD | 1847 | # |----------------------------------------------| # | $OLD_REV | 251094 | # |----------------------------------------------| # | $NEW | 1908 | # |----------------------------------------------| # | $NEW_REV | 259084 | # |==============================================| # # stripped$OLD - Branch with upstream patches stripped out. # trunkdart$OLD - Branch with all patches for $OLD. # trunkdart$NEW - Branch of a new Chromium/Blink release with # cherry-picked $OLD commits from trunkdart$OLD. # # stripped$OLD, trunkdart$OLD points the SVN remote repository # # svn://svn.chromium.org/chrome/branches/dart/1847/src # # trunkdart$NEW points to the SVN remote repository # svn://svn.chromium.org/chrome/branches/dart/1908/src # # STEP 1. # ------- # Create the stripped$OLD: # > git checkout -b stripped$OLD dart$OLD # > git rebase -i $BASE # # e.g., git checkout -b stripped1847 dart1847 # git rebase -i 3345f6a26911beda2ed352e887549bc514acb4bd # # Rebasing with -i will launch an editor, show all commits after $BASE and let # you interactively remove any upstream commits from trunk. Upstream commits # have a format of "Incrementing VERSION to 32.0.1847.78". Then save and quit # the editor. # # $BASE and $LAST are computed by this script and is returned in the # 'git rebase -i ' command. # # NOTE: How $BASE and $LAST are computed: # --------------------------------------- # $BASE, first commit in $OLD, is computed by: # > git rev-list stripped1847 --pretty=format:'%H' | tail -n 1 # Return a GIT hash code e.g., 3345f6a26911beda2ed352e887549bc514acb4bd # # $LAST, last commit in $NEW, is computed by: # > git log stripped1847 --pretty=format:'%H' -1 # Return a GIT hash code e.g., 44d12cd4b7e041f8d06f8735f1af08abb66825c4 # # STEP 2. # ------- # Create the trunkdart$OLD e.g., # > git checkout -b trunkdart$OLD $BASE # > git cherry-pick $BASE..$LAST # # e.g., git checkout -b trunkdart1847 # # Create branch trunkdart$OLD and reapplies all Dart-related work on $OLD (from # the stripped branch created in Step1.). This cherry-pick should not have any # conflicts as you are rebasing onto exactly the same source code layout. # # STEP 3. # ------- # Create the branch for $NEW (trunkdart$NEW): # > git checkout -b trunkdart$NEW dart$NEW # > git cherry-pick $BASE2..$LAST2 # # Important points trunkdart$NEW is attached to the remote SVN repository created # in pre-steps. # # e.g., git checkout -b trunkdart1908 dart1908 # git cherry-pick xxxx..xxxx # # $BASE2 should be the same as $BASE to validate with: # # > git log trunkdart$OLD --grep=@$OLD_REV --pretty=format:'%H' | tail -1 # # e.g., git log trunkdart1847 --grep=251094 --pretty=format:'%H' | tail -1 # 3345f6a26911beda2ed352e887549bc514acb4bd # # $LAST2 is the last commit in $OLD in trunkdart$OLD computed by: # # > git log trunkdart$OLD --pretty=format:'%H' -1 # # e.g., > git log trunkdart1847 --pretty=format:'%H' -1 # 2549d8ecd211ee6fed6699d70f319e077b425be4 # # The we'll cherry-pick commits from $OLD. # e.g., # > git cherry-pick 3345f6a26911beda2ed352e887549bc514acb4bd..2549d8ecd211ee6fed6699d70f319e077b425be4 # # Cherry picking is an iterative process. Each commit in the $OLD branch is # applied to the $NEW branch any conflicts will need to fixed. # # Fix each file conflict(s) in a particular commit: # # > vim # > git add # # When all file conflicts for a particular commit are done then: # # > git commit -a -m "Merged $OLD" # # Continue the original cherry-picking # > git cherry-pick --continue # # # ******************************************************************** # * IMPORTANT: * # ******************************************************************** # # When all commits are made to our new trunk (trunkdart$NEW). Then try an # initial dcommit with the --dry-run option. # # > git svn dcommit --dry-run # # e.g., git svn dcommit --dry-run # Committing to svn://svn.chromium.org/chrome/branches/dart/1908/src ... # diff-tree 48e85b5f247696c432d9dbb55c37f88f4df8a06a~1 48e85b5f247696c432d9dbb55c37f88f4df8a06a # ... # # It is important to check the first line "Committing to " the repository # should be the new remote SVN e.g., svn://svn.chromium.org/chrome/branches/dart/1908/src ... # # IT SHOULD NOT BE "svn://svn.chromium.org/chrome/trunk/src ..." this will # dcommit the changes to the chrome trunk and break the chromium build. # function roll_chrome_commands() { stripped_found=$(stripped_exist) old_branch_found=$(trunk_exist ${do_old_branch}) new_branch_found=$(trunk_exist ${do_new_branch}) echo echo "================================================" echo "| git commands to run: |" echo "================================================" remoteOld=dart${do_old_branch} strip_branch=$(stripped_name) if [ "$stripped_found" = "" ]; then echo "------------------ Step 1. ---------------------" echo # Git command to create stripped old branch. echo "git checkout -b ${strip_branch} ${remoteOld}" # Get hashes for base for do_old_branch. hash_codes_base_last ${remoteOld} echo "git rebase -i ${hash_base}" echo elif [ "$old_branch_found" = "" ]; then echo "------------------ Step 2. ---------------------" echo # Get hashes for base, last and base hash from trunk for the last branch. hash_codes_base_last ${strip_branch} # Git command to create old branch with only changes from base to last # commits for that branch. Checkout based on stripped$OLD first commit # $BASE. branch_trunkdart_old=$(trunkdart_name ${do_old_branch}) echo "git checkout -b ${branch_trunkdart_old} ${hash_base}" echo "git cherry-pick ${hash_base}..${hash_last}" echo elif [ "$new_branch_found" = "" ]; then echo "------------------ Step 3. ---------------------" echo # Git command to create new branch to roll. branch_trunkdart_new=$(trunkdart_name ${do_new_branch}) # get base and last commit hashes of the trunkdart$OLD hash_codes_base2_last2 ${branch_trunkdart_old} echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}" echo "git cherry-pick ${hash_base2}..${hash_last2}" echo else echo "===== Nothing to do - Roll setup complete. =====" fi echo "================================================" } function roll_blink_commands() { stripped_found=$(stripped_exist) old_branch_found=$(trunk_exist ${do_old_branch}) new_branch_found=$(trunk_exist ${do_new_branch}) echo echo "================================================" echo "| git commands to run: |" echo "================================================" remoteOld=dart${do_old_branch} strip_branch=$(stripped_name) if [ "$stripped_found" = "" ]; then echo "------------------ Step 1. ---------------------" echo # Git command to create stripped old branch. echo "git checkout -b ${strip_branch} ${remoteOld}" # Get hashes for base dir do_old_branch. hash_codes_base_last ${remoteOld} eho "git rebase -i ${hash_base}" echo elif [ "$old_branch_found" = "" ]; then echo "------------------ Step 2. ---------------------" echo # Get hashes for base, last and base hash from trunk for the last branch. hash_codes_base_last ${strip_branch} # Git command to create old branch with only changes from base to last # commits for that branch. Checkout based on stripped$OLD first commit # $BASE. branch_trunkdart_old=$(trunkdart_name ${do_old_branch}) echo "git checkout -b ${branch_trunkdart_old} ${hash_base}" echo "git cherry-pick ${hash_base}..${hash_last}" echo elif [ "$new_branch_found" = "" ]; then echo "------------------ Step 3. ---------------------" echo # Git command to create new branch to roll. branch_trunkdart_new=$(trunkdart_name ${do_new_branch}) # get base and last commit hashes of the trunkdart$OLD hash_codes_base2_last2 ${branch_trunkdart_old} echo "git checkout -b ${branch_trunkdart_new} ${remoteOld}" echo "git cherry-pick ${hash_base2}..${hash_last2}" echo else echo "===== Nothing to do - Roll setup complete. =====" fi echo "================================================" } # checkout strippedOOOO and trunkdartNNNN create_branches=0 do_info_hashes=0 base_dir="" # Display the pre-roll commands; if specified nothing else is displayed. do_pre_roll=0 # which branch chrome or blink do_which="" # Display detail information about all major steps do_verbose=0 # $OLD branch do_old_branch="" do_old_revision="" # $NEW branch do_new_branch="" do_new_revision="" curr_switch="" for var in "$@" do case "$var" in --help) usage exit ;; --verbose) do_verbose=1 curr_switch="" ;; --no-verbose) do_verbose=0 curr_switch="" ;; --chrome) if [ "$do_which" != "" ]; then $(display_error "--chrome can not be specified with --blink") exit $E_INVALID_ARG fi do_which="chrome" curr_switch="" ;; --blink) if [ "$do_which" != "" ]; then $(display_error "--blink can not be specified with --chrome") exit $E_INVALID_ARG fi do_which="blink" curr_switch="" ;; --pre-roll) do_pre_roll=1 curr_switch="" ;; --roll) roll_branches=1 curr_switch="" ;; --info) do_info_hashes=1 curr_switch="" ;; --directory) curr_switch="base-directory" # takes an argument. ;; --old-branch) curr_switch="old-branch" # takes an argument. ;; --new-branch) curr_switch="new-branch" # takes an argument. ;; --old-revision) curr_switch="old-revision" # takes an argument. ;; --new-revision) curr_switch="new-revision" # takes an argument. ;; *) prefix=${var:0:2} if [ "$prefix" = "--" ]; then $(display_error "unexpected switch ${var}") exit $E_INVALID_ARG fi case "$curr_switch" in base-directory) base_dir="${var}" ;; old-branch) do_old_branch="${var}" ;; old-revision) do_old_revision="${var}" ;; new-branch) do_new_branch="${var}" ;; new-revision) do_new_revision="${var}" ;; *) if [ "$curr_switch" != "" ]; then $(display_error "unexpected paramter for ${curr_switch}") exit $E_INVALID_ARG else $(display_error "unexpected switch ${var}") exit $E_INVALID_ARG fi ;; esac curr_switch="" ;; esac done # Insure that everything is known otherwise prompt information. if [ "$base_dir" = "" ]; then echo "--directory switch must be specified." exit $E_INVALID_ARG fi if [ "$do_which" == "" ]; then echo "--chrome or --blink switch must be specified." exit $E_INVALID_ARG fi if [ "$do_old_branch" = "" ]; then echo "Enter LAST ${do_which} true branch (e.g., Chrome version 34.0.1847.92 true branch is 1847)" read do_old_branch fi if [ "$do_old_revision" = "" ]; then echo "Enter LAST ${do_which} base trunk revision #" read do_old_revision fi if [ "$do_new_branch" = "" ]; then echo "Enter NEW ${do_which} true branch (e.g., Chrome version 35.0.1908.4 true branch is 1908)" read do_new_branch fi if [ "$do_new_revision" = "" ]; then echo "Enter NEW ${do_which} base trunk revision #" read do_new_revision fi echo echo "Rolling new branch ${do_new_branch}@${do_new_revision}" verbose_message verbose_message "Previous branch ${do_old_branch}@${do_old_revision}" verbose_message "New branch ${do_new_branch}@${do_new_revision}" verbose_message if [[ "$do_pre_roll" = "1" ]]; then display_remote_repository_creation exit 1 fi pushd . > /dev/null if [ "$base_dir" != "" ]; then cd ${base_dir} fi cd src if [ "$do_which" = "blink" ]; then cd third_party/WebKit fi # Disable ^C and ^Z while running script. trap '' INT trap '' TSTP validate_remotes display_roll_commands display_hashes # Insure that all local branches for the roll are NOT based on the chrome or # blink trunks. validate_branches # Re-enable ^C and ^Z. trap - INT trap - TSTP popd > /dev/null