OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 # Copyright 2012 the V8 project authors. All rights reserved. | 2 # Copyright 2012 the V8 project authors. All rights reserved. |
3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
5 # met: | 5 # met: |
6 # | 6 # |
7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
10 # copyright notice, this list of conditions and the following | 10 # copyright notice, this list of conditions and the following |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
62 source $COMMIT_HASHES_FILE | 62 source $COMMIT_HASHES_FILE |
63 } | 63 } |
64 | 64 |
65 restore_patch_commit_hashes_if_unset() { | 65 restore_patch_commit_hashes_if_unset() { |
66 [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && restore_patch_commit_hashes | 66 [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && restore_patch_commit_hashes |
67 [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && [[ -z "$EXTRA_PATCH" ]] && \ | 67 [[ "${#PATCH_COMMIT_HASHES[@]}" == 0 ]] && [[ -z "$EXTRA_PATCH" ]] && \ |
68 die "Variable PATCH_COMMIT_HASHES could not be restored." | 68 die "Variable PATCH_COMMIT_HASHES could not be restored." |
69 } | 69 } |
70 | 70 |
71 ########## Option parsing | 71 ########## Option parsing |
| 72 REVERT_FROM_BLEEDING_EDGE=0 |
72 | 73 |
73 while getopts ":hs:fp:rm:" OPTION ; do | 74 while getopts ":hs:fp:rm:R" OPTION ; do |
74 case $OPTION in | 75 case $OPTION in |
75 h) usage | 76 h) usage |
76 exit 0 | 77 exit 0 |
77 ;; | 78 ;; |
78 p) EXTRA_PATCH=$OPTARG | 79 p) EXTRA_PATCH=$OPTARG |
79 ;; | 80 ;; |
80 f) rm -f "$ALREADY_MERGING_SENTINEL_FILE" | 81 f) rm -f "$ALREADY_MERGING_SENTINEL_FILE" |
81 ;; | 82 ;; |
82 r) REVERSE_PATCH="--reverse" | 83 r) REVERSE_PATCH="--reverse" |
83 ;; | 84 ;; |
84 m) NEW_COMMIT_MSG=$OPTARG | 85 m) NEW_COMMIT_MSG=$OPTARG |
85 ;; | 86 ;; |
86 s) START_STEP=$OPTARG | 87 s) START_STEP=$OPTARG |
87 ;; | 88 ;; |
| 89 R) REVERSE_PATCH="--reverse" |
| 90 REVERT_FROM_BLEEDING_EDGE=1 |
| 91 ;; |
88 ?) echo "Illegal option: -$OPTARG" | 92 ?) echo "Illegal option: -$OPTARG" |
89 usage | 93 usage |
90 exit 1 | 94 exit 1 |
91 ;; | 95 ;; |
92 esac | 96 esac |
93 done | 97 done |
94 let OPTION_COUNT=$OPTIND-1 | 98 let OPTION_COUNT=$OPTIND-1 |
95 shift $OPTION_COUNT | 99 shift $OPTION_COUNT |
96 | 100 |
97 ########## Regular workflow | 101 ########## Regular workflow |
98 | 102 |
99 # If there is a merge in progress, abort. | 103 # If there is a merge in progress, abort. |
100 [[ -e "$ALREADY_MERGING_SENTINEL_FILE" ]] && [[ $START_STEP -eq 0 ]] \ | 104 [[ -e "$ALREADY_MERGING_SENTINEL_FILE" ]] && [[ $START_STEP -eq 0 ]] \ |
101 && die "A merge is already in progress" | 105 && die "A merge is already in progress" |
102 touch "$ALREADY_MERGING_SENTINEL_FILE" | 106 touch "$ALREADY_MERGING_SENTINEL_FILE" |
103 | 107 |
104 initial_environment_checks | 108 initial_environment_checks |
105 | 109 |
106 if [ $START_STEP -le $CURRENT_STEP ] ; then | 110 if [ $START_STEP -le $CURRENT_STEP ] ; then |
107 if [ ${#@} -lt 2 ] ; then | 111 let MIN_EXPECTED_ARGS=2-$REVERT_FROM_BLEEDING_EDGE |
| 112 if [ ${#@} -lt $MIN_EXPECTED_ARGS ] ; then |
108 if [ -z "$EXTRA_PATCH" ] ; then | 113 if [ -z "$EXTRA_PATCH" ] ; then |
109 die "Either a patch file or revision numbers must be specified" | 114 die "Either a patch file or revision numbers must be specified" |
110 fi | 115 fi |
111 if [ -z "$NEW_COMMIT_MSG" ] ; then | 116 if [ -z "$NEW_COMMIT_MSG" ] ; then |
112 die "You must specify a merge comment if no patches are specified" | 117 die "You must specify a merge comment if no patches are specified" |
113 fi | 118 fi |
114 fi | 119 fi |
115 echo ">>> Step $CURRENT_STEP: Preparation" | 120 echo ">>> Step $CURRENT_STEP: Preparation" |
116 MERGE_TO_BRANCH=$1 | 121 if [ $REVERT_FROM_BLEEDING_EDGE==1 ] ; then |
117 [[ -n "$MERGE_TO_BRANCH" ]] || die "Please specify a branch to merge to" | 122 MERGE_TO_BRANCH="bleeding_edge" |
118 shift | 123 else |
| 124 MERGE_TO_BRANCH=$1 |
| 125 [[ -n "$MERGE_TO_BRANCH" ]] || die "Please specify a branch to merge to" |
| 126 shift |
| 127 fi |
119 persist "MERGE_TO_BRANCH" | 128 persist "MERGE_TO_BRANCH" |
120 common_prepare | 129 common_prepare |
121 fi | 130 fi |
122 | 131 |
123 let CURRENT_STEP+=1 | 132 let CURRENT_STEP+=1 |
124 if [ $START_STEP -le $CURRENT_STEP ] ; then | 133 if [ $START_STEP -le $CURRENT_STEP ] ; then |
125 echo ">>> Step $CURRENT_STEP: Create a fresh branch for the patch." | 134 echo ">>> Step $CURRENT_STEP: Create a fresh branch for the patch." |
126 restore_if_unset "MERGE_TO_BRANCH" | 135 restore_if_unset "MERGE_TO_BRANCH" |
127 git checkout -b $BRANCHNAME svn/$MERGE_TO_BRANCH \ | 136 git checkout -b $BRANCHNAME svn/$MERGE_TO_BRANCH \ |
128 || die "Creating branch $BRANCHNAME failed." | 137 || die "Creating branch $BRANCHNAME failed." |
129 fi | 138 fi |
130 | 139 |
131 let CURRENT_STEP+=1 | 140 let CURRENT_STEP+=1 |
132 if [ $START_STEP -le $CURRENT_STEP ] ; then | 141 if [ $START_STEP -le $CURRENT_STEP ] ; then |
133 echo ">>> Step $CURRENT_STEP: Find the git \ | 142 echo ">>> Step $CURRENT_STEP: Find the git \ |
134 revisions associated with the patches." | 143 revisions associated with the patches." |
135 current=0 | 144 current=0 |
136 for REVISION in "$@" ; do | 145 for REVISION in "$@" ; do |
137 NEXT_HASH=$(git svn find-rev "r$REVISION" svn/bleeding_edge) | 146 NEXT_HASH=$(git svn find-rev "r$REVISION" svn/bleeding_edge) |
138 [[ -n "$NEXT_HASH" ]] \ | 147 [[ -n "$NEXT_HASH" ]] \ |
139 || die "Cannot determine git hash for r$REVISION" | 148 || die "Cannot determine git hash for r$REVISION" |
140 PATCH_COMMIT_HASHES[$current]="$NEXT_HASH" | 149 PATCH_COMMIT_HASHES[$current]="$NEXT_HASH" |
141 [[ -n "$REVISION_LIST" ]] && REVISION_LIST="$REVISION_LIST," | 150 [[ -n "$REVISION_LIST" ]] && REVISION_LIST="$REVISION_LIST," |
142 REVISION_LIST="$REVISION_LIST r$REVISION" | 151 REVISION_LIST="$REVISION_LIST r$REVISION" |
143 let current+=1 | 152 let current+=1 |
144 done | 153 done |
145 if [ -n "$REVISION_LIST" ] ; then | 154 if [ -n "$REVISION_LIST" ] ; then |
146 if [ -n "$REVERSE_PATCH" ] ; then | 155 if [ -n "$REVERSE_PATCH" ] ; then |
147 NEW_COMMIT_MSG="Rollback of$REVISION_LIST in $MERGE_TO_BRANCH branch." | 156 if [ $REVERT_FROM_BLEEDING_EDGE -eq 0 ] ; then |
| 157 NEW_COMMIT_MSG="Rollback of$REVISION_LIST in $MERGE_TO_BRANCH branch." |
| 158 else |
| 159 NEW_COMMIT_MSG="Revert$REVISION_LIST." |
| 160 fi |
148 else | 161 else |
149 NEW_COMMIT_MSG="Merged$REVISION_LIST into $MERGE_TO_BRANCH branch." | 162 NEW_COMMIT_MSG="Merged$REVISION_LIST into $MERGE_TO_BRANCH branch." |
150 fi; | 163 fi; |
151 fi; | 164 fi; |
152 | 165 |
153 echo "$NEW_COMMIT_MSG" > $COMMITMSG_FILE | 166 echo "$NEW_COMMIT_MSG" > $COMMITMSG_FILE |
154 echo "" >> $COMMITMSG_FILE | 167 echo "" >> $COMMITMSG_FILE |
155 for HASH in ${PATCH_COMMIT_HASHES[@]} ; do | 168 for HASH in ${PATCH_COMMIT_HASHES[@]} ; do |
156 PATCH_MERGE_DESCRIPTION=$(git log -1 --format=%s $HASH) | 169 PATCH_MERGE_DESCRIPTION=$(git log -1 --format=%s $HASH) |
157 echo "$PATCH_MERGE_DESCRIPTION" >> $COMMITMSG_FILE | 170 echo "$PATCH_MERGE_DESCRIPTION" >> $COMMITMSG_FILE |
(...skipping 24 matching lines...) Expand all Loading... |
182 echo "Applying patch for $HASH to $MERGE_TO_BRANCH..." | 195 echo "Applying patch for $HASH to $MERGE_TO_BRANCH..." |
183 git log -1 -p $HASH > "$TEMPORARY_PATCH_FILE" | 196 git log -1 -p $HASH > "$TEMPORARY_PATCH_FILE" |
184 apply_patch "$TEMPORARY_PATCH_FILE" | 197 apply_patch "$TEMPORARY_PATCH_FILE" |
185 done | 198 done |
186 if [ -n "$EXTRA_PATCH" ] ; then | 199 if [ -n "$EXTRA_PATCH" ] ; then |
187 apply_patch "$EXTRA_PATCH" | 200 apply_patch "$EXTRA_PATCH" |
188 fi | 201 fi |
189 fi | 202 fi |
190 | 203 |
191 let CURRENT_STEP+=1 | 204 let CURRENT_STEP+=1 |
192 if [ $START_STEP -le $CURRENT_STEP ] ; then | 205 if [ $START_STEP -le $CURRENT_STEP ] && [ $REVERT_FROM_BLEEDING_EDGE -eq 0 ] ; t
hen |
193 echo ">>> Step $CURRENT_STEP: Prepare $VERSION_FILE." | 206 echo ">>> Step $CURRENT_STEP: Prepare $VERSION_FILE." |
194 # These version numbers are used again for creating the tag | 207 # These version numbers are used again for creating the tag |
195 read_and_persist_version | 208 read_and_persist_version |
196 fi | 209 fi |
197 | 210 |
198 let CURRENT_STEP+=1 | 211 let CURRENT_STEP+=1 |
199 if [ $START_STEP -le $CURRENT_STEP ] ; then | 212 if [ $START_STEP -le $CURRENT_STEP ] && [ $REVERT_FROM_BLEEDING_EDGE -eq 0 ] ; t
hen |
200 echo ">>> Step $CURRENT_STEP: Increment version number." | 213 echo ">>> Step $CURRENT_STEP: Increment version number." |
201 restore_if_unset "PATCH" | 214 restore_if_unset "PATCH" |
202 NEWPATCH=$(($PATCH + 1)) | 215 NEWPATCH=$(($PATCH + 1)) |
203 confirm "Automatically increment PATCH_LEVEL? (Saying 'n' will fire up \ | 216 confirm "Automatically increment PATCH_LEVEL? (Saying 'n' will fire up \ |
204 your EDITOR on $VERSION_FILE so you can make arbitrary changes. When \ | 217 your EDITOR on $VERSION_FILE so you can make arbitrary changes. When \ |
205 you're done, save the file and exit your EDITOR.)" | 218 you're done, save the file and exit your EDITOR.)" |
206 if [ $? -eq 0 ] ; then | 219 if [ $? -eq 0 ] ; then |
207 echo $NEWPATCH $VERSION_FILE | 220 echo $NEWPATCH $VERSION_FILE |
208 sed -e "/#define PATCH_LEVEL/s/[0-9]*$/$NEWPATCH/" \ | 221 sed -e "/#define PATCH_LEVEL/s/[0-9]*$/$NEWPATCH/" \ |
209 -i.bak "$VERSION_FILE" || die "Could not increment patch level" | 222 -i.bak "$VERSION_FILE" || die "Could not increment patch level" |
(...skipping 17 matching lines...) Expand all Loading... |
227 echo ">>> Step $CURRENT_STEP: Commit to the repository." | 240 echo ">>> Step $CURRENT_STEP: Commit to the repository." |
228 restore_if_unset "MERGE_TO_BRANCH" | 241 restore_if_unset "MERGE_TO_BRANCH" |
229 git checkout $BRANCHNAME \ | 242 git checkout $BRANCHNAME \ |
230 || die "cannot ensure that the current branch is $BRANCHNAME" | 243 || die "cannot ensure that the current branch is $BRANCHNAME" |
231 wait_for_lgtm | 244 wait_for_lgtm |
232 PRESUBMIT_TREE_CHECK="skip" git cl dcommit \ | 245 PRESUBMIT_TREE_CHECK="skip" git cl dcommit \ |
233 || die "failed to commit to $MERGE_TO_BRANCH" | 246 || die "failed to commit to $MERGE_TO_BRANCH" |
234 fi | 247 fi |
235 | 248 |
236 let CURRENT_STEP+=1 | 249 let CURRENT_STEP+=1 |
237 if [ $START_STEP -le $CURRENT_STEP ] ; then | 250 if [ $START_STEP -le $CURRENT_STEP ] && [ $REVERT_FROM_BLEEDING_EDGE -eq 0 ] ; t
hen |
238 echo ">>> Step $CURRENT_STEP: Determine svn commit revision" | 251 echo ">>> Step $CURRENT_STEP: Determine svn commit revision" |
239 restore_if_unset "NEW_COMMIT_MSG" | 252 restore_if_unset "NEW_COMMIT_MSG" |
240 restore_if_unset "MERGE_TO_BRANCH" | 253 restore_if_unset "MERGE_TO_BRANCH" |
241 git svn fetch || die "'git svn fetch' failed." | 254 git svn fetch || die "'git svn fetch' failed." |
242 COMMIT_HASH=$(git log -1 --format=%H --grep="$NEW_COMMIT_MSG" \ | 255 COMMIT_HASH=$(git log -1 --format=%H --grep="$NEW_COMMIT_MSG" \ |
243 svn/$MERGE_TO_BRANCH) | 256 svn/$MERGE_TO_BRANCH) |
244 [[ -z "$COMMIT_HASH" ]] && die "Unable to map git commit to svn revision" | 257 [[ -z "$COMMIT_HASH" ]] && die "Unable to map git commit to svn revision" |
245 SVN_REVISION=$(git svn find-rev $COMMIT_HASH) | 258 SVN_REVISION=$(git svn find-rev $COMMIT_HASH) |
246 echo "subversion revision number is r$SVN_REVISION" | 259 echo "subversion revision number is r$SVN_REVISION" |
247 persist "SVN_REVISION" | 260 persist "SVN_REVISION" |
248 fi | 261 fi |
249 | 262 |
250 let CURRENT_STEP+=1 | 263 let CURRENT_STEP+=1 |
251 if [ $START_STEP -le $CURRENT_STEP ] ; then | 264 if [ $START_STEP -le $CURRENT_STEP ] && [ $REVERT_FROM_BLEEDING_EDGE -eq 0 ] ; t
hen |
252 echo ">>> Step $CURRENT_STEP: Create the tag." | 265 echo ">>> Step $CURRENT_STEP: Create the tag." |
253 restore_if_unset "SVN_REVISION" | 266 restore_if_unset "SVN_REVISION" |
254 restore_version_if_unset "NEW" | 267 restore_version_if_unset "NEW" |
255 echo "Creating tag svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" | 268 echo "Creating tag svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" |
256 if [ "$MERGE_TO_BRANCH" == "trunk" ] ; then | 269 if [ "$MERGE_TO_BRANCH" == "trunk" ] ; then |
257 TO_URL="$MERGE_TO_BRANCH" | 270 TO_URL="$MERGE_TO_BRANCH" |
258 else | 271 else |
259 TO_URL="branches/$MERGE_TO_BRANCH" | 272 TO_URL="branches/$MERGE_TO_BRANCH" |
260 fi | 273 fi |
261 svn copy -r $SVN_REVISION \ | 274 svn copy -r $SVN_REVISION \ |
262 https://v8.googlecode.com/svn/$TO_URL \ | 275 https://v8.googlecode.com/svn/$TO_URL \ |
263 https://v8.googlecode.com/svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH \ | 276 https://v8.googlecode.com/svn/tags/$NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH \ |
264 -m "Tagging version $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" | 277 -m "Tagging version $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" |
265 persist "TO_URL" | 278 persist "TO_URL" |
266 fi | 279 fi |
267 | 280 |
268 let CURRENT_STEP+=1 | 281 let CURRENT_STEP+=1 |
269 if [ $START_STEP -le $CURRENT_STEP ] ; then | 282 if [ $START_STEP -le $CURRENT_STEP ] ; then |
270 echo ">>> Step $CURRENT_STEP: Cleanup." | 283 echo ">>> Step $CURRENT_STEP: Cleanup." |
271 restore_if_unset "SVN_REVISION" | 284 restore_if_unset "SVN_REVISION" |
272 restore_if_unset "TO_URL" | 285 restore_if_unset "TO_URL" |
273 restore_if_unset "REVISION_LIST" | 286 restore_if_unset "REVISION_LIST" |
274 restore_version_if_unset "NEW" | 287 restore_version_if_unset "NEW" |
275 common_cleanup | 288 common_cleanup |
276 echo "*** SUMMARY ***" | 289 if [ $REVERT_FROM_BLEEDING_EDGE==0 ] ; then |
277 echo "version: $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" | 290 echo "*** SUMMARY ***" |
278 echo "branch: $TO_URL" | 291 echo "version: $NEWMAJOR.$NEWMINOR.$NEWBUILD.$NEWPATCH" |
279 echo "svn revision: $SVN_REVISION" | 292 echo "branch: $TO_URL" |
280 [[ -n "$REVISION_LIST" ]] && echo "patches:$REVISION_LIST" | 293 echo "svn revision: $SVN_REVISION" |
| 294 [[ -n "$REVISION_LIST" ]] && echo "patches:$REVISION_LIST" |
| 295 fi |
281 fi | 296 fi |
OLD | NEW |