blob: 41aebbf78a975bcd9a66f0ec07c4acb55a5171f8 [file] [log] [blame]
#!/bin/bash -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: <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 <hash-code>' 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 <filename>
# > git add <filename>
#
# 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