1fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#!/bin/bash
2fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# Copyright 2012 the V8 project authors. All rights reserved.
3fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# Redistribution and use in source and binary forms, with or without
4fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# modification, are permitted provided that the following conditions are
5fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# met:
6fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#
7fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#     * Redistributions of source code must retain the above copyright
8fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       notice, this list of conditions and the following disclaimer.
9fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#     * Redistributions in binary form must reproduce the above
10fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       copyright notice, this list of conditions and the following
11fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       disclaimer in the documentation and/or other materials provided
12fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       with the distribution.
13fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#     * Neither the name of Google Inc. nor the names of its
14fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       contributors may be used to endorse or promote products derived
15fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#       from this software without specific prior written permission.
16fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org#
17fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
29fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org########## Global variable definitions
30fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
31fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgBRANCHNAME=prepare-merge
32fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgPERSISTFILE_BASENAME=/tmp/v8-merge-to-branch-tempfile
33fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgALREADY_MERGING_SENTINEL_FILE="$PERSISTFILE_BASENAME-already-merging"
34bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comCOMMIT_HASHES_FILE="$PERSISTFILE_BASENAME-PATCH_COMMIT_HASHES"
35bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comTEMPORARY_PATCH_FILE="$PERSISTFILE_BASENAME-temporary-patch"
36bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
37bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com########## Function definitions
38bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
39bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comsource $(dirname $BASH_SOURCE)/common-includes.sh
40fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
41fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgusage() {
42fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgcat << EOF
43fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgusage: $0 [OPTIONS]... [BRANCH] [REVISION]...
44fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
45fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgPerforms the necessary steps to merge revisions from bleeding_edge
46fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgto other branches, including trunk.
47fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
48fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgOPTIONS:
49fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  -h    Show this message
50fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  -s    Specify the step where to start work. Default: 0.
5188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  -p    Specify a patch file to apply as part of the merge
521456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  -m    Specify a commit message for the patch
531456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  -r    Reverse specified patches
54fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgEOF
55fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
56fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
57fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgpersist_patch_commit_hashes() {
58bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo "PATCH_COMMIT_HASHES=( ${PATCH_COMMIT_HASHES[@]} )" > $COMMIT_HASHES_FILE
59fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
60fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
61fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgrestore_patch_commit_hashes() {
62bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  source $COMMIT_HASHES_FILE
63fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
64fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
65fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgrestore_patch_commit_hashes_if_unset() {
66fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && restore_patch_commit_hashes
6788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && [[ -z "$EXTRA_PATCH" ]] && \
68fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org      die "Variable PATCH_COMMIT_HASHES could not be restored."
69fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org}
70fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
71fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org########## Option parsing
72fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
731456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.orgwhile getopts ":hs:fp:rm:" OPTION ; do
74fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  case $OPTION in
75fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    h)  usage
76fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        exit 0
77fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        ;;
7888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org    p)  EXTRA_PATCH=$OPTARG
7988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org        ;;
80fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    f)  rm -f "$ALREADY_MERGING_SENTINEL_FILE"
81fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        ;;
821456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    r)  REVERSE_PATCH="--reverse"
831456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org        ;;
841456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    m)  NEW_COMMIT_MSG=$OPTARG
851456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org        ;;
86fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    s)  START_STEP=$OPTARG
87fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        ;;
88fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    ?)  echo "Illegal option: -$OPTARG"
89fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        usage
90fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        exit 1
91fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org        ;;
92fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  esac
93fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgdone
94fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet OPTION_COUNT=$OPTIND-1
95fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgshift $OPTION_COUNT
96fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
97fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org########## Regular workflow
98fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
99fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org# If there is a merge in progress, abort.
1003233d2f30cad1f77ff9f43fcbee12f182b18f6b6mstarzinger@chromium.org[[ -e "$ALREADY_MERGING_SENTINEL_FILE" ]] && [[ $START_STEP -eq 0 ]] \
101fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org   && die "A merge is already in progress"
102fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgtouch "$ALREADY_MERGING_SENTINEL_FILE"
103fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
104bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.cominitial_environment_checks
105fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
106fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
1071456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  if [ ${#@} -lt 2 ] ; then
1081456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    if [ -z "$EXTRA_PATCH" ] ; then
1091456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org      die "Either a patch file or revision numbers must be specified"
1101456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    fi
1111456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    if [ -z "$NEW_COMMIT_MSG" ] ; then
1121456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org      die "You must specify a merge comment if no patches are specified"
1131456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    fi
11488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  fi
115bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo ">>> Step $CURRENT_STEP: Preparation"
116fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  MERGE_TO_BRANCH=$1
117bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  [[ -n "$MERGE_TO_BRANCH" ]] || die "Please specify a branch to merge to"
118fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  shift
119fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  persist "MERGE_TO_BRANCH"
120bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  common_prepare
121fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
122fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
123fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
124fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
125fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Create a fresh branch for the patch."
126bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  restore_if_unset "MERGE_TO_BRANCH"
127fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  git checkout -b $BRANCHNAME svn/$MERGE_TO_BRANCH \
128fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    || die "Creating branch $BRANCHNAME failed."
129fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
130fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
131fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
132fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
133fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Find the git \
134fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgrevisions associated with the patches."
135fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  current=0
136fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  for REVISION in "$@" ; do
137fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    NEXT_HASH=$(git svn find-rev "r$REVISION" svn/bleeding_edge)
138fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    [[ -n "$NEXT_HASH" ]] \
139fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org      || die "Cannot determine git hash for r$REVISION"
140fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    PATCH_COMMIT_HASHES[$current]="$NEXT_HASH"
14188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org    [[ -n "$REVISION_LIST" ]] && REVISION_LIST="$REVISION_LIST,"
14288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org    REVISION_LIST="$REVISION_LIST r$REVISION"
143fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    let current+=1
144fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  done
1451456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org  if [ -n "$REVISION_LIST" ] ; then
1461456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    if [ -n "$REVERSE_PATCH" ] ; then
1471456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org      NEW_COMMIT_MSG="Rollback of$REVISION_LIST in $MERGE_TO_BRANCH branch."
1481456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    else
1491456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org      NEW_COMMIT_MSG="Merged$REVISION_LIST into $MERGE_TO_BRANCH branch."
1501456e708d277e725ca42a03463af16fe471c9210jkummerow@chromium.org    fi;
15188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  fi;
152bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com
153fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo "$NEW_COMMIT_MSG" > $COMMITMSG_FILE
154bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo "" >> $COMMITMSG_FILE
155fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  for HASH in ${PATCH_COMMIT_HASHES[@]} ; do
156fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    PATCH_MERGE_DESCRIPTION=$(git log -1 --format=%s $HASH)
157fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    echo "$PATCH_MERGE_DESCRIPTION" >> $COMMITMSG_FILE
158bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    echo "" >> $COMMITMSG_FILE
159fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  done
160fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  for HASH in ${PATCH_COMMIT_HASHES[@]} ; do
161fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    BUG=$(git log -1 $HASH | grep "BUG=" | awk -F '=' '{print $NF}')
162bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    if [ -n "$BUG" ] ; then
163bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      [[ -n "$BUG_AGGREGATE" ]] && BUG_AGGREGATE="$BUG_AGGREGATE,"
164fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org      BUG_AGGREGATE="$BUG_AGGREGATE$BUG"
165fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    fi
166fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  done
167bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  if [ -n "$BUG_AGGREGATE" ] ; then
168fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    echo "BUG=$BUG_AGGREGATE" >> $COMMITMSG_FILE
169fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  fi
170fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  persist "NEW_COMMIT_MSG"
17188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  persist "REVISION_LIST"
172fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  persist_patch_commit_hashes
173fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
174fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
175fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
176fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
177bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo ">>> Step $CURRENT_STEP: Apply patches for selected revisions."
178fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_if_unset "MERGE_TO_BRANCH"
179fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_patch_commit_hashes_if_unset "PATCH_COMMIT_HASHES"
1801145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org  rm -f "$TOUCHED_FILES_FILE"
181fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  for HASH in ${PATCH_COMMIT_HASHES[@]} ; do
182bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    echo "Applying patch for $HASH to $MERGE_TO_BRANCH..."
183bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    git log -1 -p $HASH > "$TEMPORARY_PATCH_FILE"
184bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    apply_patch "$TEMPORARY_PATCH_FILE"
185fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  done
18688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  if [ -n "$EXTRA_PATCH" ] ; then
18788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org    apply_patch "$EXTRA_PATCH"
18888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  fi
189fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
190fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
191fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
192fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
193bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo ">>> Step $CURRENT_STEP: Prepare $VERSION_FILE."
194bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  # These version numbers are used again for creating the tag
195bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  read_and_persist_version
196fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
197fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
198fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
199fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
200fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Increment version number."
201fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_if_unset "PATCH"
202fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  NEWPATCH=$(($PATCH + 1))
203fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  confirm "Automatically increment PATCH_LEVEL? (Saying 'n' will fire up \
204fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgyour EDITOR on $VERSION_FILE so you can make arbitrary changes. When \
205fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgyou're done, save the file and exit your EDITOR.)"
206fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  if [ $? -eq 0 ] ; then
20733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org    echo $NEWPATCH $VERSION_FILE
208fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    sed -e "/#define PATCH_LEVEL/s/[0-9]*$/$NEWPATCH/" \
20933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org        -i.bak "$VERSION_FILE" || die "Could not increment patch level"
210fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  else
211fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    $EDITOR "$VERSION_FILE"
212fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  fi
213bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  read_and_persist_version "NEW"
214fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
215fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
216fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
217fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
218fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Commit to local branch."
219fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  git commit -a -F "$COMMITMSG_FILE" \
220fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org    || die "'git commit -a' failed."
221fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
222fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
223bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.comupload_step
224fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
225fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
226fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
227bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo ">>> Step $CURRENT_STEP: Commit to the repository."
228fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_if_unset "MERGE_TO_BRANCH"
229fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  git checkout $BRANCHNAME \
230bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    || die "cannot ensure that the current branch is $BRANCHNAME"
231bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  wait_for_lgtm
232fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  git cl dcommit || die "failed to commit to $MERGE_TO_BRANCH"
233fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
234fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
235fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
236fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
237bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  echo ">>> Step $CURRENT_STEP: Determine svn commit revision"
238fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_if_unset "NEW_COMMIT_MSG"
239fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  restore_if_unset "MERGE_TO_BRANCH"
240fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  git svn fetch || die "'git svn fetch' failed."
241fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  COMMIT_HASH=$(git log -1 --format=%H --grep="$NEW_COMMIT_MSG" \
242bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    svn/$MERGE_TO_BRANCH)
243fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  [[ -z "$COMMIT_HASH" ]] && die "Unable to map git commit to svn revision"
244fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  SVN_REVISION=$(git svn find-rev $COMMIT_HASH)
245fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo "subversion revision number is r$SVN_REVISION"
246fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  persist "SVN_REVISION"
247fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
248fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
249fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
250fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
251fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Create the tag."
252bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  restore_if_unset "SVN_REVISION"
253bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  restore_version_if_unset "NEW"
254fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo "Creating tag svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH"
255bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  if [ "$MERGE_TO_BRANCH" == "trunk" ] ; then
256bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    TO_URL="$MERGE_TO_BRANCH"
257bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  else
258bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    TO_URL="branches/$MERGE_TO_BRANCH"
259bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  fi
260fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  svn copy -r $SVN_REVISION \
261bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    https://v8.googlecode.com/svn/$TO_URL \
262bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    https://v8.googlecode.com/svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH \
263bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com    -m "Tagging version $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH"
26488aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  persist "TO_URL"
265fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
266fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org
267fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orglet CURRENT_STEP+=1
268fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgif [ $START_STEP -le $CURRENT_STEP ] ; then
269fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.org  echo ">>> Step $CURRENT_STEP: Cleanup."
27088aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  restore_if_unset "SVN_REVISION"
27188aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  restore_if_unset "TO_URL"
27288aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  restore_if_unset "REVISION_LIST"
27388aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  restore_version_if_unset "NEW"
274bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  common_cleanup
27588aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  echo "*** SUMMARY ***"
27688aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  echo "version: $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH"
27788aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  echo "branch: $TO_URL"
27888aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  echo "svn revision: $SVN_REVISION"
27988aa058bdadfa79ae2836d12d6dd2d1c28aa490cdanno@chromium.org  [[ -n "$REVISION_LIST" ]] && echo "patches:$REVISION_LIST"
280fa458e413c3e5b8d479e49258d060b7bb4567c57danno@chromium.orgfi
281