| OLD | NEW |
| (Empty) |
| 1 # Copyright 2012 the V8 project authors. All rights reserved. | |
| 2 # Redistribution and use in source and binary forms, with or without | |
| 3 # modification, are permitted provided that the following conditions are | |
| 4 # met: | |
| 5 # | |
| 6 # * Redistributions of source code must retain the above copyright | |
| 7 # notice, this list of conditions and the following disclaimer. | |
| 8 # * Redistributions in binary form must reproduce the above | |
| 9 # copyright notice, this list of conditions and the following | |
| 10 # disclaimer in the documentation and/or other materials provided | |
| 11 # with the distribution. | |
| 12 # * Neither the name of Google Inc. nor the names of its | |
| 13 # contributors may be used to endorse or promote products derived | |
| 14 # from this software without specific prior written permission. | |
| 15 # | |
| 16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 17 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 18 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 19 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 20 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 27 | |
| 28 # This file contains common function definitions for various other shell | |
| 29 # scripts in this directory. It is not meant to be executed by itself. | |
| 30 | |
| 31 # Important: before including this file, the following variables must be set: | |
| 32 # - BRANCHNAME | |
| 33 # - PERSISTFILE_BASENAME | |
| 34 | |
| 35 TEMP_BRANCH=$BRANCHNAME-temporary-branch-created-by-script | |
| 36 VERSION_FILE="src/version.cc" | |
| 37 CHANGELOG_ENTRY_FILE="$PERSISTFILE_BASENAME-changelog-entry" | |
| 38 PATCH_FILE="$PERSISTFILE_BASENAME-patch" | |
| 39 COMMITMSG_FILE="$PERSISTFILE_BASENAME-commitmsg" | |
| 40 TRUNK_REVISION_FILE="$PERSISTFILE_BASENAME-trunkrevision" | |
| 41 START_STEP=0 | |
| 42 CURRENT_STEP=0 | |
| 43 | |
| 44 die() { | |
| 45 [[ -n "$1" ]] && echo "Error: $1" | |
| 46 echo "Exiting." | |
| 47 exit 1 | |
| 48 } | |
| 49 | |
| 50 confirm() { | |
| 51 echo -n "$1 [Y/n] " | |
| 52 read ANSWER | |
| 53 if [[ -z "$ANSWER" || "$ANSWER" == "Y" || "$ANSWER" == "y" ]] ; then | |
| 54 return 0 | |
| 55 else | |
| 56 return 1 | |
| 57 fi | |
| 58 } | |
| 59 | |
| 60 delete_branch() { | |
| 61 local MATCH=$(git branch | grep "$1" | awk '{print $NF}' | grep -x $1) | |
| 62 if [ "$MATCH" == "$1" ] ; then | |
| 63 confirm "Branch $1 exists, do you want to delete it?" | |
| 64 if [ $? -eq 0 ] ; then | |
| 65 git branch -D $1 || die "Deleting branch '$1' failed." | |
| 66 echo "Branch $1 deleted." | |
| 67 else | |
| 68 die "Can't continue. Please delete branch $1 and try again." | |
| 69 fi | |
| 70 fi | |
| 71 } | |
| 72 | |
| 73 # Persist and restore variables to support canceling/resuming execution | |
| 74 # of this script. | |
| 75 persist() { | |
| 76 local VARNAME=$1 | |
| 77 local FILE="$PERSISTFILE_BASENAME-$VARNAME" | |
| 78 local VALUE="${!VARNAME}" | |
| 79 if [ -z "$VALUE" ] ; then | |
| 80 VALUE="__EMPTY__" | |
| 81 fi | |
| 82 echo "$VALUE" > $FILE | |
| 83 } | |
| 84 | |
| 85 restore() { | |
| 86 local VARNAME=$1 | |
| 87 local FILE="$PERSISTFILE_BASENAME-$VARNAME" | |
| 88 local VALUE="$(cat $FILE)" | |
| 89 [[ -z "$VALUE" ]] && die "Variable '$VARNAME' could not be restored." | |
| 90 if [ "$VALUE" == "__EMPTY__" ] ; then | |
| 91 VALUE="" | |
| 92 fi | |
| 93 eval "$VARNAME=\"$VALUE\"" | |
| 94 } | |
| 95 | |
| 96 restore_if_unset() { | |
| 97 local VARNAME=$1 | |
| 98 [[ -z "${!VARNAME}" ]] && restore "$VARNAME" | |
| 99 } | |
| 100 | |
| 101 initial_environment_checks() { | |
| 102 # Cancel if this is not a git checkout. | |
| 103 [[ -d .git ]] \ | |
| 104 || die "This is not a git checkout, this script won't work for you." | |
| 105 | |
| 106 # Cancel if EDITOR is unset or not executable. | |
| 107 [[ -n "$EDITOR" && -x "$(which $EDITOR)" ]] \ | |
| 108 || die "Please set your EDITOR environment variable, you'll need it." | |
| 109 } | |
| 110 | |
| 111 common_prepare() { | |
| 112 # Check for a clean workdir. | |
| 113 [[ -z "$(git status -s -uno)" ]] \ | |
| 114 || die "Workspace is not clean. Please commit or undo your changes." | |
| 115 | |
| 116 # Persist current branch. | |
| 117 CURRENT_BRANCH=$(git status -s -b -uno | grep "^##" | awk '{print $2}') | |
| 118 persist "CURRENT_BRANCH" | |
| 119 | |
| 120 # Fetch unfetched revisions. | |
| 121 git svn fetch || die "'git svn fetch' failed." | |
| 122 | |
| 123 # Get ahold of a safe temporary branch and check it out. | |
| 124 if [ "$CURRENT_BRANCH" != "$TEMP_BRANCH" ] ; then | |
| 125 delete_branch $TEMP_BRANCH | |
| 126 git checkout -b $TEMP_BRANCH | |
| 127 fi | |
| 128 | |
| 129 # Delete the branch that will be created later if it exists already. | |
| 130 delete_branch $BRANCHNAME | |
| 131 } | |
| 132 | |
| 133 common_cleanup() { | |
| 134 restore_if_unset "CURRENT_BRANCH" | |
| 135 git checkout -f $CURRENT_BRANCH | |
| 136 [[ "$TEMP_BRANCH" != "$CURRENT_BRANCH" ]] && git branch -D $TEMP_BRANCH | |
| 137 [[ "$BRANCHNAME" != "$CURRENT_BRANCH" ]] && git branch -D $BRANCHNAME | |
| 138 # Clean up all temporary files. | |
| 139 rm -f "$PERSISTFILE_BASENAME"* | |
| 140 } | |
| 141 | |
| 142 # These two functions take a prefix for the variable names as first argument. | |
| 143 read_and_persist_version() { | |
| 144 for v in MAJOR_VERSION MINOR_VERSION BUILD_NUMBER PATCH_LEVEL; do | |
| 145 VARNAME="$1${v%%_*}" | |
| 146 VALUE=$(grep "#define $v" "$VERSION_FILE" | awk '{print $NF}') | |
| 147 eval "$VARNAME=\"$VALUE\"" | |
| 148 persist "$VARNAME" | |
| 149 done | |
| 150 } | |
| 151 restore_version_if_unset() { | |
| 152 for v in MAJOR MINOR BUILD PATCH; do | |
| 153 restore_if_unset "$1$v" | |
| 154 done | |
| 155 } | |
| 156 | |
| 157 upload_step() { | |
| 158 let CURRENT_STEP+=1 | |
| 159 if [ $START_STEP -le $CURRENT_STEP ] ; then | |
| 160 echo ">>> Step $CURRENT_STEP: Upload for code review." | |
| 161 echo -n "Please enter the email address of a V8 reviewer for your patch: " | |
| 162 read REVIEWER | |
| 163 git cl upload -r "$REVIEWER" --send-mail \ | |
| 164 || die "'git cl upload' failed, please try again." | |
| 165 fi | |
| 166 } | |
| 167 | |
| 168 wait_for_lgtm() { | |
| 169 echo "Please wait for an LGTM, then type \"LGTM<Return>\" to commit your \ | |
| 170 change. (If you need to iterate on the patch or double check that it's \ | |
| 171 sane, do so in another shell, but remember to not change the headline of \ | |
| 172 the uploaded CL." | |
| 173 unset ANSWER | |
| 174 while [ "$ANSWER" != "LGTM" ] ; do | |
| 175 [[ -n "$ANSWER" ]] && echo "That was not 'LGTM'." | |
| 176 echo -n "> " | |
| 177 read ANSWER | |
| 178 done | |
| 179 } | |
| 180 | |
| 181 wait_for_resolving_conflicts() { | |
| 182 echo "Applying the patch \"$1\" failed. Either type \"ABORT<Return>\", or \ | |
| 183 resolve the conflicts, stage *all* touched files with 'git add', and \ | |
| 184 type \"RESOLVED<Return>\"" | |
| 185 unset ANSWER | |
| 186 while [ "$ANSWER" != "RESOLVED" ] ; do | |
| 187 [[ "$ANSWER" == "ABORT" ]] && die "Applying the patch failed." | |
| 188 [[ -n "$ANSWER" ]] && echo "That was not 'RESOLVED' or 'ABORT'." | |
| 189 echo -n "> " | |
| 190 read ANSWER | |
| 191 done | |
| 192 } | |
| 193 | |
| 194 # Takes a file containing the patch to apply as first argument. | |
| 195 apply_patch() { | |
| 196 git apply --index --reject $REVERSE_PATCH "$1" || \ | |
| 197 wait_for_resolving_conflicts "$1"; | |
| 198 } | |
| OLD | NEW |