Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2014 The Chromium Authors. All rights reserved. | 2 # Copyright 2014 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """ | 6 """ |
| 7 Tool to update all branches to have the latest changes from their upstreams. | 7 Tool to update all branches to have the latest changes from their upstreams. |
| 8 """ | 8 """ |
| 9 | 9 |
| 10 import argparse | 10 import argparse |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 123 back_ups += 1 | 123 back_ups += 1 |
| 124 parent = git.run('rev-parse', parent+'~') | 124 parent = git.run('rev-parse', parent+'~') |
| 125 | 125 |
| 126 if back_ups: | 126 if back_ups: |
| 127 logging.debug('Backed parent up by %d from %s to %s', | 127 logging.debug('Backed parent up by %d from %s to %s', |
| 128 back_ups, orig_parent, parent) | 128 back_ups, orig_parent, parent) |
| 129 | 129 |
| 130 if git.hash_one(parent) != start_hash: | 130 if git.hash_one(parent) != start_hash: |
| 131 # Try a plain rebase first | 131 # Try a plain rebase first |
| 132 print 'Rebasing:', branch | 132 print 'Rebasing:', branch |
| 133 if not git.rebase(parent, start_hash, branch, abort=True).success: | 133 rebase_ret = git.rebase(parent, start_hash, branch, abort=True) |
| 134 if not rebase_ret.success: | |
| 134 # TODO(iannucci): Find collapsible branches in a smarter way? | 135 # TODO(iannucci): Find collapsible branches in a smarter way? |
| 135 print "Failed! Attempting to squash", branch, "...", | 136 print "Failed! Attempting to squash", branch, "...", |
| 136 squash_branch = branch+"_squash_attempt" | 137 squash_branch = branch+"_squash_attempt" |
| 137 git.run('checkout', '-b', squash_branch) | 138 git.run('checkout', '-b', squash_branch) |
| 138 git.squash_current_branch(merge_base=start_hash) | 139 git.squash_current_branch(merge_base=start_hash) |
| 139 | 140 |
| 140 # Try to rebase the branch_squash_attempt branch to see if it's empty. | 141 # Try to rebase the branch_squash_attempt branch to see if it's empty. |
| 141 squash_ret = git.rebase(parent, start_hash, squash_branch, abort=True) | 142 squash_ret = git.rebase(parent, start_hash, squash_branch, abort=True) |
| 142 empty_rebase = git.hash_one(squash_branch) == git.hash_one(parent) | 143 empty_rebase = git.hash_one(squash_branch) == git.hash_one(parent) |
| 143 git.run('checkout', branch) | 144 git.run('checkout', branch) |
| 144 git.run('branch', '-D', squash_branch) | 145 git.run('branch', '-D', squash_branch) |
| 145 if squash_ret.success and empty_rebase: | 146 if squash_ret.success and empty_rebase: |
| 146 print 'Success!' | 147 print 'Success!' |
| 147 git.squash_current_branch(merge_base=start_hash) | 148 git.squash_current_branch(merge_base=start_hash) |
| 148 git.rebase(parent, start_hash, branch) | 149 git.rebase(parent, start_hash, branch) |
| 149 else: | 150 else: |
| 150 # rebase and leave in mid-rebase state. | 151 # rebase and leave in mid-rebase state. |
| 151 git.rebase(parent, start_hash, branch) | 152 # This second rebase attempt should always fail in the same |
| 153 # way that the first one does. If it magically succeeds then | |
| 154 # something very strange has happened. | |
| 155 second_rebase_ret = git.rebase(parent, start_hash, branch) | |
| 156 assert(not second_rebase_ret.success) | |
|
iannucci
2014/10/13 17:41:39
I would actually throw an AssertionError with the
| |
| 152 print "Failed!" | 157 print "Failed!" |
| 153 print | 158 print |
| 154 print "Here's what git-rebase had to say:" | 159 print "Here's what git-rebase (squashed) had to say:" |
| 155 print squash_ret.message | |
| 156 print | 160 print |
| 161 print squash_ret.stdout | |
| 162 print squash_ret.stderr | |
| 157 print textwrap.dedent( | 163 print textwrap.dedent( |
| 158 """ | 164 """\ |
| 159 Squashing failed. You probably have a real merge conflict. | 165 Squashing failed. You probably have a real merge conflict. |
| 160 | 166 |
| 161 Your working copy is in mid-rebase. Either: | 167 Your working copy is in mid-rebase. Either: |
| 162 * completely resolve like a normal git-rebase; OR | 168 * completely resolve like a normal git-rebase; OR |
| 163 * abort the rebase and mark this branch as dormant: | 169 * abort the rebase and mark this branch as dormant: |
| 164 git config branch.%s.dormant true | 170 git config branch.%s.dormant true |
| 165 | 171 |
| 166 And then run `git rebase-update` again to resume. | 172 And then run `git rebase-update` again to resume. |
| 167 """ % branch) | 173 """ % branch) |
| 168 return False | 174 return False |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 252 % (return_branch, root_branch) | 258 % (return_branch, root_branch) |
| 253 ) | 259 ) |
| 254 git.run('checkout', root_branch) | 260 git.run('checkout', root_branch) |
| 255 git.set_config(STARTING_BRANCH_KEY, '') | 261 git.set_config(STARTING_BRANCH_KEY, '') |
| 256 | 262 |
| 257 return retcode | 263 return retcode |
| 258 | 264 |
| 259 | 265 |
| 260 if __name__ == '__main__': # pragma: no cover | 266 if __name__ == '__main__': # pragma: no cover |
| 261 sys.exit(main(sys.argv[1:])) | 267 sys.exit(main(sys.argv[1:])) |
| OLD | NEW |