Show More
@@ -0,0 +1,85 b'' | |||||
|
1 | $ cat >> $HGRCPATH <<EOF | |||
|
2 | > [extensions] | |||
|
3 | > graphlog= | |||
|
4 | > rebase= | |||
|
5 | > | |||
|
6 | > [alias] | |||
|
7 | > tglog = log -G --template "{rev}: '{desc}' bookmarks: {bookmarks}\n" | |||
|
8 | > EOF | |||
|
9 | ||||
|
10 | Create a repo with several bookmarks | |||
|
11 | $ hg init a | |||
|
12 | $ cd a | |||
|
13 | ||||
|
14 | $ echo a > a | |||
|
15 | $ hg ci -Am A | |||
|
16 | adding a | |||
|
17 | ||||
|
18 | $ echo b > b | |||
|
19 | $ hg ci -Am B | |||
|
20 | adding b | |||
|
21 | $ hg book 'X' | |||
|
22 | $ hg book 'Y' | |||
|
23 | ||||
|
24 | $ echo c > c | |||
|
25 | $ hg ci -Am C | |||
|
26 | adding c | |||
|
27 | $ hg book 'Z' | |||
|
28 | ||||
|
29 | $ hg up -q 0 | |||
|
30 | ||||
|
31 | $ echo d > d | |||
|
32 | $ hg ci -Am D | |||
|
33 | adding d | |||
|
34 | created new head | |||
|
35 | ||||
|
36 | $ hg tglog | |||
|
37 | @ 3: 'D' bookmarks: | |||
|
38 | | | |||
|
39 | | o 2: 'C' bookmarks: Y Z | |||
|
40 | | | | |||
|
41 | | o 1: 'B' bookmarks: X | |||
|
42 | |/ | |||
|
43 | o 0: 'A' bookmarks: | |||
|
44 | ||||
|
45 | ||||
|
46 | Move only rebased bookmarks | |||
|
47 | ||||
|
48 | $ cd .. | |||
|
49 | $ hg clone -q a a1 | |||
|
50 | ||||
|
51 | $ cd a1 | |||
|
52 | $ hg up -q Z | |||
|
53 | ||||
|
54 | $ hg rebase --detach -s Y -d 3 | |||
|
55 | saved backup bundle to $TESTTMP/a1/.hg/strip-backup/*-backup.hg (glob) | |||
|
56 | ||||
|
57 | $ hg tglog | |||
|
58 | @ 3: 'C' bookmarks: Y Z | |||
|
59 | | | |||
|
60 | o 2: 'D' bookmarks: | |||
|
61 | | | |||
|
62 | | o 1: 'B' bookmarks: X | |||
|
63 | |/ | |||
|
64 | o 0: 'A' bookmarks: | |||
|
65 | ||||
|
66 | Keep bookmarks to the correct rebased changeset | |||
|
67 | ||||
|
68 | $ cd .. | |||
|
69 | $ hg clone -q a a2 | |||
|
70 | ||||
|
71 | $ cd a2 | |||
|
72 | $ hg up -q Z | |||
|
73 | ||||
|
74 | $ hg rebase -s 1 -d 3 | |||
|
75 | saved backup bundle to $TESTTMP/a2/.hg/strip-backup/*-backup.hg (glob) | |||
|
76 | ||||
|
77 | $ hg tglog | |||
|
78 | @ 3: 'C' bookmarks: Y Z | |||
|
79 | | | |||
|
80 | o 2: 'B' bookmarks: X | |||
|
81 | | | |||
|
82 | o 1: 'D' bookmarks: | |||
|
83 | | | |||
|
84 | o 0: 'A' bookmarks: | |||
|
85 |
@@ -14,7 +14,7 b' 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 | |
@@ -181,6 +181,9 b' def rebase(ui, repo, **opts):' | |||||
181 | targetancestors = set(repo.changelog.ancestors(target)) |
|
181 | targetancestors = set(repo.changelog.ancestors(target)) | |
182 | targetancestors.add(target) |
|
182 | targetancestors.add(target) | |
183 |
|
183 | |||
|
184 | # Keep track of the current bookmarks in order to reset them later | |||
|
185 | currentbookmarks = repo._bookmarks.copy() | |||
|
186 | ||||
184 | sortedstate = sorted(state) |
|
187 | sortedstate = sorted(state) | |
185 | total = len(sortedstate) |
|
188 | total = len(sortedstate) | |
186 | pos = 0 |
|
189 | pos = 0 | |
@@ -241,6 +244,13 b' def rebase(ui, repo, **opts):' | |||||
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] | |
@@ -252,6 +262,9 b' def rebase(ui, repo, **opts):' | |||||
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") | |
254 |
|
264 | |||
|
265 | if currentbookmarks: | |||
|
266 | updatebookmarks(repo, nstate, currentbookmarks, **opts) | |||
|
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')): | |
@@ -401,6 +414,18 b' def updatemq(repo, state, skipped, **opt' | |||||
401 | mq.series_dirty = True |
|
414 | mq.series_dirty = True | |
402 | mq.savedirty() |
|
415 | mq.savedirty() | |
403 |
|
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) | |||
|
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' |
General Comments 0
You need to be logged in to leave comments.
Login now