Mercurial > hg
annotate hgext/rebase.py @ 33649:377e8ddaebef stable
pathauditor: disable cache of audited paths by default (issue5628)
The initial attempt was to discard cache when appropriate, but it appears
to be error prone. We had to carefully inspect all places where audit() is
called e.g. without actually updating filesystem, before removing files and
directories, etc.
So, this patch disables the cache of audited paths by default, and enables
it only for the following cases:
- short-lived auditor objects
- repo.vfs, repo.svfs, and repo.cachevfs, which are managed directories
and considered sort of append-only (a file/directory would never be
replaced with a symlink)
There would be more cacheable vfs objects (e.g. mq.queue.opener), but I
decided not to inspect all of them in this patch. We can make them cached
later.
Benchmark result:
- using old clone of http://selenic.com/repo/linux-2.6/ (38319 files)
- on tmpfs
- run HGRCPATH=/dev/null hg up -q --time tip && hg up -q null
- try 4 times and take the last three results
original:
real 7.480 secs (user 1.140+22.760 sys 0.150+1.690)
real 8.010 secs (user 1.070+22.280 sys 0.170+2.120)
real 7.470 secs (user 1.120+22.390 sys 0.120+1.910)
clearcache (the other series):
real 7.680 secs (user 1.120+23.420 sys 0.140+1.970)
real 7.670 secs (user 1.110+23.620 sys 0.130+1.810)
real 7.740 secs (user 1.090+23.510 sys 0.160+1.940)
enable cache only for vfs and svfs (this series):
real 8.730 secs (user 1.500+25.190 sys 0.260+2.260)
real 8.750 secs (user 1.490+25.170 sys 0.250+2.340)
real 9.010 secs (user 1.680+25.340 sys 0.280+2.540)
remove cache function at all (for reference):
real 9.620 secs (user 1.440+27.120 sys 0.250+2.980)
real 9.420 secs (user 1.400+26.940 sys 0.320+3.130)
real 9.760 secs (user 1.530+27.270 sys 0.250+2.970)
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Wed, 26 Jul 2017 22:10:15 +0900 |
parents | 5a5f600b06ad |
children | 86aca74a063b 2f427b57bf90 |
rev | line source |
---|---|
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1 # rebase.py - rebasing feature for mercurial |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
2 # |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
3 # Copyright 2008 Stefano Tortarolo <stefano.tortarolo at gmail dot com> |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8222
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
7 |
8934
9dda4c73fc3b
extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8706
diff
changeset
|
8 '''command to move sets of revisions to a different ancestor |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
9 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
10 This extension lets you rebase changesets in an existing Mercurial |
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
11 repository. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
12 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
13 For more information: |
26421
4b0fc75f9403
urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents:
26360
diff
changeset
|
14 https://mercurial-scm.org/wiki/RebaseExtension |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
15 ''' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
16 |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
17 from __future__ import absolute_import |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
18 |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
19 import errno |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
20 import os |
29205
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
21 |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
22 from mercurial.i18n import _ |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
23 from mercurial.node import ( |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
24 hex, |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
25 nullid, |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
26 nullrev, |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
27 short, |
a0939666b836
py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents:
29128
diff
changeset
|
28 ) |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
29 from mercurial import ( |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
30 bookmarks, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
31 cmdutil, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
32 commands, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
33 copies, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
34 destutil, |
30490
ee2097c560c1
rebase: refer to dirstateguard by its new name
Augie Fackler <augie@google.com>
parents:
30459
diff
changeset
|
35 dirstateguard, |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
36 error, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
37 extensions, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
38 hg, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
39 lock, |
30271
0fa1a41d04e4
rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents:
30007
diff
changeset
|
40 merge as mergemod, |
30495
d528ddc11b33
rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents:
30490
diff
changeset
|
41 mergeutil, |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
42 obsolete, |
33145
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33139
diff
changeset
|
43 obsutil, |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
44 patch, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
45 phases, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
46 registrar, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
47 repair, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
48 repoview, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
49 revset, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
50 scmutil, |
31023
aea06029919e
revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents:
30865
diff
changeset
|
51 smartset, |
29128
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
52 util, |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
53 ) |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
54 |
e521cb13d354
py3: make hgext/rebase.py use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29063
diff
changeset
|
55 release = lock.release |
32375
04baab18d60a
commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32348
diff
changeset
|
56 templateopts = cmdutil.templateopts |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
57 |
26669
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
58 # The following constants are used throughout the rebase module. The ordering of |
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
59 # their values must be maintained. |
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
60 |
07db7e95c464
rebase: added comments
Christian Delahousse <cdelahousse@fb.com>
parents:
26587
diff
changeset
|
61 # Indicates that a revision needs to be rebased |
23490
102f144f6e02
rebase: add a 'revtodo' constant
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23489
diff
changeset
|
62 revtodo = -1 |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
63 nullmerge = -2 |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
64 revignored = -3 |
27013
e97132eb841c
rebase: remove an unused todo
Laurent Charignon <lcharignon@fb.com>
parents:
27012
diff
changeset
|
65 # successor in rebase destination |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
66 revprecursor = -4 |
27013
e97132eb841c
rebase: remove an unused todo
Laurent Charignon <lcharignon@fb.com>
parents:
27012
diff
changeset
|
67 # plain prune (no successor) |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
68 revpruned = -5 |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
69 revskipped = (revignored, revprecursor, revpruned) |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
70 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
71 cmdtable = {} |
32337
46ba2cdda476
registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents:
32327
diff
changeset
|
72 command = registrar.command(cmdtable) |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29610
diff
changeset
|
73 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
25102
diff
changeset
|
74 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
25102
diff
changeset
|
75 # be specifying the version(s) of Mercurial they are tested with, or |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
25102
diff
changeset
|
76 # leave the attribute unspecified. |
29841
d5883fd055c6
extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents:
29610
diff
changeset
|
77 testedwith = 'ships-with-hg-core' |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
78 |
26671
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
79 def _nothingtorebase(): |
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
80 return 1 |
66dc39cd7d06
rebase: factor out nothing to rebase return code
Ryan McElroy <rmcelroy@fb.com>
parents:
26669
diff
changeset
|
81 |
27976
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
82 def _savegraft(ctx, extra): |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
83 s = ctx.extra().get('source', None) |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
84 if s is not None: |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
85 extra['source'] = s |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
86 s = ctx.extra().get('intermediate-source', None) |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
87 if s is not None: |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
88 extra['intermediate-source'] = s |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
89 |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
90 def _savebranch(ctx, extra): |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
91 extra['branch'] = ctx.branch() |
8f4d3eeb5198
rebase: backout changeset d755a9531fce
Siddharth Agarwal <sid0@fb.com>
parents:
27975
diff
changeset
|
92 |
19860
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
93 def _makeextrafn(copiers): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
94 """make an extrafn out of the given copy-functions. |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
95 |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
96 A copy function takes a context and an extra dict, and mutates the |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
97 extra dict as needed based on the given context. |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
98 """ |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
99 def extrafn(ctx, extra): |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
100 for c in copiers: |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
101 c(ctx, extra) |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
102 return extrafn |
6cd9b8428104
rebase: rework extrafn handling to support multiple extrafns
Augie Fackler <raf@durin42.com>
parents:
19852
diff
changeset
|
103 |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
104 def _destrebase(repo, sourceset, destspace=None): |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
105 """small wrapper around destmerge to pass the right extra args |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
106 |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
107 Please wrap destutil.destmerge instead.""" |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
108 return destutil.destmerge(repo, action='rebase', sourceset=sourceset, |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
109 onheadcheck=False, destspace=destspace) |
26717
1755e1d9d1c3
rebase: extra default destination in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26677
diff
changeset
|
110 |
28394
dcb4209bd30d
revset: replace extpredicate by revsetpredicate of registrar
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
28280
diff
changeset
|
111 revsetpredicate = registrar.revsetpredicate() |
27586
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
112 |
42910f9fffeb
revset: use delayregistrar to register predicate in extension easily
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27577
diff
changeset
|
113 @revsetpredicate('_destrebase') |
26719
8bed1eae99df
rebase: rename and test '_destrebase'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26718
diff
changeset
|
114 def _revsetdestrebase(repo, subset, x): |
26301
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
115 # ``_rebasedefaultdest()`` |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
116 |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
117 # default destination for rebase. |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
118 # # XXX: Currently private because I expect the signature to change. |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
119 # # XXX: - bailing out in case of ambiguity vs returning all data. |
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
120 # i18n: "_rebasedefaultdest" is a keyword |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
121 sourceset = None |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
122 if x is not None: |
31023
aea06029919e
revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents:
30865
diff
changeset
|
123 sourceset = revset.getset(repo, smartset.fullreposet(repo), x) |
aea06029919e
revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents:
30865
diff
changeset
|
124 return subset & smartset.baseset([_destrebase(repo, sourceset)]) |
26301
3f8c5c284c86
rebase: move destination computation in a revset
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26165
diff
changeset
|
125 |
29358
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
126 class rebaseruntime(object): |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
127 """This class is a container for rebase runtime state""" |
29399
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
128 def __init__(self, repo, ui, opts=None): |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
129 if opts is None: |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
130 opts = {} |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
131 |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
132 self.repo = repo |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
133 self.ui = ui |
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
134 self.opts = opts |
29358
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
135 self.originalwd = None |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
136 self.external = nullrev |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
137 # Mapping between the old revision id and either what is the new rebased |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
138 # revision or what needs to be done with the old revision. The state |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
139 # dict will be what contains most of the rebase progress state. |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
140 self.state = {} |
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
141 self.activebookmark = None |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
142 self.dest = None |
29360
4cbe62ab5c97
rebase: move local variable 'skipped' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29359
diff
changeset
|
143 self.skipped = set() |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
144 self.destancestors = set() |
29358
6e83f5bbed8d
rebase: introduce a rebaseruntime (RR) class
Kostia Balytskyi <ikostia@fb.com>
parents:
29205
diff
changeset
|
145 |
29400
c79da70a4659
rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29399
diff
changeset
|
146 self.collapsef = opts.get('collapse', False) |
c79da70a4659
rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29399
diff
changeset
|
147 self.collapsemsg = cmdutil.logmessage(ui, opts) |
29401
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
148 self.date = opts.get('date', None) |
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
149 |
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
150 e = opts.get('extrafn') # internal, used by e.g. hgsubversion |
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
151 self.extrafns = [_savegraft] |
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
152 if e: |
87acd047711e
rebase: move local variables 'date' and 'extrafns' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29400
diff
changeset
|
153 self.extrafns = [e] |
29400
c79da70a4659
rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29399
diff
changeset
|
154 |
29402
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
155 self.keepf = opts.get('keep', False) |
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
156 self.keepbranchesf = opts.get('keepbranches', False) |
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
157 # keepopen is not meant for use on the command line, but by |
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
158 # other extensions |
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
159 self.keepopen = opts.get('keepopen', False) |
29404
591a8069b60e
rebase: move local variable 'obsoletenotrebased' to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29403
diff
changeset
|
160 self.obsoletenotrebased = {} |
29402
7481ffb7ff83
rebase: move local variables related to keeping things unchanged to the RR
Kostia Balytskyi <ikostia@fb.com>
parents:
29401
diff
changeset
|
161 |
31224
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
162 def storestatus(self, tr=None): |
31223
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
163 """Store the current status to allow recovery""" |
31224
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
164 if tr: |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
165 tr.addfilegenerator('rebasestate', ('rebasestate',), |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
166 self._writestatus, location='plain') |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
167 else: |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
168 with self.repo.vfs("rebasestate", "w") as f: |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
169 self._writestatus(f) |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
170 |
183eb1d7f87d
rebase: add storestatus support for transactions
Durham Goode <durham@fb.com>
parents:
31223
diff
changeset
|
171 def _writestatus(self, f): |
31619
91ddb33deea5
rebase: move state serialization to use unfiltered repo
Durham Goode <durham@fb.com>
parents:
31588
diff
changeset
|
172 repo = self.repo.unfiltered() |
31223
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
173 f.write(repo[self.originalwd].hex() + '\n') |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
174 f.write(repo[self.dest].hex() + '\n') |
31223
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
175 f.write(repo[self.external].hex() + '\n') |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
176 f.write('%d\n' % int(self.collapsef)) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
177 f.write('%d\n' % int(self.keepf)) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
178 f.write('%d\n' % int(self.keepbranchesf)) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
179 f.write('%s\n' % (self.activebookmark or '')) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
180 for d, v in self.state.iteritems(): |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
181 oldrev = repo[d].hex() |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
182 if v >= 0: |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
183 newrev = repo[v].hex() |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
184 elif v == revtodo: |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
185 # To maintain format compatibility, we have to use nullid. |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
186 # Please do remove this special case when upgrading the format. |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
187 newrev = hex(nullid) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
188 else: |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
189 newrev = v |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
190 f.write("%s:%s\n" % (oldrev, newrev)) |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
191 repo.ui.debug('rebase status stored\n') |
685b8d077577
rebase: move storestatus onto rebaseruntime
Durham Goode <durham@fb.com>
parents:
31222
diff
changeset
|
192 |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
193 def restorestatus(self): |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
194 """Restore a previously stored status""" |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
195 repo = self.repo |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
196 keepbranches = None |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
197 dest = None |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
198 collapse = False |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
199 external = nullrev |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
200 activebookmark = None |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
201 state = {} |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
202 |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
203 try: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
204 f = repo.vfs("rebasestate") |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
205 for i, l in enumerate(f.read().splitlines()): |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
206 if i == 0: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
207 originalwd = repo[l].rev() |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
208 elif i == 1: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
209 dest = repo[l].rev() |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
210 elif i == 2: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
211 external = repo[l].rev() |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
212 elif i == 3: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
213 collapse = bool(int(l)) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
214 elif i == 4: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
215 keep = bool(int(l)) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
216 elif i == 5: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
217 keepbranches = bool(int(l)) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
218 elif i == 6 and not (len(l) == 81 and ':' in l): |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
219 # line 6 is a recent addition, so for backwards |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
220 # compatibility check that the line doesn't look like the |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
221 # oldrev:newrev lines |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
222 activebookmark = l |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
223 else: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
224 oldrev, newrev = l.split(':') |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
225 if newrev in (str(nullmerge), str(revignored), |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
226 str(revprecursor), str(revpruned)): |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
227 state[repo[oldrev].rev()] = int(newrev) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
228 elif newrev == nullid: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
229 state[repo[oldrev].rev()] = revtodo |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
230 # Legacy compat special case |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
231 else: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
232 state[repo[oldrev].rev()] = repo[newrev].rev() |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
233 |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
234 except IOError as err: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
235 if err.errno != errno.ENOENT: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
236 raise |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
237 cmdutil.wrongtooltocontinue(repo, _('rebase')) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
238 |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
239 if keepbranches is None: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
240 raise error.Abort(_('.hg/rebasestate is incomplete')) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
241 |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
242 skipped = set() |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
243 # recompute the set of skipped revs |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
244 if not collapse: |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32272
diff
changeset
|
245 seen = {dest} |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
246 for old, new in sorted(state.items()): |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
247 if new != revtodo and new in seen: |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
248 skipped.add(old) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
249 seen.add(new) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
250 repo.ui.debug('computed skipped revs: %s\n' % |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
251 (' '.join(str(r) for r in sorted(skipped)) or None)) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
252 repo.ui.debug('rebase status resumed\n') |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32272
diff
changeset
|
253 _setrebasesetvisibility(repo, set(state.keys()) | {originalwd}) |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
254 |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
255 self.originalwd = originalwd |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
256 self.dest = dest |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
257 self.state = state |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
258 self.skipped = skipped |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
259 self.collapsef = collapse |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
260 self.keepf = keep |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
261 self.keepbranchesf = keepbranches |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
262 self.external = external |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
263 self.activebookmark = activebookmark |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
264 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
265 def _handleskippingobsolete(self, rebaserevs, obsoleterevs, dest): |
29479
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
266 """Compute structures necessary for skipping obsolete revisions |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
267 |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
268 rebaserevs: iterable of all revisions that are to be rebased |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
269 obsoleterevs: iterable of all obsolete revisions in rebaseset |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
270 dest: a destination revision for the rebase operation |
29479
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
271 """ |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
272 self.obsoletenotrebased = {} |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
273 if not self.ui.configbool('experimental', 'rebaseskipobsolete', |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
274 default=True): |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
275 return |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
276 rebaseset = set(rebaserevs) |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
277 obsoleteset = set(obsoleterevs) |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
278 self.obsoletenotrebased = _computeobsoletenotrebased(self.repo, |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
279 obsoleteset, dest) |
29479
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
280 skippedset = set(self.obsoletenotrebased) |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
281 _checkobsrebase(self.repo, self.ui, obsoleteset, rebaseset, skippedset) |
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
282 |
29472
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
283 def _prepareabortorcontinue(self, isabort): |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
284 try: |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
285 self.restorestatus() |
31225
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
286 self.collapsemsg = restorecollapsemsg(self.repo, isabort) |
29472
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
287 except error.RepoLookupError: |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
288 if isabort: |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
289 clearstatus(self.repo) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
290 clearcollapsemsg(self.repo) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
291 self.repo.ui.warn(_('rebase aborted (no revision is removed,' |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
292 ' only broken state is cleared)\n')) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
293 return 0 |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
294 else: |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
295 msg = _('cannot continue inconsistent rebase') |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
296 hint = _('use "hg rebase --abort" to clear broken state') |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
297 raise error.Abort(msg, hint=hint) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
298 if isabort: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
299 return abort(self.repo, self.originalwd, self.dest, |
29472
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
300 self.state, activebookmark=self.activebookmark) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
301 |
29479
5d16ebe7b14f
rebase: move handling of obsolete commits to be a separate RR class method
Kostia Balytskyi <ikostia@fb.com>
parents:
29478
diff
changeset
|
302 obsrevs = (r for r, st in self.state.items() if st == revprecursor) |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
303 self._handleskippingobsolete(self.state.keys(), obsrevs, self.dest) |
29472
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
304 |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
305 def _preparenewrebase(self, dest, rebaseset): |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
306 if dest is None: |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
307 return _nothingtorebase() |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
308 |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
309 allowunstable = obsolete.isenabled(self.repo, obsolete.allowunstableopt) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
310 if (not (self.keepf or allowunstable) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
311 and self.repo.revs('first(children(%ld) - %ld)', |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
312 rebaseset, rebaseset)): |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
313 raise error.Abort( |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
314 _("can't remove original changesets with" |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
315 " unrebased descendants"), |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
316 hint=_('use --keep to keep original changesets')) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
317 |
29610
754f63671229
rebase: turn rebase revs into set before filtering obsolete
Simon Farnsworth <simonfar@fb.com>
parents:
29552
diff
changeset
|
318 obsrevs = _filterobsoleterevs(self.repo, set(rebaseset)) |
33157
5d29c55414b3
rebase: always pass destination as revnum to _handleskippingobsolete()
Martin von Zweigbergk <martinvonz@google.com>
parents:
33145
diff
changeset
|
319 self._handleskippingobsolete(rebaseset, obsrevs, dest.rev()) |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
320 |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
321 result = buildstate(self.repo, dest, rebaseset, self.collapsef, |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
322 self.obsoletenotrebased) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
323 |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
324 if not result: |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
325 # Empty state built, nothing to rebase |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
326 self.ui.status(_('nothing to rebase\n')) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
327 return _nothingtorebase() |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
328 |
31302
681046de87f1
rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents:
31297
diff
changeset
|
329 for root in self.repo.set('roots(%ld)', rebaseset): |
681046de87f1
rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents:
31297
diff
changeset
|
330 if not self.keepf and not root.mutable(): |
681046de87f1
rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents:
31297
diff
changeset
|
331 raise error.Abort(_("can't rebase public changeset %s") |
681046de87f1
rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents:
31297
diff
changeset
|
332 % root, |
681046de87f1
rebase: abort if *any* commit in rebase set is public
Martin von Zweigbergk <martinvonz@google.com>
parents:
31297
diff
changeset
|
333 hint=_("see 'hg help phases' for details")) |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
334 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
335 (self.originalwd, self.dest, self.state) = result |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
336 if self.collapsef: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
337 self.destancestors = self.repo.changelog.ancestors( |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
338 [self.dest], |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
339 inclusive=True) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
340 self.external = externalparent(self.repo, self.state, |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
341 self.destancestors) |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
342 |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
343 if dest.closesbranch() and not self.keepbranchesf: |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
344 self.ui.status(_('reopening closed branch head %s\n') % dest) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
345 |
33569
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
346 def _performrebase(self, tr): |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
347 repo, ui, opts = self.repo, self.ui, self.opts |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
348 if self.keepbranchesf: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
349 # insert _savebranch at the start of extrafns so if |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
350 # there's a user-provided extrafn it can clobber branch if |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
351 # desired |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
352 self.extrafns.insert(0, _savebranch) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
353 if self.collapsef: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
354 branches = set() |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
355 for rev in self.state: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
356 branches.add(repo[rev].branch()) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
357 if len(branches) > 1: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
358 raise error.Abort(_('cannot collapse multiple named ' |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
359 'branches')) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
360 |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
361 # Rebase |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
362 if not self.destancestors: |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
363 self.destancestors = repo.changelog.ancestors([self.dest], |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
364 inclusive=True) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
365 |
33332
3b7cb3d17137
rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents:
33157
diff
changeset
|
366 # Keep track of the active bookmarks in order to reset them later |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
367 self.activebookmark = self.activebookmark or repo._activebookmark |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
368 if self.activebookmark: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
369 bookmarks.deactivate(repo) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
370 |
31225
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
371 # Store the state before we begin so users can run 'hg rebase --abort' |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
372 # if we fail before the transaction closes. |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
373 self.storestatus() |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
374 |
30007
aca0954d3739
rebase: rebase changesets in topo order (issue5370) (BC)
Xidorn Quan <me@upsuper.org>
parents:
29966
diff
changeset
|
375 sortedrevs = repo.revs('sort(%ld, -topo)', self.state) |
29872
58db005d870e
rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents:
29841
diff
changeset
|
376 cands = [k for k, v in self.state.iteritems() if v == revtodo] |
58db005d870e
rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents:
29841
diff
changeset
|
377 total = len(cands) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
378 pos = 0 |
29552
db26925bdbb0
rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents:
29551
diff
changeset
|
379 for rev in sortedrevs: |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
380 ctx = repo[rev] |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
381 desc = '%d:%s "%s"' % (ctx.rev(), ctx, |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
382 ctx.description().split('\n', 1)[0]) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
383 names = repo.nodetags(ctx.node()) + repo.nodebookmarks(ctx.node()) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
384 if names: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
385 desc += ' (%s)' % ' '.join(names) |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
386 if self.state[rev] == rev: |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
387 ui.status(_('already rebased %s\n') % desc) |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
388 elif self.state[rev] == revtodo: |
29872
58db005d870e
rebase: properly calculate total commits to rebase (issue5347)
timeless <timeless@mozdev.org>
parents:
29841
diff
changeset
|
389 pos += 1 |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
390 ui.status(_('rebasing %s\n') % desc) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
391 ui.progress(_("rebasing"), pos, ("%d:%s" % (rev, ctx)), |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
392 _('changesets'), total) |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
393 p1, p2, base = defineparents(repo, rev, self.dest, |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
394 self.state, |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
395 self.destancestors, |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
396 self.obsoletenotrebased) |
33569
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
397 self.storestatus(tr=tr) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
398 storecollapsemsg(repo, self.collapsemsg) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
399 if len(repo[None].parents()) == 2: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
400 repo.ui.debug('resuming interrupted rebase\n') |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
401 else: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
402 try: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
403 ui.setconfig('ui', 'forcemerge', opts.get('tool', ''), |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
404 'rebase') |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
405 stats = rebasenode(repo, rev, p1, base, self.state, |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
406 self.collapsef, self.dest) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
407 if stats and stats[3] > 0: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
408 raise error.InterventionRequired( |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
409 _('unresolved conflicts (see hg ' |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
410 'resolve, then hg rebase --continue)')) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
411 finally: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
412 ui.setconfig('ui', 'forcemerge', '', 'rebase') |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
413 if not self.collapsef: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
414 merging = p2 != nullrev |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
415 editform = cmdutil.mergeeditform(merging, 'rebase') |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
416 editor = cmdutil.getcommiteditor(editform=editform, **opts) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
417 newnode = concludenode(repo, rev, p1, p2, |
29551
333dd3ab8fb2
rebase: replace extrafn field with _makeextrafn invocations
Kostia Balytskyi <ikostia@fb.com>
parents:
29479
diff
changeset
|
418 extrafn=_makeextrafn(self.extrafns), |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
419 editor=editor, |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
420 keepbranches=self.keepbranchesf, |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
421 date=self.date) |
32313
a580b2d65ded
rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents:
32291
diff
changeset
|
422 if newnode is None: |
a580b2d65ded
rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents:
32291
diff
changeset
|
423 # If it ended up being a no-op commit, then the normal |
a580b2d65ded
rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents:
32291
diff
changeset
|
424 # merge state clean-up path doesn't happen, so do it |
a580b2d65ded
rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents:
32291
diff
changeset
|
425 # here. Fix issue5494 |
a580b2d65ded
rebase: make sure merge state is cleaned up for no-op rebases (issue5494)
Jeremy Fitzhardinge <jsgf@fb.com>
parents:
32291
diff
changeset
|
426 mergemod.mergestate.clean(repo) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
427 else: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
428 # Skip commit if we are collapsing |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
429 repo.setparents(repo[p1].node()) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
430 newnode = None |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
431 # Update the state |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
432 if newnode is not None: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
433 self.state[rev] = repo[newnode].rev() |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
434 ui.debug('rebased as %s\n' % short(newnode)) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
435 else: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
436 if not self.collapsef: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
437 ui.warn(_('note: rebase of %d:%s created no changes ' |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
438 'to commit\n') % (rev, ctx)) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
439 self.skipped.add(rev) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
440 self.state[rev] = p1 |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
441 ui.debug('next revision set to %s\n' % p1) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
442 elif self.state[rev] == nullmerge: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
443 ui.debug('ignoring null merge rebase of %s\n' % rev) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
444 elif self.state[rev] == revignored: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
445 ui.status(_('not rebasing ignored %s\n') % desc) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
446 elif self.state[rev] == revprecursor: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
447 destctx = repo[self.obsoletenotrebased[rev]] |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
448 descdest = '%d:%s "%s"' % (destctx.rev(), destctx, |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
449 destctx.description().split('\n', 1)[0]) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
450 msg = _('note: not rebasing %s, already in destination as %s\n') |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
451 ui.status(msg % (desc, descdest)) |
29477
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
452 elif self.state[rev] == revpruned: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
453 msg = _('note: not rebasing %s, it has no successor\n') |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
454 ui.status(msg % desc) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
455 else: |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
456 ui.status(_('already rebased %s as %s\n') % |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
457 (desc, repo[self.state[rev]])) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
458 |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
459 ui.progress(_('rebasing'), None) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
460 ui.note(_('rebase merging completed\n')) |
becc4c6eca42
rebase: move core rebase logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29476
diff
changeset
|
461 |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
462 def _finishrebase(self): |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
463 repo, ui, opts = self.repo, self.ui, self.opts |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
464 if self.collapsef and not self.keepopen: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
465 p1, p2, _base = defineparents(repo, min(self.state), |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
466 self.dest, self.state, |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
467 self.destancestors, |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
468 self.obsoletenotrebased) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
469 editopt = opts.get('edit') |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
470 editform = 'rebase.collapse' |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
471 if self.collapsemsg: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
472 commitmsg = self.collapsemsg |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
473 else: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
474 commitmsg = 'Collapsed revision' |
33622
5a5f600b06ad
rebase: sort collapsed revisions in commit message (issue5643)
Yuya Nishihara <yuya@tcha.org>
parents:
33590
diff
changeset
|
475 for rebased in sorted(self.state): |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
476 if rebased not in self.skipped and\ |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
477 self.state[rebased] > nullmerge: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
478 commitmsg += '\n* %s' % repo[rebased].description() |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
479 editopt = True |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
480 editor = cmdutil.getcommiteditor(edit=editopt, editform=editform) |
29552
db26925bdbb0
rebase: remove sortedstate-related confusion
Kostia Balytskyi <ikostia@fb.com>
parents:
29551
diff
changeset
|
481 revtoreuse = max(self.state) |
33120
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
482 newnode = concludenode(repo, revtoreuse, p1, self.external, |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
483 commitmsg=commitmsg, |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
484 extrafn=_makeextrafn(self.extrafns), |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
485 editor=editor, |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
486 keepbranches=self.keepbranchesf, |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
487 date=self.date) |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
488 if newnode is None: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
489 newrev = self.dest |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
490 else: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
491 newrev = repo[newnode].rev() |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
492 for oldrev in self.state.iterkeys(): |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
493 if self.state[oldrev] > nullmerge: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
494 self.state[oldrev] = newrev |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
495 |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
496 if 'qtip' in repo.tags(): |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
497 updatemq(repo, self.state, self.skipped, **opts) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
498 |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
499 # restore original working directory |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
500 # (we do this before stripping) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
501 newwd = self.state.get(self.originalwd, self.originalwd) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
502 if newwd == revprecursor: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
503 newwd = self.obsoletenotrebased[self.originalwd] |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
504 elif newwd < 0: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
505 # original directory is a parent of rebase set root or ignored |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
506 newwd = self.originalwd |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
507 if newwd not in [c.rev() for c in repo[None].parents()]: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
508 ui.note(_("update back to initial working directory parent\n")) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
509 hg.updaterepo(repo, newwd, False) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
510 |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
511 if not self.keepf: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
512 collapsedas = None |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
513 if self.collapsef: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
514 collapsedas = newnode |
33590
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
515 clearrebased(ui, repo, self.dest, self.state, self.skipped, |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
516 collapsedas) |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
517 |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
518 clearstatus(repo) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
519 clearcollapsemsg(repo) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
520 |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
521 ui.note(_("rebase completed\n")) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
522 util.unlinkpath(repo.sjoin('undo'), ignoremissing=True) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
523 if self.skipped: |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
524 skippedlen = len(self.skipped) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
525 ui.note(_("%d revisions have been skipped\n") % skippedlen) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
526 |
33332
3b7cb3d17137
rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents:
33157
diff
changeset
|
527 if (self.activebookmark and self.activebookmark in repo._bookmarks and |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
528 repo['.'].node() == repo._bookmarks[self.activebookmark]): |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
529 bookmarks.activate(repo, self.activebookmark) |
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
530 |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
531 @command('rebase', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
532 [('s', 'source', '', |
22789
5f4934487382
rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents:
22405
diff
changeset
|
533 _('rebase the specified changeset and descendants'), _('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
534 ('b', 'base', '', |
22789
5f4934487382
rebase: attempt to clarify --base
Matt Mackall <mpm@selenic.com>
parents:
22405
diff
changeset
|
535 _('rebase everything from branching point of specified changeset'), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
536 _('REV')), |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
537 ('r', 'rev', [], |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
538 _('rebase these revisions'), |
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
539 _('REV')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
540 ('d', 'dest', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
541 _('rebase onto the specified changeset'), _('REV')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
542 ('', 'collapse', False, _('collapse the rebased changesets')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
543 ('m', 'message', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
544 _('use text as collapse commit message'), _('TEXT')), |
15219 | 545 ('e', 'edit', False, _('invoke editor on commit messages')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
546 ('l', 'logfile', '', |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
547 _('read collapse commit message from file'), _('FILE')), |
25025
72f7f98bc5e5
rebase: add short -k option for --keep
Nat Mote <nmote@fb.com>
parents:
24998
diff
changeset
|
548 ('k', 'keep', False, _('keep original changesets')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
549 ('', 'keepbranches', False, _('keep original branch names')), |
17005
50f434510da6
rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
16867
diff
changeset
|
550 ('D', 'detach', False, _('(DEPRECATED)')), |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
551 ('i', 'interactive', False, _('(DEPRECATED)')), |
14306
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
552 ('t', 'tool', '', _('specify merge tool')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
553 ('c', 'continue', False, _('continue an interrupted rebase')), |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
554 ('a', 'abort', False, _('abort an interrupted rebase'))] + |
db2a8eabe952
rebase: use cmdutil.command decorator
Adrian Buehlmann <adrian@cadifra.com>
parents:
14289
diff
changeset
|
555 templateopts, |
17325
e4db509c08ec
rebase: remove second broken synopsis line (issue3172)
Patrick Mezard <patrick@mezard.eu>
parents:
17059
diff
changeset
|
556 _('[-s REV | -b REV] [-d REV] [OPTION]')) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
557 def rebase(ui, repo, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
558 """move changeset (and descendants) to a different branch |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
559 |
7999
b25110140573
rebase: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7955
diff
changeset
|
560 Rebase uses repeated merging to graft changesets from one part of |
10646 | 561 history (the source) onto another (the destination). This can be |
11188
b5c0f6a11430
rebase: stress that only local changesets should be rebased
Martin Geisler <mg@lazybytes.net>
parents:
10762
diff
changeset
|
562 useful for linearizing *local* changes relative to a master |
10646 | 563 development tree. |
564 | |
27454
3e3be524a712
rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents:
27344
diff
changeset
|
565 Published commits cannot be rebased (see :hg:`help phases`). |
3e3be524a712
rebase: simplify documentation about public commits
timeless <timeless@mozdev.org>
parents:
27344
diff
changeset
|
566 To copy commits, see :hg:`help graft`. |
18516
9fbeb61b8ad2
rebase: mention phases in the help
Kevin Bullock <kbullock@ringworld.org>
parents:
18514
diff
changeset
|
567 |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
568 If you don't specify a destination changeset (``-d/--dest``), rebase |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
569 will use the same logic as :hg:`merge` to pick a destination. if |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
570 the current branch contains exactly one other head, the other head |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
571 is merged with by default. Otherwise, an explicit revision with |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
572 which to merge with must be provided. (destination changeset is not |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
573 modified by rebasing, but new changesets are added as its |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
574 descendants.) |
10646 | 575 |
27956
f3eb98b8fe12
doc: prevent non-literal text block from being treated as literal one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27932
diff
changeset
|
576 Here are the ways to select changesets: |
27455
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
577 |
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
578 1. Explicitly select them using ``--rev``. |
10646 | 579 |
27455
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
580 2. Use ``--source`` to select a root changeset and include all of its |
27959
4322849a5357
doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27956
diff
changeset
|
581 descendants. |
27455
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
582 |
a9a047878e14
rebase: simplify documentation about selecting commits to rebase
timeless <timeless@mozdev.org>
parents:
27454
diff
changeset
|
583 3. Use ``--base`` to select a changeset; rebase will find ancestors |
27959
4322849a5357
doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27956
diff
changeset
|
584 and their descendants which are not also ancestors of the destination. |
18518
0324a1d88a53
rebase: mention --rev in the help
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18516
diff
changeset
|
585 |
27932
6bc2299cc12f
rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents:
27866
diff
changeset
|
586 4. If you do not specify any of ``--rev``, ``source``, or ``--base``, |
27959
4322849a5357
doc: use correct indentation for enumeration
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
27956
diff
changeset
|
587 rebase will use ``--base .`` as above. |
27932
6bc2299cc12f
rebase: restore help for rebase w/o args (issue5059)
timeless <timeless@mozdev.org>
parents:
27866
diff
changeset
|
588 |
27456
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
589 Rebase will destroy original changesets unless you use ``--keep``. |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
590 It will also move your bookmarks (even if you do). |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
591 |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
592 Some changesets may be dropped if they do not contribute changes |
2337958596e3
rebase: simplify documentation about --keep
timeless <timeless@mozdev.org>
parents:
27455
diff
changeset
|
593 (e.g. merges from the destination branch). |
10646 | 594 |
27457
97cc045f1cfe
rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents:
27456
diff
changeset
|
595 Unlike ``merge``, rebase will do nothing if you are at the branch tip of |
97cc045f1cfe
rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents:
27456
diff
changeset
|
596 a named branch with two heads. You will need to explicitly specify source |
97cc045f1cfe
rebase: simplify documentation about heads
timeless <timeless@mozdev.org>
parents:
27456
diff
changeset
|
597 and/or destination. |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
598 |
28001
ade12bf2bf0e
rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
599 If you need to use a tool to automate merge/conflict decisions, you |
ade12bf2bf0e
rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
600 can specify one with ``--tool``, see :hg:`help merge-tools`. |
28002
e862b1fd33a8
rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents:
28001
diff
changeset
|
601 As a caveat: the tool will not be used to mediate when a file was |
e862b1fd33a8
rebase: document that tool does not apply to deleted files
timeless <timeless@mozdev.org>
parents:
28001
diff
changeset
|
602 deleted, there is no hook presently available for this. |
28001
ade12bf2bf0e
rebase: mention help merge-tools in help
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
603 |
27458
d39e743e3578
rebase: mention conflict in documentation instead of merge
timeless <timeless@mozdev.org>
parents:
27457
diff
changeset
|
604 If a rebase is interrupted to manually resolve a conflict, it can be |
8076
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8031
diff
changeset
|
605 continued with --continue/-c or aborted with --abort/-a. |
11205 | 606 |
22790 | 607 .. container:: verbose |
608 | |
609 Examples: | |
610 | |
611 - move "local changes" (current commit back to branching point) | |
612 to the current branch tip after a pull:: | |
613 | |
614 hg rebase | |
615 | |
616 - move a single changeset to the stable branch:: | |
617 | |
618 hg rebase -r 5f493448 -d stable | |
619 | |
620 - splice a commit and all its descendants onto another part of history:: | |
621 | |
622 hg rebase --source c0c3 --dest 4cf9 | |
623 | |
624 - rebase everything on a branch marked by a bookmark onto the | |
625 default branch:: | |
626 | |
627 hg rebase --base myfeature --dest default | |
628 | |
629 - collapse a sequence of changes into a single commit:: | |
630 | |
631 hg rebase --collapse -r 1520:1525 -d . | |
632 | |
633 - move a named branch while preserving its name:: | |
634 | |
635 hg rebase -r "branch(featureX)" -d 1.3 --keepbranches | |
636 | |
31558
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
637 Configuration Options: |
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
638 |
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
639 You can make rebase require a destination if you set the following config |
32084
091d6b9157da
help: apply bulk fixes for indentation and literal blocking issues
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
32083
diff
changeset
|
640 option:: |
31558
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
641 |
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
642 [commands] |
32083
1c911adebf48
rebase: fix incorrect configuration example
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
31733
diff
changeset
|
643 rebase.requiredest = True |
31558
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
644 |
33569
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
645 By default, rebase will close the transaction after each commit. For |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
646 performance purposes, you can configure rebase to use a single transaction |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
647 across the entire rebase. WARNING: This setting introduces a significant |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
648 risk of losing the work you've done in a rebase if the rebase aborts |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
649 unexpectedly:: |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
650 |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
651 [rebase] |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
652 singletransaction = True |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
653 |
31558
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
654 Return Values: |
13dc00c233b7
rebase: add flag to require destination
Ryan McElroy <rmcelroy@fb.com>
parents:
31514
diff
changeset
|
655 |
19971
2a9bb64faa0b
rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19969
diff
changeset
|
656 Returns 0 on success, 1 if nothing to rebase or there are |
2a9bb64faa0b
rebase: add description about exit code when there are unresolved conflicts
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19969
diff
changeset
|
657 unresolved conflicts. |
22790 | 658 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
659 """ |
29399
adb0d58b8b0b
rebase: pass repo, ui and opts objects to the RR class constructor
Kostia Balytskyi <ikostia@fb.com>
parents:
29372
diff
changeset
|
660 rbsrt = rebaseruntime(repo, ui, opts) |
15219 | 661 |
32917
070920db8b87
rebase: use context manager for locking in rebase()
Martin von Zweigbergk <martinvonz@google.com>
parents:
32900
diff
changeset
|
662 with repo.wlock(), repo.lock(): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
663 # Validate input and define rebasing points |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
664 destf = opts.get('dest', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
665 srcf = opts.get('source', None) |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
666 basef = opts.get('base', None) |
15270
6cb6064f1d50
rebase: add --rev option to rebase
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15269
diff
changeset
|
667 revf = opts.get('rev', []) |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
668 # search default destination in this space |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
669 # used in the 'hg pull --rebase' case, see issue 5214. |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
670 destspace = opts.get('_destspace') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
671 contf = opts.get('continue') |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
672 abortf = opts.get('abort') |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
673 if opts.get('interactive'): |
26496
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
674 try: |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
675 if extensions.find('histedit'): |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
676 enablehistedit = '' |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
677 except KeyError: |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
678 enablehistedit = " --config extensions.histedit=" |
b885ab9ca182
rebase: enable histedit for useful help with it
timeless@mozdev.org
parents:
26495
diff
changeset
|
679 help = "hg%s help -e histedit" % enablehistedit |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
680 msg = _("interactive history editing is supported by the " |
26494
832f40d2af53
rebase: factor out histedit help command
timeless@mozdev.org
parents:
26421
diff
changeset
|
681 "'histedit' extension (see \"%s\")") % help |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
682 raise error.Abort(msg) |
22382
d5b04ee8ecf7
rebase: add a deprecated -i/--interactive flag
David Soria Parra <davidsp@fb.com>
parents:
22251
diff
changeset
|
683 |
29400
c79da70a4659
rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29399
diff
changeset
|
684 if rbsrt.collapsemsg and not rbsrt.collapsef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
685 raise error.Abort( |
13661
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
686 _('message can only be specified with collapse')) |
ee349e228835
rebase: add -m/--message to rebase --collapse (issue2389)
Radomir Dopieralski <sheep@stxnext.pl>
parents:
13609
diff
changeset
|
687 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
688 if contf or abortf: |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
689 if contf and abortf: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
690 raise error.Abort(_('cannot use both abort and continue')) |
29400
c79da70a4659
rebase: move collapse-related local variables to the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29399
diff
changeset
|
691 if rbsrt.collapsef: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
692 raise error.Abort( |
11285
f118029e534c
rebase: use usual util.abort rather than error.ParseError
Matt Mackall <mpm@selenic.com>
parents:
11205
diff
changeset
|
693 _('cannot use collapse with continue or abort')) |
8117
2b30d8488819
remove unnecessary outer parenthesis in if-statements
Martin Geisler <mg@lazybytes.net>
parents:
8112
diff
changeset
|
694 if srcf or basef or destf: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
695 raise error.Abort( |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
696 _('abort and continue do not allow specifying revisions')) |
26165
927c0d84e09f
rebase: fix warning about ignoring tool option on rebase continue (issue4698)
liscju <piotr.listkiewicz@gmail.com>
parents:
26029
diff
changeset
|
697 if abortf and opts.get('tool', False): |
13856
0995eee8ffe4
rebase: add --tool argument for specifying merge tool
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13778
diff
changeset
|
698 ui.warn(_('tool option will be ignored\n')) |
30273
86f4ef63d507
rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents:
30271
diff
changeset
|
699 if contf: |
86f4ef63d507
rebase: check for conflicts before continuing
timeless <timeless@mozdev.org>
parents:
30271
diff
changeset
|
700 ms = mergemod.mergestate.read(repo) |
30495
d528ddc11b33
rebase: refer to checkunresolved by its new name
Augie Fackler <augie@google.com>
parents:
30490
diff
changeset
|
701 mergeutil.checkunresolved(ms) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
702 |
29472
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
703 retcode = rbsrt._prepareabortorcontinue(abortf) |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
704 if retcode is not None: |
f585ce6878e3
rebase: move abort/continue prep to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29404
diff
changeset
|
705 return retcode |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
706 else: |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
707 dest, rebaseset = _definesets(ui, repo, destf, srcf, basef, revf, |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
708 destspace=destspace) |
29473
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
709 retcode = rbsrt._preparenewrebase(dest, rebaseset) |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
710 if retcode is not None: |
e25da98052a4
rebase: move new rebase preparation to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29472
diff
changeset
|
711 return retcode |
21027
25ee5dbebc6b
rebase: tell when reopening a closed branch head
Mads Kiilerich <madski@unity3d.com>
parents:
20790
diff
changeset
|
712 |
33569
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
713 tr = None |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
714 if ui.configbool('rebase', 'singletransaction'): |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
715 tr = repo.transaction('rebase') |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
716 with util.acceptintervention(tr): |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
717 rbsrt._performrebase(tr) |
d341677d667d
rebase: add config to move rebase into a single transaction
Durham Goode <durham@fb.com>
parents:
33333
diff
changeset
|
718 |
29478
007da66960a8
rebase: move rebase finish logic to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29477
diff
changeset
|
719 rbsrt._finishrebase() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
720 |
31395
361bccce566a
rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31380
diff
changeset
|
721 def _definesets(ui, repo, destf=None, srcf=None, basef=None, revf=None, |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
722 destspace=None): |
28136
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
723 """use revisions argument to define destination and rebase set |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
724 """ |
31431
406705701c2d
rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31395
diff
changeset
|
725 if revf is None: |
406705701c2d
rebase: explicitly tests for None
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
31395
diff
changeset
|
726 revf = [] |
31395
361bccce566a
rebase: don't use mutable default argument value
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31380
diff
changeset
|
727 |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
728 # destspace is here to work around issues with `hg pull --rebase` see |
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
729 # issue5214 for details |
28136
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
730 if srcf and basef: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
731 raise error.Abort(_('cannot specify both a source and a base')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
732 if revf and basef: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
733 raise error.Abort(_('cannot specify both a revision and a base')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
734 if revf and srcf: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
735 raise error.Abort(_('cannot specify both a revision and a source')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
736 |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
737 cmdutil.checkunfinished(repo) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
738 cmdutil.bailifchanged(repo) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
739 |
31731
b5afec71c1f9
rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents:
31621
diff
changeset
|
740 if ui.configbool('commands', 'rebase.requiredest') and not destf: |
b5afec71c1f9
rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents:
31621
diff
changeset
|
741 raise error.Abort(_('you must specify a destination'), |
b5afec71c1f9
rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents:
31621
diff
changeset
|
742 hint=_('use: hg rebase -d REV')) |
b5afec71c1f9
rebase: allow destination-free continue and abort (issue5513)
Ryan McElroy <rmcelroy@fb.com>
parents:
31621
diff
changeset
|
743 |
28136
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
744 if destf: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
745 dest = scmutil.revsingle(repo, destf) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
746 |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
747 if revf: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
748 rebaseset = scmutil.revrange(repo, revf) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
749 if not rebaseset: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
750 ui.status(_('empty "rev" revision set - nothing to rebase\n')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
751 return None, None |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
752 elif srcf: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
753 src = scmutil.revrange(repo, [srcf]) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
754 if not src: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
755 ui.status(_('empty "source" revision set - nothing to rebase\n')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
756 return None, None |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
757 rebaseset = repo.revs('(%ld)::', src) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
758 assert rebaseset |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
759 else: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
760 base = scmutil.revrange(repo, [basef or '.']) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
761 if not base: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
762 ui.status(_('empty "base" revision set - ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
763 "can't compute rebase set\n")) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
764 return None, None |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
765 if not destf: |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
766 dest = repo[_destrebase(repo, base, destspace=destspace)] |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
767 destf = str(dest) |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
768 |
30580
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
769 roots = [] # selected children of branching points |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
770 bpbase = {} # {branchingpoint: [origbase]} |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
771 for b in base: # group bases by branching points |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
772 bp = repo.revs('ancestor(%d, %d)', b, dest).first() |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
773 bpbase[bp] = bpbase.get(bp, []) + [b] |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
774 if None in bpbase: |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
775 # emulate the old behavior, showing "nothing to rebase" (a better |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
776 # behavior may be abort with "cannot find branching point" error) |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
777 bpbase.clear() |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
778 for bp, bs in bpbase.iteritems(): # calculate roots |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
779 roots += list(repo.revs('children(%d) & ancestors(%ld)', bp, bs)) |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
780 |
51e7c83e05ee
rebase: calculate ancestors for --base separately (issue5420)
Jun Wu <quark@fb.com>
parents:
30495
diff
changeset
|
781 rebaseset = repo.revs('%ld::', roots) |
28136
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
782 |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
783 if not rebaseset: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
784 # transform to list because smartsets are not comparable to |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
785 # lists. This should be improved to honor laziness of |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
786 # smartset. |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
787 if list(base) == [dest.rev()]: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
788 if basef: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
789 ui.status(_('nothing to rebase - %s is both "base"' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
790 ' and destination\n') % dest) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
791 else: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
792 ui.status(_('nothing to rebase - working directory ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
793 'parent is also destination\n')) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
794 elif not repo.revs('%ld - ::%d', base, dest): |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
795 if basef: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
796 ui.status(_('nothing to rebase - "base" %s is ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
797 'already an ancestor of destination ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
798 '%s\n') % |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
799 ('+'.join(str(repo[r]) for r in base), |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
800 dest)) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
801 else: |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
802 ui.status(_('nothing to rebase - working ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
803 'directory parent is already an ' |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
804 'ancestor of destination %s\n') % dest) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
805 else: # can it happen? |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
806 ui.status(_('nothing to rebase from %s to %s\n') % |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
807 ('+'.join(str(repo[r]) for r in base), dest)) |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
808 return None, None |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
809 |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
810 if not destf: |
29043
cf7de4aeb86b
destutil: add the ability to specify a search space for rebase destination
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
28686
diff
changeset
|
811 dest = repo[_destrebase(repo, rebaseset, destspace=destspace)] |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
812 destf = str(dest) |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
813 |
28136
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
814 return dest, rebaseset |
5853878bbc2a
rebase: extract rebaseset and destination computation in a function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28122
diff
changeset
|
815 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
816 def externalparent(repo, state, destancestors): |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
817 """Return the revision that should be used as the second parent |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
818 when the revisions in state is collapsed on top of destancestors. |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
819 Abort if there is more than one parent. |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
820 """ |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
821 parents = set() |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
822 source = min(state) |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
823 for rev in state: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
824 if rev == source: |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
825 continue |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
826 for p in repo[rev].parents(): |
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
827 if (p.rev() not in state |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
828 and p.rev() not in destancestors): |
19955
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
829 parents.add(p.rev()) |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
830 if not parents: |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
831 return nullrev |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
832 if len(parents) == 1: |
2160c2e0d7d1
rebase: refactor and rename checkexternal - it is a getter more than a setter
Mads Kiilerich <madski@unity3d.com>
parents:
19951
diff
changeset
|
833 return parents.pop() |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
834 raise error.Abort(_('unable to collapse on top of %s, there is more ' |
19956
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
835 'than one external parent: %s') % |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
836 (max(destancestors), |
19956
78ab0f85e249
rebase: improve error message for more than one external parent
Mads Kiilerich <madski@unity3d.com>
parents:
19955
diff
changeset
|
837 ', '.join(str(p) for p in sorted(parents)))) |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
838 |
26360
b2415e94b2f5
rebase: avoid losing branch commits with --keepbranch (issue4835)
timeless@mozdev.org
parents:
26349
diff
changeset
|
839 def concludenode(repo, rev, p1, p2, commitmsg=None, editor=None, extrafn=None, |
26868
a2aa39a725a1
rebase: add date parameter to concludenode function
Stanislau Hlebik <stash@fb.com>
parents:
26811
diff
changeset
|
840 keepbranches=False, date=None): |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
841 '''Commit the wd changes with parents p1 and p2. Reuse commit info from rev |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
842 but also store useful information in extra. |
23459
2e047b1558a5
rebase: clarify naming of variables holding node hashes - don't call them rev
Mads Kiilerich <madski@unity3d.com>
parents:
23457
diff
changeset
|
843 Return node of committed revision.''' |
33120
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
844 dsguard = dirstateguard.dirstateguard(repo, 'rebase') |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
845 try: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
846 repo.setparents(repo[p1].node(), repo[p2].node()) |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
847 ctx = repo[rev] |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
848 if commitmsg is None: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
849 commitmsg = ctx.description() |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
850 keepbranch = keepbranches and repo[p1].branch() != ctx.branch() |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
851 extra = {'rebase_source': ctx.hex()} |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
852 if extrafn: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
853 extrafn(ctx, extra) |
22038
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
854 |
33139 | 855 destphase = max(ctx.phase(), phases.draft) |
856 overrides = {('phases', 'new-commit'): destphase} | |
33120
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
857 with repo.ui.configoverride(overrides, 'rebase'): |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
858 if keepbranch: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
859 repo.ui.setconfig('ui', 'allowemptycommit', True) |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
860 # Commit might fail if unresolved files exist |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
861 if date is None: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
862 date = ctx.date() |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
863 newnode = repo.commit(text=commitmsg, user=ctx.user(), |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
864 date=date, extra=extra, editor=editor) |
22038
021becbf024a
rebase: do not retract phase boundary by hand
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22004
diff
changeset
|
865 |
33120
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
866 repo.dirstate.setbranch(repo[newnode].branch()) |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
867 dsguard.close() |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
868 return newnode |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
869 finally: |
b63351f6a246
rebase: backed out changeset 2519994d25ca
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32084
diff
changeset
|
870 release(dsguard) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
871 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
872 def rebasenode(repo, rev, p1, base, state, collapse, dest): |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
873 'Rebase a single revision rev on top of p1 using base as merge ancestor' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
874 # Merge phase |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
875 # Update to destination and merge it with local |
23461
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
876 if repo['.'].rev() != p1: |
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
877 repo.ui.debug(" update to %d:%s\n" % (p1, repo[p1])) |
30271
0fa1a41d04e4
rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents:
30007
diff
changeset
|
878 mergemod.update(repo, p1, False, True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
879 else: |
32249
27e67cfea27f
rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents:
32248
diff
changeset
|
880 repo.ui.debug(" already in destination\n") |
26748
5ba0a99ff27f
dirstate: make dirstate.write() callers pass transaction object to it
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
26745
diff
changeset
|
881 repo.dirstate.write(repo.currenttransaction()) |
23461
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
882 repo.ui.debug(" merge against %d:%s\n" % (rev, repo[rev])) |
19969
ad9db007656f
rebase: fix selection of base used when rebasing merge (issue4041)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
19956
diff
changeset
|
883 if base is not None: |
23461
ffef6d503ab2
rebase: avoid redundant repo[rev].rev() - just keep working in rev space
Mads Kiilerich <madski@unity3d.com>
parents:
23460
diff
changeset
|
884 repo.ui.debug(" detach base %d:%s\n" % (base, repo[base])) |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
885 # When collapsing in-place, the parent is the common ancestor, we |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16566
diff
changeset
|
886 # have to allow merging with it. |
30271
0fa1a41d04e4
rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents:
30007
diff
changeset
|
887 stats = mergemod.update(repo, rev, True, True, base, collapse, |
0fa1a41d04e4
rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents:
30007
diff
changeset
|
888 labels=['dest', 'source']) |
22905
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
889 if collapse: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
890 copies.duplicatecopies(repo, rev, dest) |
22905
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
891 else: |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
892 # If we're not using --collapse, we need to |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
893 # duplicate copies between the revision we're |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
894 # rebasing and its first parent, but *not* |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
895 # duplicate any copies that have already been |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
896 # performed in the destination. |
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
897 p1rev = repo[rev].p1().rev() |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
898 copies.duplicatecopies(repo, rev, p1rev, skiprev=dest) |
22905
63e889cc610d
rebase: move duplicatecopies next to merge
Matt Mackall <mpm@selenic.com>
parents:
22901
diff
changeset
|
899 return stats |
6923
ebf1462f2145
strip trailing whitespace, replace tabs by spaces
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6906
diff
changeset
|
900 |
33590
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
901 def adjustdest(repo, rev, dest, state): |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
902 """adjust rebase destination given the current rebase state |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
903 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
904 rev is what is being rebased. Return a list of two revs, which are the |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
905 adjusted destinations for rev's p1 and p2, respectively. If a parent is |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
906 nullrev, return dest without adjustment for it. |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
907 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
908 For example, when doing rebase -r B+E -d F, rebase will first move B to B1, |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
909 and E's destination will be adjusted from F to B1. |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
910 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
911 B1 <- written during rebasing B |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
912 | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
913 F <- original destination of B, E |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
914 | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
915 | E <- rev, which is being rebased |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
916 | | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
917 | D <- prev, one parent of rev being checked |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
918 | | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
919 | x <- skipped, ex. no successor or successor in (::dest) |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
920 | | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
921 | C |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
922 | | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
923 | B <- rebased as B1 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
924 |/ |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
925 A |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
926 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
927 Another example about merge changeset, rebase -r C+G+H -d K, rebase will |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
928 first move C to C1, G to G1, and when it's checking H, the adjusted |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
929 destinations will be [C1, G1]. |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
930 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
931 H C1 G1 |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
932 /| | / |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
933 F G |/ |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
934 K | | -> K |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
935 | C D | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
936 | |/ | |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
937 | B | ... |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
938 |/ |/ |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
939 A A |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
940 """ |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
941 result = [] |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
942 for prev in repo.changelog.parentrevs(rev): |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
943 adjusted = dest |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
944 if prev != nullrev: |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
945 # pick already rebased revs from state |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
946 source = [s for s, d in state.items() if d > 0] |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
947 candidate = repo.revs('max(%ld and (::%d))', source, prev).first() |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
948 if candidate is not None: |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
949 adjusted = state[candidate] |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
950 result.append(adjusted) |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
951 return result |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
952 |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
953 def nearestrebased(repo, rev, state): |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
954 """return the nearest ancestors of rev in the rebase result""" |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
955 rebased = [r for r in state if state[r] > nullmerge] |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
956 candidates = repo.revs('max(%ld and (::%d))', rebased, rev) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
957 if candidates: |
22820
103dcfbb385f
rebase: use `last` instead of direct indexing
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22790
diff
changeset
|
958 return state[candidates.first()] |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
959 else: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
960 return None |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
961 |
30674
eb69f78c48ab
rebase: un-wrap function signature since it fits in 80 columns
Augie Fackler <raf@durin42.com>
parents:
30580
diff
changeset
|
962 def _checkobsrebase(repo, ui, rebaseobsrevs, rebasesetrevs, rebaseobsskipped): |
28685
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
963 """ |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
964 Abort if rebase will create divergence or rebase is noop because of markers |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
965 |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
966 `rebaseobsrevs`: set of obsolete revision in source |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
967 `rebasesetrevs`: set of revisions to be rebased from source |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
968 `rebaseobsskipped`: set of revisions from source skipped because they have |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
969 successors in destination |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
970 """ |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
971 # Obsolete node with successors not in dest leads to divergence |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
972 divergenceok = ui.configbool('experimental', |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
973 'allowdivergence') |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
974 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
975 |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
976 if divergencebasecandidates and not divergenceok: |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
977 divhashes = (str(repo[r]) |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
978 for r in divergencebasecandidates) |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
979 msg = _("this rebase will cause " |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
980 "divergences from: %s") |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
981 h = _("to force the rebase please set " |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
982 "experimental.allowdivergence=True") |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
983 raise error.Abort(msg % (",".join(divhashes),), hint=h) |
6c4d23fe611c
rebase: refactor of error handling code path for rebaseskipobsolete
Laurent Charignon <lcharignon@fb.com>
parents:
28429
diff
changeset
|
984 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
985 def defineparents(repo, rev, dest, state, destancestors, |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
986 obsoletenotrebased): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
987 'Return the new parent relationship of the revision that will be rebased' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
988 parents = repo[rev].parents() |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
989 p1 = p2 = nullrev |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
990 rp1 = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
991 |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
992 p1n = parents[0].rev() |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
993 if p1n in destancestors: |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
994 p1 = dest |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
995 elif p1n in state: |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
996 if state[p1n] == nullmerge: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
997 p1 = dest |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
998 elif state[p1n] in revskipped: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
999 p1 = nearestrebased(repo, p1n, state) |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1000 if p1 is None: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1001 p1 = dest |
10352
66d954e76ffb
rebase: add --detach option to detach intermediate revisions (issue1950)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10351
diff
changeset
|
1002 else: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1003 p1 = state[p1n] |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1004 else: # p1n external |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1005 p1 = dest |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1006 p2 = p1n |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1007 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1008 if len(parents) == 2 and parents[1].rev() not in destancestors: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1009 p2n = parents[1].rev() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1010 # interesting second parent |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1011 if p2n in state: |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1012 if p1 == dest: # p1n in destancestors or external |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1013 p1 = state[p2n] |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1014 if p1 == revprecursor: |
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1015 rp1 = obsoletenotrebased[p2n] |
27014
4223fc58f952
rebase: refactoring to avoid repetition of expression
Laurent Charignon <lcharignon@fb.com>
parents:
27013
diff
changeset
|
1016 elif state[p2n] in revskipped: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1017 p2 = nearestrebased(repo, p2n, state) |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1018 if p2 is None: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1019 # no ancestors rebased yet, detach |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1020 p2 = dest |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1021 else: |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1022 p2 = state[p2n] |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1023 else: # p2n external |
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1024 if p2 != nullrev: # p1n external too => rev is a merged revision |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1025 raise error.Abort(_('cannot use revision %d as base, result ' |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1026 'would have 3 parents') % rev) |
22906
75d0edb68b41
rebase: fix some weird mixed-case naming
Matt Mackall <mpm@selenic.com>
parents:
22905
diff
changeset
|
1027 p2 = p2n |
10351
38fe86fb16e3
rebase: refactoring
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
10263
diff
changeset
|
1028 repo.ui.debug(" future parents are %d and %d\n" % |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1029 (repo[rp1 or p1].rev(), repo[p2].rev())) |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1030 |
27963
07a5de79ec30
rebase: better way to detect non-detaching revisions (issue5044)
Martijn Pieters <mj@zopatista.com>
parents:
27959
diff
changeset
|
1031 if not any(p.rev() in state for p in parents): |
07a5de79ec30
rebase: better way to detect non-detaching revisions (issue5044)
Martijn Pieters <mj@zopatista.com>
parents:
27959
diff
changeset
|
1032 # Case (1) root changeset of a non-detaching rebase set. |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1033 # Let the merge mechanism find the base itself. |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1034 base = None |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1035 elif not repo[rev].p2(): |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1036 # Case (2) detaching the node with a single parent, use this parent |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1037 base = repo[rev].p1().rev() |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1038 else: |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1039 # Assuming there is a p1, this is the case where there also is a p2. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1040 # We are thus rebasing a merge and need to pick the right merge base. |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1041 # |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1042 # Imagine we have: |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1043 # - M: current rebase revision in this step |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1044 # - A: one parent of M |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1045 # - B: other parent of M |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1046 # - D: destination of this merge step (p1 var) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1047 # |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1048 # Consider the case where D is a descendant of A or B and the other is |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1049 # 'outside'. In this case, the right merge base is the D ancestor. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1050 # |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1051 # An informal proof, assuming A is 'outside' and B is the D ancestor: |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1052 # |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1053 # If we pick B as the base, the merge involves: |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1054 # - changes from B to M (actual changeset payload) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1055 # - changes from B to D (induced by rebase) as D is a rebased |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1056 # version of B) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1057 # Which exactly represent the rebase operation. |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1058 # |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1059 # If we pick A as the base, the merge involves: |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1060 # - changes from A to M (actual changeset payload) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1061 # - changes from A to D (with include changes between unrelated A and B |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1062 # plus changes induced by rebase) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1063 # Which does not represent anything sensible and creates a lot of |
23732
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1064 # conflicts. A is thus not the right choice - B is. |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1065 # |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1066 # Note: The base found in this 'proof' is only correct in the specified |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1067 # case. This base does not make sense if is not D a descendant of A or B |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1068 # or if the other is not parent 'outside' (especially not if the other |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1069 # parent has been rebased). The current implementation does not |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1070 # make it feasible to consider different cases separately. In these |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1071 # other cases we currently just leave it to the user to correctly |
c51d6c043bb1
rebase: clarify comment about merge ancestor when rebasing merges
Mads Kiilerich <madski@unity3d.com>
parents:
23520
diff
changeset
|
1072 # resolve an impossible merge using a wrong ancestor. |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1073 # |
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1074 # xx, p1 could be -4, and both parents could probably be -4... |
23484
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1075 for p in repo[rev].parents(): |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1076 if state.get(p.rev()) == p1: |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1077 base = p.rev() |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1078 break |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1079 else: # fallback when base not found |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1080 base = None |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1081 |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1082 # Raise because this function is called wrong (see issue 4106) |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1083 raise AssertionError('no base found to rebase on ' |
cf3495dfd7ed
rebase: move base calculation from rebasenode() to defineparents()
Mads Kiilerich <madski@unity3d.com>
parents:
23461
diff
changeset
|
1084 '(defineparents called wrong)') |
29063
8ede973597fd
rebase: handle successor targets (issue5198)
timeless <timeless@mozdev.org>
parents:
29044
diff
changeset
|
1085 return rp1 or p1, p2, base |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1086 |
7955
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1087 def isagitpatch(repo, patchname): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1088 'Return true if the given patch is in git format' |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1089 mqpatch = os.path.join(repo.mq.path, patchname) |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1090 for line in patch.linereader(file(mqpatch, 'rb')): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1091 if line.startswith('diff --git'): |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1092 return True |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1093 return False |
c3d4ff03ec72
rebase: keep original mq patch format (Issue1574)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
7954
diff
changeset
|
1094 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1095 def updatemq(repo, state, skipped, **opts): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1096 'Update rebased mq patches - finalize and then import them' |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1097 mqrebase = {} |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1098 mq = repo.mq |
14572
8ff2957c1d82
mq: rename full_series to fullseries
Adrian Buehlmann <adrian@cadifra.com>
parents:
14509
diff
changeset
|
1099 original_series = mq.fullseries[:] |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1100 skippedpatches = set() |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
1101 |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1102 for p in mq.applied: |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1103 rev = repo[p.node].rev() |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1104 if rev in state: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9301
diff
changeset
|
1105 repo.ui.debug('revision %d is an mq patch (%s), finalize it.\n' % |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1106 (rev, p.name)) |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1107 mqrebase[rev] = (p.name, isagitpatch(repo, p.name)) |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1108 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1109 # Applied but not rebased, not sure this should happen |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1110 skippedpatches.add(p.name) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1111 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1112 if mqrebase: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1113 mq.finish(repo, mqrebase.keys()) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1114 |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1115 # We must start import from the newest revision |
8210
344751cd8cb8
replace various uses of list.reverse()
Matt Mackall <mpm@selenic.com>
parents:
8209
diff
changeset
|
1116 for rev in sorted(mqrebase, reverse=True): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1117 if rev not in skipped: |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1118 name, isgit = mqrebase[rev] |
23520
de143427c499
rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents:
23519
diff
changeset
|
1119 repo.ui.note(_('updating mq patch %s to %s:%s\n') % |
de143427c499
rebase: show a note for updated mq patches
Mads Kiilerich <mads@kiilerich.com>
parents:
23519
diff
changeset
|
1120 (name, state[rev], repo[state[rev]])) |
11537
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1121 mq.qimport(repo, (), patchname=name, git=isgit, |
0a044e5ff489
rebase: small cosmetic cleanups
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
11531
diff
changeset
|
1122 rev=[str(state[rev])]) |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1123 else: |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1124 # Rebased and skipped |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1125 skippedpatches.add(mqrebase[rev][0]) |
14497
ea585f2b1adc
rebase: restore mq guards after rebasing (issue2107)
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
13894
diff
changeset
|
1126 |
16531
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1127 # Patches were either applied and rebased and imported in |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1128 # order, applied and removed or unapplied. Discard the removed |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1129 # ones while preserving the original series order and guards. |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1130 newseries = [s for s in original_series |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1131 if mq.guard_re.split(s, 1)[0] not in skippedpatches] |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1132 mq.fullseries[:] = newseries |
b9f51f49bf2a
rebase: preserve mq series order, guarded patches (issue2849)
Patrick Mezard <patrick@mezard.eu>
parents:
16280
diff
changeset
|
1133 mq.seriesdirty = True |
14580
92101ea35015
mq: rename save_dirty to savedirty
Adrian Buehlmann <adrian@cadifra.com>
parents:
14572
diff
changeset
|
1134 mq.savedirty() |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1135 |
28185
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1136 def storecollapsemsg(repo, collapsemsg): |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1137 'Store the collapse message to allow recovery' |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1138 collapsemsg = collapsemsg or '' |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1139 f = repo.vfs("last-message.txt", "w") |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1140 f.write("%s\n" % collapsemsg) |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1141 f.close() |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1142 |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1143 def clearcollapsemsg(repo): |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1144 'Remove collapse message file' |
31311
f59b6cf663a9
vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents:
31302
diff
changeset
|
1145 repo.vfs.unlinkpath("last-message.txt", ignoremissing=True) |
28185
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1146 |
31225
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1147 def restorecollapsemsg(repo, isabort): |
28185
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1148 'Restore previously stored collapse message' |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1149 try: |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1150 f = repo.vfs("last-message.txt") |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1151 collapsemsg = f.readline().strip() |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1152 f.close() |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1153 except IOError as err: |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1154 if err.errno != errno.ENOENT: |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1155 raise |
31225
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1156 if isabort: |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1157 # Oh well, just abort like normal |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1158 collapsemsg = '' |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1159 else: |
749b057b01f3
rebase: allow aborting if last-message.txt is missing
Durham Goode <durham@fb.com>
parents:
31224
diff
changeset
|
1160 raise error.Abort(_('missing .hg/last-message.txt for rebase')) |
28185
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1161 return collapsemsg |
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1162 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1163 def clearstatus(repo): |
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1164 'Remove the status files' |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1165 _clearrebasesetvisibiliy(repo) |
33056
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32918
diff
changeset
|
1166 # Make sure the active transaction won't write the state file |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32918
diff
changeset
|
1167 tr = repo.currenttransaction() |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32918
diff
changeset
|
1168 if tr: |
2312e70cf78b
rebase: clean up rebasestate from active transaction
Jun Wu <quark@fb.com>
parents:
32918
diff
changeset
|
1169 tr.removefilegenerator('rebasestate') |
31311
f59b6cf663a9
vfs: use repo.vfs.unlinkpath
Mads Kiilerich <mads@kiilerich.com>
parents:
31302
diff
changeset
|
1170 repo.vfs.unlinkpath("rebasestate", ignoremissing=True) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1171 |
25070
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1172 def needupdate(repo, state): |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1173 '''check whether we should `update --clean` away from a merge, or if |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1174 somehow the working dir got forcibly updated, e.g. by older hg''' |
27167
3fe8cb40c9c5
commands: inline definition of localrepo.parents() and drop the method (API)
Augie Fackler <augie@google.com>
parents:
27146
diff
changeset
|
1175 parents = [p.rev() for p in repo[None].parents()] |
25070
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1176 |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1177 # Are we in a merge state at all? |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1178 if len(parents) < 2: |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1179 return False |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1180 |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1181 # We should be standing on the first as-of-yet unrebased commit. |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1182 firstunrebased = min([old for old, new in state.iteritems() |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1183 if new == nullrev]) |
bd98d073a34f
rebase: clear merge when aborting before any rebasing (issue4661)
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents:
24870
diff
changeset
|
1184 if firstunrebased in parents: |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
1185 return True |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
1186 |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
1187 return False |
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
1188 |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1189 def abort(repo, originalwd, dest, state, activebookmark=None): |
24758
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1190 '''Restore the repository to its original state. Additional args: |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1191 |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1192 activebookmark: the name of the bookmark that should be active after the |
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1193 restore''' |
26677
e9b3d523f2e6
rebase: properly abort when destination is public (issue4896)
Christian Delahousse <cdelahousse@fb.com>
parents:
26675
diff
changeset
|
1194 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1195 try: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1196 # If the first commits in the rebased set get skipped during the rebase, |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1197 # their values within the state mapping will be the dest rev id. The |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1198 # dstates list must must not contain the dest rev (issue4896) |
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1199 dstates = [s for s in state.values() if s >= 0 and s != dest] |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1200 immutable = [d for d in dstates if not repo[d].mutable()] |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1201 cleanup = True |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1202 if immutable: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1203 repo.ui.warn(_("warning: can't clean up public changesets %s\n") |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1204 % ', '.join(str(repo[r]) for r in immutable), |
29966
11604da46982
rebase: use single quotes in use warning
timeless <timeless@mozdev.org>
parents:
29936
diff
changeset
|
1205 hint=_("see 'hg help phases' for details")) |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1206 cleanup = False |
16280
0806823370d8
rebase: properly calculate descendant set when aborting (issue3332)
Matt Mackall <mpm@selenic.com>
parents:
16228
diff
changeset
|
1207 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1208 descendants = set() |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1209 if dstates: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1210 descendants = set(repo.changelog.descendants(dstates)) |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1211 if descendants - set(dstates): |
32249
27e67cfea27f
rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents:
32248
diff
changeset
|
1212 repo.ui.warn(_("warning: new changesets detected on destination " |
27e67cfea27f
rebase: rename "target" to "destination" in messages
Martin von Zweigbergk <martinvonz@google.com>
parents:
32248
diff
changeset
|
1213 "branch, can't strip\n")) |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1214 cleanup = False |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
1215 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1216 if cleanup: |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1217 shouldupdate = False |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1218 rebased = filter(lambda x: x >= 0 and x != dest, state.values()) |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1219 if rebased: |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1220 strippoints = [ |
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1221 c.node() for c in repo.set('roots(%ld)', rebased)] |
31222
56d3e0b499df
rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents:
31023
diff
changeset
|
1222 |
56d3e0b499df
rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents:
31023
diff
changeset
|
1223 updateifonnodes = set(rebased) |
32248
b47e6b0ba6ca
rebase: rename "target" to "dest" in variable names
Martin von Zweigbergk <martinvonz@google.com>
parents:
32175
diff
changeset
|
1224 updateifonnodes.add(dest) |
31222
56d3e0b499df
rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents:
31023
diff
changeset
|
1225 updateifonnodes.add(originalwd) |
56d3e0b499df
rebase: clear updatestate during rebase --abort in more cases
Durham Goode <durham@fb.com>
parents:
31023
diff
changeset
|
1226 shouldupdate = repo['.'].rev() in updateifonnodes |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1227 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1228 # Update away from the rebase if necessary |
27988
61f4d59e9a0b
rebase: update working directory when aborting (issue5084)
timeless <timeless@mozdev.org>
parents:
27977
diff
changeset
|
1229 if shouldupdate or needupdate(repo, state): |
30271
0fa1a41d04e4
rebase: rename merge to mergemod
timeless <timeless@mozdev.org>
parents:
30007
diff
changeset
|
1230 mergemod.update(repo, originalwd, False, True) |
19516
fe78eb7bcca0
rebase: don't clobber wd on --abort when we've updated away (issue4009)
Matt Mackall <mpm@selenic.com>
parents:
19496
diff
changeset
|
1231 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1232 # Strip from the first rebased revision |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1233 if rebased: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1234 # no backup of rebased cset versions needed |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1235 repair.strip(repo.ui, repo, strippoints) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
1236 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1237 if activebookmark and activebookmark in repo._bookmarks: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1238 bookmarks.activate(repo, activebookmark) |
24758
d7451adc72f6
rebase: restore bookmark state on abort
Tony Tung <tonytung@fb.com>
parents:
23970
diff
changeset
|
1239 |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1240 finally: |
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1241 clearstatus(repo) |
28185
c7e8948627f3
rebase: adds storing collapse message (issue4792)
liscju <piotr.listkiewicz@gmail.com>
parents:
28136
diff
changeset
|
1242 clearcollapsemsg(repo) |
26744
21e50e36de02
rebase: on abort delete rebase state file no matter what
Christian Delahousse <cdelahousse@fb.com>
parents:
26719
diff
changeset
|
1243 repo.ui.warn(_('rebase aborted\n')) |
19518
12843143663d
rebase: allow aborting when descendants detected
Matt Mackall <mpm@selenic.com>
parents:
19517
diff
changeset
|
1244 return 0 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1245 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1246 def buildstate(repo, dest, rebaseset, collapse, obsoletenotrebased): |
15267
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1247 '''Define which revisions are going to be rebased and where |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1248 |
15267
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1249 repo: repo |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1250 dest: context |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1251 rebaseset: set of rev |
17005
50f434510da6
rebase: do not add second parent to rebased changeset (drop detach option) (BC)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
16867
diff
changeset
|
1252 ''' |
31297
f5c71e98f0f7
rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31296
diff
changeset
|
1253 originalwd = repo['.'].rev() |
32291
bd872f64a8ba
cleanup: use set literals
Martin von Zweigbergk <martinvonz@google.com>
parents:
32272
diff
changeset
|
1254 _setrebasesetvisibility(repo, set(rebaseset) | {originalwd}) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1255 |
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
1256 # This check isn't strictly necessary, since mq detects commits over an |
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
1257 # applied patch. But it prevents messing up the working directory when |
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
1258 # a partially completed rebase is blocked by mq. |
15267
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1259 if 'qtip' in repo.tags() and (dest.node() in |
10678
da2a0c9c895d
mq: avoid many hex/bin conversions, keep the binary node when possible
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10677
diff
changeset
|
1260 [s.node for s in repo.mq.applied]): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1261 raise error.Abort(_('cannot rebase onto an applied mq patch')) |
10672
c2e1e637d4da
rebase: always check if rebasing onto an applied mq patch.
Greg Ward <greg-hg@gerg.ca>
parents:
10659
diff
changeset
|
1262 |
15267
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1263 roots = list(repo.set('roots(%ld)', rebaseset)) |
3bfdfefea2fc
rebase: use revset as soon as possible in internal logic
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
15219
diff
changeset
|
1264 if not roots: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1265 raise error.Abort(_('no matching revisions')) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1266 roots.sort() |
32175
456b4a32d75f
rebase: don't update state dict same way for each root
Martin von Zweigbergk <martinvonz@google.com>
parents:
32084
diff
changeset
|
1267 state = dict.fromkeys(rebaseset, revtodo) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1268 detachset = set() |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1269 emptyrebase = True |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1270 for root in roots: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1271 commonbase = root.ancestor(dest) |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1272 if commonbase == root: |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1273 raise error.Abort(_('source is ancestor of destination')) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1274 if commonbase == dest: |
31380
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1275 wctx = repo[None] |
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1276 if dest == wctx.p1(): |
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1277 # when rebasing to '.', it will use the current wd branch name |
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1278 samebranch = root.branch() == wctx.branch() |
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1279 else: |
65d93d712777
rebase: allow rebasing children of wd to wd if a new branch has been set (BC)
Mads Kiilerich <mads@kiilerich.com>
parents:
31311
diff
changeset
|
1280 samebranch = root.branch() == dest.branch() |
32900
07d5a503124c
rebase: rewrite "x in y.children()" as "y in x.parents()"
Martin von Zweigbergk <martinvonz@google.com>
parents:
32594
diff
changeset
|
1281 if not collapse and samebranch and dest in root.parents(): |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1282 # mark the revision as done by setting its new revision |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1283 # equal to its old (current) revisions |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1284 state[root.rev()] = root.rev() |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1285 repo.ui.debug('source is a child of destination\n') |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1286 continue |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1287 |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1288 emptyrebase = False |
29936
3e7ded768556
rebase: make debug logging more consistent
Martin von Zweigbergk <martinvonz@google.com>
parents:
29872
diff
changeset
|
1289 repo.ui.debug('rebase onto %s starting from %s\n' % (dest, root)) |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1290 # Rebase tries to turn <dest> into a parent of <root> while |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1291 # preserving the number of parents of rebased changesets: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1292 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1293 # - A changeset with a single parent will always be rebased as a |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1294 # changeset with a single parent. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1295 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1296 # - A merge will be rebased as merge unless its parents are both |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1297 # ancestors of <dest> or are themselves in the rebased set and |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1298 # pruned while rebased. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1299 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1300 # If one parent of <root> is an ancestor of <dest>, the rebased |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1301 # version of this parent will be <dest>. This is always true with |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1302 # --base option. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1303 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1304 # Otherwise, we need to *replace* the original parents with |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1305 # <dest>. This "detaches" the rebased set from its former location |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1306 # and rebases it onto <dest>. Changes introduced by ancestors of |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1307 # <root> not common with <dest> (the detachset, marked as |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1308 # nullmerge) are "removed" from the rebased changesets. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1309 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1310 # - If <root> has a single parent, set it to <dest>. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1311 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1312 # - If <root> is a merge, we cannot decide which parent to |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1313 # replace, the rebase operation is not clearly defined. |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1314 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1315 # The table below sums up this behavior: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1316 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1317 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1318 # | | one parent | merge | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1319 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1320 # | parent in | new parent is <dest> | parents in ::<dest> are | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1321 # | ::<dest> | | remapped to <dest> | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1322 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1323 # | unrelated source | new parent is <dest> | ambiguous, abort | |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1324 # +------------------+----------------------+-------------------------+ |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1325 # |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1326 # The actual abort is handled by `defineparents` |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1327 if len(root.parents()) <= 1: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1328 # ancestors of <root> not ancestors of <dest> |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1329 detachset.update(repo.changelog.findmissingrevs([commonbase.rev()], |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1330 [root.rev()])) |
32272
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1331 if emptyrebase: |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1332 return None |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1333 for rev in sorted(state): |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1334 parents = [p for p in repo.changelog.parentrevs(rev) if p != nullrev] |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1335 # if all parents of this revision are done, then so is this revision |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1336 if parents and all((state.get(p) == p for p in parents)): |
78496ac30025
rebase: allow rebase even if some revisions need no rebase (BC) (issue5422)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32249
diff
changeset
|
1337 state[rev] = rev |
18424
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1338 for r in detachset: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1339 if r not in state: |
100fdc84670f
rebase: support multiple roots for rebaseset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18386
diff
changeset
|
1340 state[r] = nullmerge |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1341 if len(roots) > 1: |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1342 # If we have multiple roots, we may have "hole" in the rebase set. |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1343 # Rebase roots that descend from those "hole" should not be detached as |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1344 # other root are. We use the special `revignored` to inform rebase that |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18549
diff
changeset
|
1345 # the revision should be ignored but that `defineparents` should search |
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18549
diff
changeset
|
1346 # a rebase destination that make sense regarding rebased topology. |
18447
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1347 rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset)) |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1348 for ignored in set(rebasedomain) - set(rebaseset): |
7159426c8d13
rebase: properly handle unrebased revision between rebased one
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18446
diff
changeset
|
1349 state[ignored] = revignored |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1350 for r in obsoletenotrebased: |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1351 if obsoletenotrebased[r] is None: |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1352 state[r] = revpruned |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1353 else: |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1354 state[r] = revprecursor |
31297
f5c71e98f0f7
rebase: unhide original working directory node as well (issue5219)
Martin von Zweigbergk <martinvonz@google.com>
parents:
31296
diff
changeset
|
1355 return originalwd, dest.rev(), state |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1356 |
33590
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1357 def clearrebased(ui, repo, dest, state, skipped, collapsedas=None): |
17613
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1358 """dispose of rebased revision at the end of the rebase |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1359 |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1360 If `collapsedas` is not None, the rebase was a collapse whose result if the |
aafc521668d8
rebase: properly handle --collapse when creating obsolescence marker
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17612
diff
changeset
|
1361 `collapsedas` node.""" |
33332
3b7cb3d17137
rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents:
33157
diff
changeset
|
1362 tonode = repo.changelog.node |
33590
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1363 # Move bookmark of skipped nodes to destination. This cannot be handled |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1364 # by scmutil.cleanupnodes since it will treat rev as removed (no successor) |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1365 # and move bookmark backwards. |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1366 bmchanges = [(name, tonode(max(adjustdest(repo, rev, dest, state)))) |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1367 for rev in skipped |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1368 for name in repo.nodebookmarks(tonode(rev))] |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1369 if bmchanges: |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1370 with repo.transaction('rebase') as tr: |
52f82e7d6a7e
rebase: move bookmark to destination for commits becoming empty (issue5627)
Jun Wu <quark@fb.com>
parents:
33569
diff
changeset
|
1371 repo._bookmarks.applychanges(repo, tr, bmchanges) |
33332
3b7cb3d17137
rebase: use scmutil.cleanupnodes (issue5606) (BC)
Jun Wu <quark@fb.com>
parents:
33157
diff
changeset
|
1372 mapping = {} |
33333 | 1373 for rev, newrev in sorted(state.items()): |
1374 if newrev >= 0 and newrev != rev: | |
1375 if rev in skipped: | |
1376 succs = () | |
1377 elif collapsedas is not None: | |
1378 succs = (collapsedas,) | |
1379 else: | |
1380 succs = (tonode(newrev),) | |
1381 mapping[tonode(rev)] = succs | |
1382 scmutil.cleanupnodes(repo, mapping, 'rebase') | |
17611
910123eac887
rebase: extract final changesets cleanup logic in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17325
diff
changeset
|
1383 |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
1384 def pullrebase(orig, ui, repo, *args, **opts): |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1385 'Call rebase after pull if the latter has been invoked with --rebase' |
26960
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1386 ret = None |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1387 if opts.get('rebase'): |
31733
ae6bab095c66
rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents:
31731
diff
changeset
|
1388 if ui.configbool('commands', 'rebase.requiredest'): |
ae6bab095c66
rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents:
31731
diff
changeset
|
1389 msg = _('rebase destination required by configuration') |
ae6bab095c66
rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents:
31731
diff
changeset
|
1390 hint = _('use hg pull followed by hg rebase -d DEST') |
ae6bab095c66
rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents:
31731
diff
changeset
|
1391 raise error.Abort(msg, hint=hint) |
ae6bab095c66
rebase: abort hg pull --rebase if rebase.requiredest is set (issue5514)
Ryan McElroy <rmcelroy@fb.com>
parents:
31731
diff
changeset
|
1392 |
32918
04c9dd951a41
rebase: use context manager for locking in pullrebase()
Martin von Zweigbergk <martinvonz@google.com>
parents:
32917
diff
changeset
|
1393 with repo.wlock(), repo.lock(): |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1394 if opts.get('update'): |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1395 del opts['update'] |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1396 ui.debug('--update and --rebase are not compatible, ignoring ' |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1397 'the update flag\n') |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1398 |
30725
c2bd2f77965b
rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents:
30709
diff
changeset
|
1399 cmdutil.checkunfinished(repo) |
30755
0fbb3a5c188e
rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents:
30725
diff
changeset
|
1400 cmdutil.bailifchanged(repo, hint=_('cannot pull with rebase: ' |
0fbb3a5c188e
rebase: provide detailed hint to abort message if working dir is not clean
Valters Vingolds <valters@vingolds.ch>
parents:
30725
diff
changeset
|
1401 'please commit or shelve your changes first')) |
30725
c2bd2f77965b
rebase: fail-fast the pull if working dir is not clean (BC)
Valters Vingolds <valters@vingolds.ch>
parents:
30709
diff
changeset
|
1402 |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1403 revsprepull = len(repo) |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1404 origpostincoming = commands.postincoming |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1405 def _dummy(*args, **kwargs): |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1406 pass |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1407 commands.postincoming = _dummy |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1408 try: |
26960
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1409 ret = orig(ui, repo, *args, **opts) |
26029
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1410 finally: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1411 commands.postincoming = origpostincoming |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1412 revspostpull = len(repo) |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1413 if revspostpull > revsprepull: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1414 # --rev option from pull conflict with rebase own --rev |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1415 # dropping it |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1416 if 'rev' in opts: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1417 del opts['rev'] |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1418 # positional argument from pull conflicts with rebase's own |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1419 # --source. |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1420 if 'source' in opts: |
563ea14c62d4
rebase: lock the repo during the full rebase operation
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
25660
diff
changeset
|
1421 del opts['source'] |
29044
261c25372959
rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29043
diff
changeset
|
1422 # revsprepull is the len of the repo, not revnum of tip. |
261c25372959
rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29043
diff
changeset
|
1423 destspace = list(repo.changelog.revs(start=revsprepull)) |
261c25372959
rebase: restrict rebase destination to the pulled set (issue5214)
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
29043
diff
changeset
|
1424 opts['_destspace'] = destspace |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1425 try: |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1426 rebase(ui, repo, **opts) |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1427 except error.NoMergeDestAbort: |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1428 # we can maybe update instead |
28118
0e3835c7e1cf
rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28117
diff
changeset
|
1429 rev, _a, _b = destutil.destupdate(repo) |
28189
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1430 if rev == repo['.'].rev(): |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1431 ui.status(_('nothing to rebase\n')) |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1432 else: |
fac3a24be50e
rebase: choose default destination the same way as 'hg merge' (BC)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28188
diff
changeset
|
1433 ui.status(_('nothing to rebase - updating instead\n')) |
28118
0e3835c7e1cf
rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28117
diff
changeset
|
1434 # not passing argument to get the bare update behavior |
0e3835c7e1cf
rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28117
diff
changeset
|
1435 # with warning and trumpets |
0e3835c7e1cf
rebase: perform update through the 'update' command
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
28117
diff
changeset
|
1436 commands.update(ui, repo) |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1437 else: |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1438 if opts.get('tool'): |
26587
56b2bcea2529
error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26496
diff
changeset
|
1439 raise error.Abort(_('--tool can only be used with --rebase')) |
26960
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1440 ret = orig(ui, repo, *args, **opts) |
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1441 |
6979fe2a6d75
rebase: add returning value from pullrebase function
liscju <piotr.listkiewicz@gmail.com>
parents:
26811
diff
changeset
|
1442 return ret |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1443 |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1444 def _setrebasesetvisibility(repo, revs): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1445 """store the currently rebased set on the repo object |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1446 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1447 This is used by another function to prevent rebased revision to because |
30865
01512564ddd5
rebase: fix code comment to refer to right issue (4504, not 4505)
Martin von Zweigbergk <martinvonz@google.com>
parents:
30755
diff
changeset
|
1448 hidden (see issue4504)""" |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1449 repo = repo.unfiltered() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1450 repo._rebaseset = revs |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1451 # invalidate cache if visibility changes |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1452 hiddens = repo.filteredrevcache.get('visible', set()) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1453 if revs & hiddens: |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1454 repo.invalidatevolatilesets() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1455 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1456 def _clearrebasesetvisibiliy(repo): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1457 """remove rebaseset data from the repo""" |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1458 repo = repo.unfiltered() |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1459 if '_rebaseset' in vars(repo): |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1460 del repo._rebaseset |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1461 |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1462 def _rebasedvisible(orig, repo): |
30865
01512564ddd5
rebase: fix code comment to refer to right issue (4504, not 4505)
Martin von Zweigbergk <martinvonz@google.com>
parents:
30755
diff
changeset
|
1463 """ensure rebased revs stay visible (see issue4504)""" |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1464 blockers = orig(repo) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1465 blockers.update(getattr(repo, '_rebaseset', ())) |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1466 return blockers |
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1467 |
27790
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1468 def _filterobsoleterevs(repo, revs): |
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1469 """returns a set of the obsolete revisions in revs""" |
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1470 return set(r for r in revs if repo[r].obsolete()) |
2d294dada4f8
rebase: small refactoring to allow better extensibility from extensions
Laurent Charignon <lcharignon@fb.com>
parents:
27746
diff
changeset
|
1471 |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1472 def _computeobsoletenotrebased(repo, rebaseobsrevs, dest): |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1473 """return a mapping obsolete => successor for all obsolete nodes to be |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1474 rebased that have a successors in the destination |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1475 |
30332
318a24b52eeb
spelling: fixes of non-dictionary words
Mads Kiilerich <madski@unity3d.com>
parents:
30273
diff
changeset
|
1476 obsolete => None entries in the mapping indicate nodes with no successor""" |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1477 obsoletenotrebased = {} |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1478 |
26781
1aee2ab0f902
spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents:
26748
diff
changeset
|
1479 # Build a mapping successor => obsolete nodes for the obsolete |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1480 # nodes to be rebased |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1481 allsuccessors = {} |
26674
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1482 cl = repo.changelog |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1483 for r in rebaseobsrevs: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1484 node = cl.node(r) |
33145
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33139
diff
changeset
|
1485 for s in obsutil.allsuccessors(repo.obsstore, [node]): |
27744
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1486 try: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1487 allsuccessors[cl.rev(s)] = cl.rev(node) |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1488 except LookupError: |
f2b8b4e2de20
rebase: minor refactoring of _computeobsoletenotrebased
Laurent Charignon <lcharignon@fb.com>
parents:
27626
diff
changeset
|
1489 pass |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1490 |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1491 if allsuccessors: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1492 # Look for successors of obsolete nodes to be rebased among |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1493 # the ancestors of dest |
33157
5d29c55414b3
rebase: always pass destination as revnum to _handleskippingobsolete()
Martin von Zweigbergk <martinvonz@google.com>
parents:
33145
diff
changeset
|
1494 ancs = cl.ancestors([dest], |
26674
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1495 stoprev=min(allsuccessors), |
fd4a38bd7e49
rebase: use a direct reference to repo.changelog
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
26671
diff
changeset
|
1496 inclusive=True) |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1497 for s in allsuccessors: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1498 if s in ancs: |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1499 obsoletenotrebased[allsuccessors[s]] = s |
27012
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1500 elif (s == allsuccessors[s] and |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1501 allsuccessors.values().count(s) == 1): |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1502 # plain prune |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1503 obsoletenotrebased[s] = None |
5eac7ab59b95
rebase: don't rebase obsolete commits with no successor
Laurent Charignon <lcharignon@fb.com>
parents:
27010
diff
changeset
|
1504 |
26349
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1505 return obsoletenotrebased |
92409f8dff5d
rebase: don't rebase obsolete commit whose successor is already rebased
Laurent Charignon <lcharignon@fb.com>
parents:
26301
diff
changeset
|
1506 |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1507 def summaryhook(ui, repo): |
30709
a932297febb7
rebase: use repo.vfs.exists in 'hg summary' hook
Valters Vingolds <valters@vingolds.ch>
parents:
30674
diff
changeset
|
1508 if not repo.vfs.exists('rebasestate'): |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1509 return |
19849
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1510 try: |
29403
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
1511 rbsrt = rebaseruntime(repo, ui, {}) |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
1512 rbsrt.restorestatus() |
b95fd7c15b7c
rebase: move restorestestatus function to be a method of the RR class
Kostia Balytskyi <ikostia@fb.com>
parents:
29402
diff
changeset
|
1513 state = rbsrt.state |
19849
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1514 except error.RepoLookupError: |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1515 # i18n: column positioning for "hg summary" |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1516 msg = _('rebase: (use "hg rebase --abort" to clear broken state)\n') |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1517 ui.write(msg) |
e7fa36d2ad3a
rebase: catch RepoLookupError at restoring rebase state for summary
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19848
diff
changeset
|
1518 return |
23489
fe4157d839ac
rebase: use '>= 0' to know is a revision was rebased
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23484
diff
changeset
|
1519 numrebased = len([i for i in state.itervalues() if i >= 0]) |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1520 # i18n: column positioning for "hg summary" |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1521 ui.write(_('rebase: %s, %s (rebase --continue)\n') % |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1522 (ui.label(_('%d rebased'), 'rebase.rebased') % numrebased, |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1523 ui.label(_('%d remaining'), 'rebase.remaining') % |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1524 (len(state) - numrebased))) |
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1525 |
6906
808f03f61ebe
Add rebase extension
Stefano Tortarolo <stefano.tortarolo@gmail.com>
parents:
diff
changeset
|
1526 def uisetup(ui): |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1527 #Replace pull with a decorator to provide --rebase option |
7216
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
1528 entry = extensions.wrapcommand(commands.table, 'pull', pullrebase) |
292fb2ad2846
extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents:
7213
diff
changeset
|
1529 entry[1].append(('', 'rebase', None, |
14444
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1530 _("rebase working directory to branch head"))) |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1531 entry[1].append(('t', 'tool', '', |
1f997134a9d1
rebase: add option --tool/-t for 'pull --rebase'
Adrian Buehlmann <adrian@cadifra.com>
parents:
14306
diff
changeset
|
1532 _("specify merge tool for rebase"))) |
19214
0250047a365e
summary: indicate if a rebase is underway
Bryan O'Sullivan <bryano@fb.com>
parents:
19059
diff
changeset
|
1533 cmdutil.summaryhooks.add('rebase', summaryhook) |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
1534 cmdutil.unfinishedstates.append( |
19496
607191a45f8c
checkunfinished: accommodate histedit quirk
Matt Mackall <mpm@selenic.com>
parents:
19478
diff
changeset
|
1535 ['rebasestate', False, False, _('rebase in progress'), |
19478
e5a5790a3185
rebase: add checkunfinished support (issue3955)
Matt Mackall <mpm@selenic.com>
parents:
19477
diff
changeset
|
1536 _("use 'hg rebase --continue' or 'hg rebase --abort'")]) |
27626
157675d0f600
rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents:
27586
diff
changeset
|
1537 cmdutil.afterresolvedstates.append( |
157675d0f600
rebase: hook afterresolvedstates
timeless <timeless@mozdev.org>
parents:
27586
diff
changeset
|
1538 ['rebasestate', _('hg rebase --continue')]) |
23970
8a544fb645bb
rebase: ensure rebase revision remains visible (issue4504)
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23917
diff
changeset
|
1539 # ensure rebased rev are not hidden |
32586
47e4c6bb39f1
hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents:
32427
diff
changeset
|
1540 extensions.wrapfunction(repoview, 'pinnedrevs', _rebasedvisible) |