12 |
12 |
13 For more information: |
13 For more information: |
14 http://mercurial.selenic.com/wiki/RebaseExtension |
14 http://mercurial.selenic.com/wiki/RebaseExtension |
15 ''' |
15 ''' |
16 |
16 |
17 from mercurial import hg, util, repair, merge, cmdutil, commands |
17 from mercurial import hg, util, repair, merge, cmdutil, commands, bookmarks |
18 from mercurial import extensions, copies, patch |
18 from mercurial import extensions, copies, patch |
19 from mercurial.commands import templateopts |
19 from mercurial.commands import templateopts |
20 from mercurial.node import nullrev |
20 from mercurial.node import nullrev |
21 from mercurial.lock import release |
21 from mercurial.lock import release |
22 from mercurial.i18n import _ |
22 from mercurial.i18n import _ |
178 |
178 |
179 # Rebase |
179 # Rebase |
180 if not targetancestors: |
180 if not targetancestors: |
181 targetancestors = set(repo.changelog.ancestors(target)) |
181 targetancestors = set(repo.changelog.ancestors(target)) |
182 targetancestors.add(target) |
182 targetancestors.add(target) |
|
183 |
|
184 # Keep track of the current bookmarks in order to reset them later |
|
185 currentbookmarks = repo._bookmarks.copy() |
183 |
186 |
184 sortedstate = sorted(state) |
187 sortedstate = sorted(state) |
185 total = len(sortedstate) |
188 total = len(sortedstate) |
186 pos = 0 |
189 pos = 0 |
187 for rev in sortedstate: |
190 for rev in sortedstate: |
239 extrafn=extrafn) |
242 extrafn=extrafn) |
240 |
243 |
241 if 'qtip' in repo.tags(): |
244 if 'qtip' in repo.tags(): |
242 updatemq(repo, state, skipped, **opts) |
245 updatemq(repo, state, skipped, **opts) |
243 |
246 |
|
247 if currentbookmarks: |
|
248 # Nodeids are needed to reset bookmarks |
|
249 nstate = {} |
|
250 for k, v in state.iteritems(): |
|
251 if v != nullmerge: |
|
252 nstate[repo[k].node()] = repo[v].node() |
|
253 |
244 if not keepf: |
254 if not keepf: |
245 # Remove no more useful revisions |
255 # Remove no more useful revisions |
246 rebased = [rev for rev in state if state[rev] != nullmerge] |
256 rebased = [rev for rev in state if state[rev] != nullmerge] |
247 if rebased: |
257 if rebased: |
248 if set(repo.changelog.descendants(min(rebased))) - set(state): |
258 if set(repo.changelog.descendants(min(rebased))) - set(state): |
249 ui.warn(_("warning: new changesets detected " |
259 ui.warn(_("warning: new changesets detected " |
250 "on source branch, not stripping\n")) |
260 "on source branch, not stripping\n")) |
251 else: |
261 else: |
252 # backup the old csets by default |
262 # backup the old csets by default |
253 repair.strip(ui, repo, repo[min(rebased)].node(), "all") |
263 repair.strip(ui, repo, repo[min(rebased)].node(), "all") |
|
264 |
|
265 if currentbookmarks: |
|
266 updatebookmarks(repo, nstate, currentbookmarks, **opts) |
254 |
267 |
255 clearstatus(repo) |
268 clearstatus(repo) |
256 ui.note(_("rebase completed\n")) |
269 ui.note(_("rebase completed\n")) |
257 if os.path.exists(repo.sjoin('undo')): |
270 if os.path.exists(repo.sjoin('undo')): |
258 util.unlinkpath(repo.sjoin('undo')) |
271 util.unlinkpath(repo.sjoin('undo')) |
398 |
411 |
399 # restore old series to preserve guards |
412 # restore old series to preserve guards |
400 mq.fullseries = original_series |
413 mq.fullseries = original_series |
401 mq.series_dirty = True |
414 mq.series_dirty = True |
402 mq.savedirty() |
415 mq.savedirty() |
|
416 |
|
417 def updatebookmarks(repo, nstate, originalbookmarks, **opts): |
|
418 'Move bookmarks to their correct changesets' |
|
419 current = repo._bookmarkcurrent |
|
420 for k, v in originalbookmarks.iteritems(): |
|
421 if v in nstate: |
|
422 if nstate[v] != nullmerge: |
|
423 # reset the pointer if the bookmark was moved incorrectly |
|
424 if k != current: |
|
425 repo._bookmarks[k] = nstate[v] |
|
426 |
|
427 bookmarks.write(repo) |
403 |
428 |
404 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, |
429 def storestatus(repo, originalwd, target, state, collapse, keep, keepbranches, |
405 external): |
430 external): |
406 'Store the current status to allow recovery' |
431 'Store the current status to allow recovery' |
407 f = repo.opener("rebasestate", "w") |
432 f = repo.opener("rebasestate", "w") |