Mercurial > hg
annotate mercurial/merge.py @ 8564:6b9ec23b09fc
named branches: improve pre-push logic (issue736)
Each named branch is considered separately, and the push is allowed if
no new branch heads are created for any named branch to be pushed.
Due to some tests's use of --debug, their output will change after this
addition. This has been fixed as well.
Co-contributor: Henrik Stuart <henrik.stuart@edlund.dk>
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Sat, 23 May 2009 17:04:31 +0200 |
parents | 3682a19bb637 |
children | f8be48c6b08c |
rev | line source |
---|---|
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # merge.py - directory-level update/merge handling for Mercurial |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8152
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8152
diff
changeset
|
6 # GNU General Public License version 2, incorporated herein by reference. |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
6518 | 8 from node import nullid, nullrev, hex, bin |
3891 | 9 from i18n import _ |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8259
diff
changeset
|
10 import util, filemerge, copies |
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8259
diff
changeset
|
11 import errno, os, shutil |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
12 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
13 class mergestate(object): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
14 '''track 3-way merge state of individual files''' |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
15 def __init__(self, repo): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
16 self._repo = repo |
6518 | 17 self._read() |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
18 def reset(self, node=None): |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
19 self._state = {} |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
20 if node: |
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
21 self._local = node |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
22 shutil.rmtree(self._repo.join("merge"), True) |
6518 | 23 def _read(self): |
24 self._state = {} | |
25 try: | |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
26 localnode = None |
6518 | 27 f = self._repo.opener("merge/state") |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
28 for i, l in enumerate(f): |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
29 if i == 0: |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
30 localnode = l[:-1] |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
31 else: |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
32 bits = l[:-1].split("\0") |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
33 self._state[bits[0]] = bits[1:] |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
34 self._local = bin(localnode) |
6518 | 35 except IOError, err: |
36 if err.errno != errno.ENOENT: | |
37 raise | |
38 def _write(self): | |
39 f = self._repo.opener("merge/state", "w") | |
40 f.write(hex(self._local) + "\n") | |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7569
diff
changeset
|
41 for d, v in self._state.iteritems(): |
6518 | 42 f.write("\0".join([d] + v) + "\n") |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
43 def add(self, fcl, fco, fca, fd, flags): |
6517
fcfb6a0a0a84
python-2.6: use sha wrapper from util for new merge code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6512
diff
changeset
|
44 hash = util.sha1(fcl.path()).hexdigest() |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
45 self._repo.opener("merge/" + hash, "w").write(fcl.data()) |
6518 | 46 self._state[fd] = ['u', hash, fcl.path(), fca.path(), |
47 hex(fca.filenode()), fco.path(), flags] | |
48 self._write() | |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
49 def __contains__(self, dfile): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
50 return dfile in self._state |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
51 def __getitem__(self, dfile): |
6518 | 52 return self._state[dfile][0] |
53 def __iter__(self): | |
54 l = self._state.keys() | |
55 l.sort() | |
56 for f in l: | |
57 yield f | |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
58 def mark(self, dfile, state): |
6518 | 59 self._state[dfile][0] = state |
60 self._write() | |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
61 def resolve(self, dfile, wctx, octx): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
62 if self[dfile] == 'r': |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
63 return 0 |
6518 | 64 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile] |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
65 f = self._repo.opener("merge/" + hash) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
66 self._repo.wwrite(dfile, f.read(), flags) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
67 fcd = wctx[dfile] |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
68 fco = octx[ofile] |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
69 fca = self._repo.filectx(afile, fileid=anode) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
70 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
71 if not r: |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
72 self.mark(dfile, 'r') |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
73 return r |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
74 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
75 def _checkunknown(wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
76 "check for collisions between unknown files and files in mctx" |
3218
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3212
diff
changeset
|
77 for f in wctx.unknown(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
78 if f in mctx and mctx[f].cmp(wctx[f].data()): |
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
79 raise util.Abort(_("untracked file in working directory differs" |
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
80 " from file in requested revision: '%s'") % f) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
81 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
82 def _checkcollision(mctx): |
3785 | 83 "check for case folding collisions in the destination context" |
84 folded = {} | |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
85 for fn in mctx: |
3785 | 86 fold = fn.lower() |
87 if fold in folded: | |
88 raise util.Abort(_("case-folding collision between %s and %s") | |
89 % (fn, folded[fold])) | |
90 folded[fold] = fn | |
91 | |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
92 def _forgetremoved(wctx, mctx, branchmerge): |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
93 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
94 Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
95 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
96 If we're jumping between revisions (as opposed to merging), and if |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
97 neither the working directory nor the target rev has the file, |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
98 then we need to remove it from the dirstate, to prevent the |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
99 dirstate from listing the file when it is no longer in the |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
100 manifest. |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
101 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
102 If we're merging, and the other revision has removed a file |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
103 that is not present in the working directory, we need to mark it |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
104 as removed. |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
105 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
106 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
107 action = [] |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
108 state = branchmerge and 'r' or 'f' |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
109 for f in wctx.deleted(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
110 if f not in mctx: |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
111 action.append((f, state)) |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
112 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
113 if not branchmerge: |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
114 for f in wctx.removed(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
115 if f not in mctx: |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
116 action.append((f, "f")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
117 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
118 return action |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
119 |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
120 def manifestmerge(repo, p1, p2, pa, overwrite, partial): |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
121 """ |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
122 Merge p1 and p2 with ancestor ma and generate merge action list |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
123 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
124 overwrite = whether we clobber working files |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
125 partial = function to filter file lists |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
126 """ |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
127 |
3314 | 128 repo.ui.note(_("resolving manifests\n")) |
129 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial))) | |
130 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2)) | |
131 | |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
132 m1 = p1.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
133 m2 = p2.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
134 ma = pa.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
135 backwards = (pa == p2) |
3314 | 136 action = [] |
6274
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
137 copy, copied, diverge = {}, {}, {} |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
138 |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
139 def fmerge(f, f2=None, fa=None): |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
140 """merge flags""" |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
141 if not f2: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
142 f2 = f |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
143 fa = f |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
144 a, m, n = ma.flags(fa), m1.flags(f), m2.flags(f2) |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
145 if m == n: # flags agree |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
146 return m # unchanged |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
147 if m and n: # flags are set but don't agree |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
148 if not a: # both differ from parent |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
149 r = repo.ui.prompt( |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
150 _(" conflicting flags for %s\n" |
8259
98acfd1d2b08
ui: replace regexp pattern with sequence of choices
Steve Borho <steve@borho.org>
parents:
8225
diff
changeset
|
151 "(n)one, e(x)ec or sym(l)ink?") % f, |
98acfd1d2b08
ui: replace regexp pattern with sequence of choices
Steve Borho <steve@borho.org>
parents:
8225
diff
changeset
|
152 (_("&None"), _("E&xec"), _("Sym&link")), _("n")) |
98acfd1d2b08
ui: replace regexp pattern with sequence of choices
Steve Borho <steve@borho.org>
parents:
8225
diff
changeset
|
153 return r != _("n") and r or '' |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
154 if m == a: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
155 return n # changed from m to n |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
156 return m # changed from n to m |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
157 if m and m != a: # changed from a to m |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
158 return m |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
159 if n and n != a: # changed from a to n |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
160 return n |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
161 return '' # flag was cleared |
3118
5644a05a608c
merge: simplify exec flag handling
Matt Mackall <mpm@selenic.com>
parents:
3117
diff
changeset
|
162 |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
163 def act(msg, m, f, *args): |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
164 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) |
3121
2ef0b3aae186
merge: simplify actions with helper function
Matt Mackall <mpm@selenic.com>
parents:
3120
diff
changeset
|
165 action.append((f, m) + args) |
2ef0b3aae186
merge: simplify actions with helper function
Matt Mackall <mpm@selenic.com>
parents:
3120
diff
changeset
|
166 |
6275
fda369b5779c
diff: use copy smarts from copies.py
Matt Mackall <mpm@selenic.com>
parents:
6274
diff
changeset
|
167 if pa and not (backwards or overwrite): |
6425
2d9328a2f81f
copies: skip directory rename checks when not merging
Matt Mackall <mpm@selenic.com>
parents:
6381
diff
changeset
|
168 if repo.ui.configbool("merge", "followcopies", True): |
2d9328a2f81f
copies: skip directory rename checks when not merging
Matt Mackall <mpm@selenic.com>
parents:
6381
diff
changeset
|
169 dirs = repo.ui.configbool("merge", "followdirs", True) |
2d9328a2f81f
copies: skip directory rename checks when not merging
Matt Mackall <mpm@selenic.com>
parents:
6381
diff
changeset
|
170 copy, diverge = copies.copies(repo, p1, p2, pa, dirs) |
8152
08e1baf924ca
replace set-like dictionaries with real sets
Martin Geisler <mg@lazybytes.net>
parents:
8109
diff
changeset
|
171 copied = set(copy.values()) |
7622
4dd7b28003d2
use dict.iteritems() rather than dict.items()
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7569
diff
changeset
|
172 for of, fl in diverge.iteritems(): |
6274
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
173 act("divergent renames", "dr", of, fl) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
174 |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
175 # Compare manifests |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
176 for f, n in m1.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
177 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
178 continue |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
179 if f in m2: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
180 if overwrite or backwards: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
181 rflags = m2.flags(f) |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
182 else: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
183 rflags = fmerge(f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
184 # are files different? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
185 if n != m2[f]: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
186 a = ma.get(f, nullid) |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
187 # are we clobbering? |
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
188 if overwrite: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
189 act("clobbering", "g", f, rflags) |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
190 # or are we going back in time and clean? |
7066
865c5be0f8df
merge: fix bug going backwards for already reverted files (issue1303)
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
191 elif backwards: |
865c5be0f8df
merge: fix bug going backwards for already reverted files (issue1303)
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
192 if not n[20:] or not p2[f].cmp(p1[f].data()): |
865c5be0f8df
merge: fix bug going backwards for already reverted files (issue1303)
Matt Mackall <mpm@selenic.com>
parents:
6953
diff
changeset
|
193 act("reverting", "g", f, rflags) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
194 # are both different from the ancestor? |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
195 elif n != a and m2[f] != a: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
196 act("versions differ", "m", f, f, f, rflags, False) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
197 # is remote's version newer? |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
198 elif m2[f] != a: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
199 act("remote is newer", "g", f, rflags) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
200 # local is newer, not overwrite, check mode bits |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
201 elif m1.flags(f) != rflags: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
202 act("update permissions", "e", f, rflags) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
203 # contents same, check mode bits |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
204 elif m1.flags(f) != rflags: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
205 act("update permissions", "e", f, rflags) |
3730
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
206 elif f in copied: |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
207 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
208 elif f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
209 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
210 if f2 not in m2: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
211 act("remote renamed directory to " + f2, "d", |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
212 f, None, f2, m1.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
213 elif f2 in m1: # case 2 A,B/B/B |
3730
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
214 act("local copied to " + f2, "m", |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
215 f, f2, f, fmerge(f, f2, f2), False) |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
216 else: # case 4,21 A/B/B |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
217 act("local moved to " + f2, "m", |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
218 f, f2, f, fmerge(f, f2, f2), False) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
219 elif f in ma: |
3117
7a635ef25132
merge: simplify tests for local changed/remote deleted
Matt Mackall <mpm@selenic.com>
parents:
3116
diff
changeset
|
220 if n != ma[f] and not overwrite: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
221 if repo.ui.prompt( |
5670
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
222 _(" local changed %s which remote deleted\n" |
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
223 "use (c)hanged version or (d)elete?") % f, |
8259
98acfd1d2b08
ui: replace regexp pattern with sequence of choices
Steve Borho <steve@borho.org>
parents:
8225
diff
changeset
|
224 (_("&Changed"), _("&Delete")), _("c")) == _("d"): |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
225 act("prompt delete", "r", f) |
7768
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
226 act("prompt keep", "a", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
227 else: |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
228 act("other deleted", "r", f) |
8518
3f4f14eab085
update --clean: do not unlink added files (issue575)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8366
diff
changeset
|
229 elif overwrite and n[20:] == "a": # do not erase the working copy |
3f4f14eab085
update --clean: do not unlink added files (issue575)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8366
diff
changeset
|
230 act("remote deleted", "f", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
231 else: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
232 # file is created on branch or in working directory |
3120
1c1e59aac82a
merge: simplify local created logic
Matt Mackall <mpm@selenic.com>
parents:
3119
diff
changeset
|
233 if (overwrite and n[20:] != "u") or (backwards and not n[20:]): |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
234 act("remote deleted", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
235 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
236 for f, n in m2.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
237 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
238 continue |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
239 if f in m1: |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
240 continue |
3729
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
241 if f in copied: |
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
242 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
243 if f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
244 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
245 if f2 not in m1: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
246 act("local renamed directory to " + f2, "d", |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
247 None, f, f2, m2.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
248 elif f2 in m2: # rename case 1, A/A,B/A |
3730
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
249 act("remote copied to " + f, "m", |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
250 f2, f, f, fmerge(f2, f, f2), False) |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
251 else: # case 3,20 A/B/A |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
252 act("remote moved to " + f, "m", |
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
253 f2, f, f, fmerge(f2, f, f2), True) |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
254 elif f in ma: |
3116
920f54a2249e
merge: more simplification of m2 manifest scanning
Matt Mackall <mpm@selenic.com>
parents:
3115
diff
changeset
|
255 if overwrite or backwards: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
256 act("recreating", "g", f, m2.flags(f)) |
3116
920f54a2249e
merge: more simplification of m2 manifest scanning
Matt Mackall <mpm@selenic.com>
parents:
3115
diff
changeset
|
257 elif n != ma[f]: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
258 if repo.ui.prompt( |
5670
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
259 _("remote changed %s which local deleted\n" |
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
260 "use (c)hanged version or leave (d)eleted?") % f, |
8259
98acfd1d2b08
ui: replace regexp pattern with sequence of choices
Steve Borho <steve@borho.org>
parents:
8225
diff
changeset
|
261 (_("&Changed"), _("&Deleted")), _("c")) == _("c"): |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
262 act("prompt recreating", "g", f, m2.flags(f)) |
3115
bb74f809bc95
merge: reorder tests on m2 items in manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3114
diff
changeset
|
263 else: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
264 act("remote created", "g", f, m2.flags(f)) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
265 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
266 return action |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
267 |
8366
0bf0045000b5
some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
268 def actionkey(a): |
0bf0045000b5
some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
269 return a[1] == 'r' and -1 or 0, a |
6805
482581431dcd
Sort removes first when applying updates (fixes issues 750 and 912)
Paul Moore <p.f.moore@gmail.com>
parents:
6762
diff
changeset
|
270 |
3297
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
271 def applyupdates(repo, action, wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
272 "apply the merge action list to the working directory" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
273 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
274 updated, merged, removed, unresolved = 0, 0, 0, 0 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
275 ms = mergestate(repo) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
276 ms.reset(wctx.parents()[0].node()) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
277 moves = [] |
8366
0bf0045000b5
some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
278 action.sort(key=actionkey) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
279 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
280 # prescan for merges |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
281 for a in action: |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
282 f, m = a[:2] |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
283 if m == 'm': # merge |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
284 f2, fd, flags, move = a[2:] |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
285 repo.ui.debug(_("preserving %s for resolve of %s\n") % (f, fd)) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
286 fcl = wctx[f] |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
287 fco = mctx[f2] |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
288 fca = fcl.ancestor(fco) or repo.filectx(f, fileid=nullrev) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
289 ms.add(fcl, fco, fca, fd, flags) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
290 if f != fd and move: |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
291 moves.append(f) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
292 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
293 # remove renamed files after safely stored |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
294 for f in moves: |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
295 if util.lexists(repo.wjoin(f)): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
296 repo.ui.debug(_("removing %s\n") % f) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
297 os.unlink(repo.wjoin(f)) |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
298 |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
299 audit_path = util.path_auditor(repo.root) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
300 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
301 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
302 f, m = a[:2] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
303 if f and f[0] == "/": |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
304 continue |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
305 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
306 repo.ui.note(_("removing %s\n") % f) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
307 audit_path(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
308 try: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
309 util.unlink(repo.wjoin(f)) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
310 except OSError, inst: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
311 if inst.errno != errno.ENOENT: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
312 repo.ui.warn(_("update failed to remove %s: %s!\n") % |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
313 (f, inst.strerror)) |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3618
diff
changeset
|
314 removed += 1 |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
315 elif m == "m": # merge |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
316 f2, fd, flags, move = a[2:] |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
317 r = ms.resolve(fd, wctx, mctx) |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
318 if r > 0: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
319 unresolved += 1 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
320 else: |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
321 if r is None: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
322 updated += 1 |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
323 else: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
324 merged += 1 |
6877
1d38f3605b20
util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
325 util.set_flags(repo.wjoin(fd), 'l' in flags, 'x' in flags) |
5059
8d9bdcbb2b18
merge: avoid double deletion mentioned in issue636
Matt Mackall <mpm@selenic.com>
parents:
5042
diff
changeset
|
326 if f != fd and move and util.lexists(repo.wjoin(f)): |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
327 repo.ui.debug(_("removing %s\n") % f) |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
328 os.unlink(repo.wjoin(f)) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
329 elif m == "g": # get |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
330 flags = a[2] |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
331 repo.ui.note(_("getting %s\n") % f) |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
332 t = mctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
333 repo.wwrite(f, t, flags) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
334 updated += 1 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
335 elif m == "d": # directory rename |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
336 f2, fd, flags = a[2:] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
337 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
338 repo.ui.note(_("moving %s to %s\n") % (f, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
339 t = wctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
340 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
341 util.unlink(repo.wjoin(f)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
342 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
343 repo.ui.note(_("getting %s to %s\n") % (f2, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
344 t = mctx.filectx(f2).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
345 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
346 updated += 1 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
347 elif m == "dr": # divergent renames |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
348 fl = a[2] |
6953
63b5f4c73c98
i18n: mark strings for translation in Mercurial
Martin Geisler <mg@daimi.au.dk>
parents:
6884
diff
changeset
|
349 repo.ui.warn(_("warning: detected divergent renames of %s to:\n") % f) |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
350 for nf in fl: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
351 repo.ui.warn(" %s\n" % nf) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
352 elif m == "e": # exec |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
353 flags = a[2] |
6877
1d38f3605b20
util: set_flags shouldn't know about repo flag formats
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
354 util.set_flags(repo.wjoin(f), 'l' in flags, 'x' in flags) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
355 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
356 return updated, merged, removed, unresolved |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
357 |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
358 def recordupdates(repo, action, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
359 "record merge actions to the dirstate" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
360 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
361 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
362 f, m = a[:2] |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
363 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
364 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
365 repo.dirstate.remove(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
366 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
367 repo.dirstate.forget(f) |
7768
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
368 elif m == "a": # re-add |
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
369 if not branchmerge: |
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
370 repo.dirstate.add(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
371 elif m == "f": # forget |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
372 repo.dirstate.forget(f) |
7569
89207edf3973
correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7066
diff
changeset
|
373 elif m == "e": # exec change |
7630
a679bd371091
merge: fix execute bit update issue introduced by 89207edf3973
Patrick Mezard <pmezard@gmail.com>
parents:
7569
diff
changeset
|
374 repo.dirstate.normallookup(f) |
7569
89207edf3973
correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7066
diff
changeset
|
375 elif m == "g": # get |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
376 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
377 repo.dirstate.normaldirty(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
378 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
379 repo.dirstate.normal(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
380 elif m == "m": # merge |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
381 f2, fd, flag, move = a[2:] |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
382 if branchmerge: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
383 # We've done a branch merge, mark this file as merged |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
384 # so that we properly record the merger later |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
385 repo.dirstate.merge(fd) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
386 if f != f2: # copy/rename |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
387 if move: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
388 repo.dirstate.remove(f) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
389 if f != fd: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
390 repo.dirstate.copy(f, fd) |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
391 else: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
392 repo.dirstate.copy(f2, fd) |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
393 else: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
394 # We've update-merged a locally modified file, so |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
395 # we set the dirstate to emulate a normal checkout |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
396 # of that file some time in the past. Thus our |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
397 # merge will appear as a normal local file |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
398 # modification. |
5210
90d9ec0dc69d
merge: forcefully mark files that we get from the second parent as dirty
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
5161
diff
changeset
|
399 repo.dirstate.normallookup(fd) |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
400 if move: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
401 repo.dirstate.forget(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
402 elif m == "d": # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
403 f2, fd, flag = a[2:] |
4819
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
404 if not f2 and f not in repo.dirstate: |
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
405 # untracked file moved |
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
406 continue |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
407 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
408 repo.dirstate.add(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
409 if f: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
410 repo.dirstate.remove(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
411 repo.dirstate.copy(f, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
412 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
413 repo.dirstate.copy(f2, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
414 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
415 repo.dirstate.normal(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
416 if f: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
417 repo.dirstate.forget(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
418 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
419 def update(repo, node, branchmerge, force, partial): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
420 """ |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
421 Perform a merge between the working directory and the given node |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
422 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
423 branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
424 force = whether to force branch merging or file overwriting |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
425 partial = a function to filter file lists (dirstate not updated) |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
426 """ |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
427 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
428 wlock = repo.wlock() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
429 try: |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6746
diff
changeset
|
430 wc = repo[None] |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
431 if node is None: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
432 # tip of current branch |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
433 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
434 node = repo.branchtags()[wc.branch()] |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
435 except KeyError: |
5570
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
436 if wc.branch() == "default": # no default branch! |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
437 node = repo.lookup("tip") # update to tip |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
438 else: |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
439 raise util.Abort(_("branch %s not found") % wc.branch()) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
440 overwrite = force and not branchmerge |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
441 pl = wc.parents() |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6746
diff
changeset
|
442 p1, p2 = pl[0], repo[node] |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
443 pa = p1.ancestor(p2) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
444 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
445 fastforward = False |
3314 | 446 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
447 ### check phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
448 if not overwrite and len(pl) > 1: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
449 raise util.Abort(_("outstanding uncommitted merges")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
450 if branchmerge: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
451 if pa == p2: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
452 raise util.Abort(_("can't merge with ancestor")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
453 elif pa == p1: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
454 if p1.branch() != p2.branch(): |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
455 fastforward = True |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
456 else: |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
457 raise util.Abort(_("nothing to merge (use 'hg update'" |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
458 " or check 'hg heads')")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
459 if not force and (wc.files() or wc.deleted()): |
8545
3682a19bb637
merge: give hint as to how to discover uncommitted changes
Steve Borho <steve@borho.org>
parents:
8518
diff
changeset
|
460 raise util.Abort(_("outstanding uncommitted changes " |
3682a19bb637
merge: give hint as to how to discover uncommitted changes
Steve Borho <steve@borho.org>
parents:
8518
diff
changeset
|
461 "(use 'hg status' to list changes)")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
462 elif not overwrite: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
463 if pa == p1 or pa == p2: # linear |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
464 pass # all good |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
465 elif p1.branch() == p2.branch(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
466 if wc.files() or wc.deleted(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
467 raise util.Abort(_("crosses branches (use 'hg merge' or " |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
468 "'hg update -C' to discard changes)")) |
6381
0b89315d5de2
Fix missing space in one of the new update messages.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
6375
diff
changeset
|
469 raise util.Abort(_("crosses branches (use 'hg merge' " |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
470 "or 'hg update -C')")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
471 elif wc.files() or wc.deleted(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
472 raise util.Abort(_("crosses named branches (use " |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
473 "'hg update -C' to discard changes)")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
474 else: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
475 # Allow jumping branches if there are no changes |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
476 overwrite = True |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
477 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
478 ### calculate phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
479 action = [] |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
480 if not force: |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
481 _checkunknown(wc, p2) |
6746
1dca460e7d1e
rename checkfolding to checkcase
Matt Mackall <mpm@selenic.com>
parents:
6740
diff
changeset
|
482 if not util.checkcase(repo.path): |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
483 _checkcollision(p2) |
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
484 action += _forgetremoved(wc, p2, branchmerge) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
485 action += manifestmerge(repo, wc, p2, pa, overwrite, partial) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
486 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
487 ### apply phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
488 if not branchmerge: # just jump to the new rev |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
489 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
490 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
491 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
492 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
493 stats = applyupdates(repo, action, wc, p2) |
2899
8743188f4d2e
merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents:
2898
diff
changeset
|
494 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
495 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
496 recordupdates(repo, action, branchmerge) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
497 repo.dirstate.setparents(fp1, fp2) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
498 if not branchmerge and not fastforward: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
499 repo.dirstate.setbranch(p2.branch()) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
500 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
3314 | 501 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
502 return stats |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
503 finally: |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7848
diff
changeset
|
504 wlock.release() |