Mercurial > hg
annotate mercurial/merge.py @ 6858:8f256bf98219
Add support for multiple possible bisect results (issue1228, issue1182)
The real reason for both issue is that bisect can not handle cases where there
are multiple possibilities for the result.
Example (from issue1228):
rev 0 -> good
rev 1 -> skipped
rev 2 -> skipped
rev 3 -> skipped
rev 4 -> bad
Note that this patch does not only fix the reported Assertion Error but also
the problem of a non converging bisect:
hg init
for i in `seq 3`; do echo $i > $i; hg add $i; hg ci -m$i; done
hg bisect -b 2
hg bisect -g 0
hg bisect -s
From this state on, you can:
a) mark as bad forever (non converging!)
b) mark as good to get an inconsistent state
c) skip for the Assertion Error
Minor description and code edits by pmezard.
author | Bernhard Leiner <bleiner@gmail.com> |
---|---|
date | Sat, 02 Aug 2008 22:10:10 +0200 |
parents | 2d9328a2f81f |
children | 368a4ec603cc 1d38f3605b20 |
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 # |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
6 # of the GNU General Public License, incorporated herein by reference. |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
6211
f89fd07fc51d
Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents:
6003
diff
changeset
|
8 from node import nullid, nullrev |
3891 | 9 from i18n import _ |
6274
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
10 import errno, util, os, filemerge, copies |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
11 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
12 def _checkunknown(wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
13 "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
|
14 for f in wctx.unknown(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
15 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
|
16 raise util.Abort(_("untracked file in working directory differs" |
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
17 " 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
|
18 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
19 def _checkcollision(mctx): |
3785 | 20 "check for case folding collisions in the destination context" |
21 folded = {} | |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
22 for fn in mctx: |
3785 | 23 fold = fn.lower() |
24 if fold in folded: | |
25 raise util.Abort(_("case-folding collision between %s and %s") | |
26 % (fn, folded[fold])) | |
27 folded[fold] = fn | |
28 | |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
29 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
|
30 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
31 Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
32 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
33 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
|
34 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
|
35 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
|
36 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
|
37 manifest. |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
38 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
39 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
|
40 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
|
41 as removed. |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
42 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
43 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
44 action = [] |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
45 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
|
46 for f in wctx.deleted(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
47 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
|
48 action.append((f, state)) |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
49 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
50 if not branchmerge: |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
51 for f in wctx.removed(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
52 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
|
53 action.append((f, "f")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
54 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
55 return action |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
56 |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
57 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
|
58 """ |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
59 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
|
60 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
61 overwrite = whether we clobber working files |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
62 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
|
63 """ |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
64 |
3314 | 65 repo.ui.note(_("resolving manifests\n")) |
66 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial))) | |
67 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2)) | |
68 | |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
69 m1 = p1.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
70 m2 = p2.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
71 ma = pa.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
72 backwards = (pa == p2) |
3314 | 73 action = [] |
6274
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
74 copy, copied, diverge = {}, {}, {} |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
75 |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
76 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
|
77 """merge flags""" |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
78 if not f2: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
79 f2 = f |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
80 fa = f |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
81 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
|
82 if m == n: # flags agree |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
83 return m # unchanged |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
84 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
|
85 if not a: # both differ from parent |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
86 r = repo.ui.prompt( |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
87 _(" conflicting flags for %s\n" |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
88 "(n)one, e(x)ec or sym(l)ink?") % f, "[nxl]", "n") |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
89 return r != "n" and r or '' |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
90 if m == a: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
91 return n # changed from m to n |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
92 return m # changed from n to m |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
93 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
|
94 return m |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
95 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
|
96 return n |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
97 return '' # flag was cleared |
3118
5644a05a608c
merge: simplify exec flag handling
Matt Mackall <mpm@selenic.com>
parents:
3117
diff
changeset
|
98 |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
99 def act(msg, m, f, *args): |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
100 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
|
101 action.append((f, m) + args) |
2ef0b3aae186
merge: simplify actions with helper function
Matt Mackall <mpm@selenic.com>
parents:
3120
diff
changeset
|
102 |
6275
fda369b5779c
diff: use copy smarts from copies.py
Matt Mackall <mpm@selenic.com>
parents:
6274
diff
changeset
|
103 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
|
104 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
|
105 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
|
106 copy, diverge = copies.copies(repo, p1, p2, pa, dirs) |
6274
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
107 copied = dict.fromkeys(copy.values()) |
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
108 for of, fl in diverge.items(): |
f3f383efbeae
copies: move findcopies code to its own module
Matt Mackall <mpm@selenic.com>
parents:
6273
diff
changeset
|
109 act("divergent renames", "dr", of, fl) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
110 |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
111 # Compare manifests |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
112 for f, n in m1.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
113 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
114 continue |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
115 if f in m2: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
116 if overwrite or backwards: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
117 rflags = m2.flags(f) |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
118 else: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
119 rflags = fmerge(f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
120 # are files different? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
121 if n != m2[f]: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
122 a = ma.get(f, nullid) |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
123 # are we clobbering? |
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
124 if overwrite: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
125 act("clobbering", "g", f, rflags) |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
126 # or are we going back in time and clean? |
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
127 elif backwards and not n[20:]: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
128 act("reverting", "g", f, rflags) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
129 # 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
|
130 elif n != a and m2[f] != a: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
131 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
|
132 # is remote's version newer? |
5700
9cedc3fbbebb
merge: simplify merge tests, fix exec flag bug
Matt Mackall <mpm@selenic.com>
parents:
5695
diff
changeset
|
133 elif m2[f] != a: |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
134 act("remote is newer", "g", f, rflags) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
135 # local is newer, not overwrite, check mode bits |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
136 elif m1.flags(f) != rflags: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
137 act("update permissions", "e", f, rflags) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
138 # contents same, check mode bits |
5708
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
139 elif m1.flags(f) != rflags: |
f6bf89722e29
merge: add flag merging intelligence
Matt Mackall <mpm@selenic.com>
parents:
5704
diff
changeset
|
140 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
|
141 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
|
142 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
143 elif f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
144 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
145 if f2 not in m2: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
146 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
|
147 f, None, f2, m1.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
148 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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 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
|
154 elif f in ma: |
3117
7a635ef25132
merge: simplify tests for local changed/remote deleted
Matt Mackall <mpm@selenic.com>
parents:
3116
diff
changeset
|
155 if n != ma[f] and not overwrite: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
156 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
|
157 _(" 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
|
158 "use (c)hanged version or (d)elete?") % f, |
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
159 _("[cd]"), _("c")) == _("d"): |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
160 act("prompt delete", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
161 else: |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
162 act("other deleted", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
163 else: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
164 # 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
|
165 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
|
166 act("remote deleted", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
167 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
168 for f, n in m2.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
169 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
170 continue |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
171 if f in m1: |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
172 continue |
3729
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
173 if f in copied: |
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
174 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
175 if f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
176 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
177 if f2 not in m1: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
178 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
|
179 None, f, f2, m2.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
180 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
|
181 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
|
182 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
|
183 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
|
184 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
|
185 f2, f, f, fmerge(f2, f, f2), True) |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
186 elif f in ma: |
3116
920f54a2249e
merge: more simplification of m2 manifest scanning
Matt Mackall <mpm@selenic.com>
parents:
3115
diff
changeset
|
187 if overwrite or backwards: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
188 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
|
189 elif n != ma[f]: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
190 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
|
191 _("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
|
192 "use (c)hanged version or leave (d)eleted?") % f, |
840e2b315c1f
Fix misleading error and prompts during update/merge (issue556)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5489
diff
changeset
|
193 _("[cd]"), _("c")) == _("c"): |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
194 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
|
195 else: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
196 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
|
197 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
198 return action |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
199 |
3297
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
200 def applyupdates(repo, action, wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
201 "apply the merge action list to the working directory" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
202 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
203 updated, merged, removed, unresolved = 0, 0, 0, 0 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
204 action.sort() |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
205 # prescan for copy/renames |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
206 for a in action: |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
207 f, m = a[:2] |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
208 if m == 'm': # merge |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
209 f2, fd, flags, move = a[2:] |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
210 if f != fd: |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
211 repo.ui.debug(_("copying %s to %s\n") % (f, fd)) |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
212 repo.wwrite(fd, repo.wread(f), flags) |
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
213 |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
214 audit_path = util.path_auditor(repo.root) |
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
215 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
216 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
217 f, m = a[:2] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
218 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
|
219 continue |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
220 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
221 repo.ui.note(_("removing %s\n") % f) |
5158
d316124ebbea
Make audit_path more stringent.
Bryan O'Sullivan <bos@serpentine.com>
parents:
5060
diff
changeset
|
222 audit_path(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
223 try: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
224 util.unlink(repo.wjoin(f)) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
225 except OSError, inst: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
226 if inst.errno != errno.ENOENT: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
227 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
|
228 (f, inst.strerror)) |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3618
diff
changeset
|
229 removed += 1 |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
230 elif m == "m": # merge |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
231 f2, fd, flags, move = a[2:] |
6003
7855b88ba838
filemerge: pull file-merging code into its own module
Matt Mackall <mpm@selenic.com>
parents:
5857
diff
changeset
|
232 r = filemerge.filemerge(repo, f, fd, f2, wctx, mctx) |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
233 if r > 0: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
234 unresolved += 1 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
235 else: |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
236 if r is None: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
237 updated += 1 |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
238 else: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
239 merged += 1 |
5704 | 240 util.set_flags(repo.wjoin(fd), flags) |
5059
8d9bdcbb2b18
merge: avoid double deletion mentioned in issue636
Matt Mackall <mpm@selenic.com>
parents:
5042
diff
changeset
|
241 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
|
242 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
|
243 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
|
244 elif m == "g": # get |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
245 flags = a[2] |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
246 repo.ui.note(_("getting %s\n") % f) |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
247 t = mctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
248 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
|
249 updated += 1 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
250 elif m == "d": # directory rename |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
251 f2, fd, flags = a[2:] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
252 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
253 repo.ui.note(_("moving %s to %s\n") % (f, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
254 t = wctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
255 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
256 util.unlink(repo.wjoin(f)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
257 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
258 repo.ui.note(_("getting %s to %s\n") % (f2, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
259 t = mctx.filectx(f2).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
260 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
261 updated += 1 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
262 elif m == "dr": # divergent renames |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
263 fl = a[2] |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
264 repo.ui.warn("warning: detected divergent renames of %s to:\n" % f) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
265 for nf in fl: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
266 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
|
267 elif m == "e": # exec |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
268 flags = a[2] |
5704 | 269 util.set_flags(repo.wjoin(f), flags) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
270 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
271 return updated, merged, removed, unresolved |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
272 |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
273 def recordupdates(repo, action, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
274 "record merge actions to the dirstate" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
275 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
276 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
277 f, m = a[:2] |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
278 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
279 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
280 repo.dirstate.remove(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
281 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
282 repo.dirstate.forget(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
283 elif m == "f": # forget |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
284 repo.dirstate.forget(f) |
4997
60c54154ec4c
merge: don't forget to update the dirstate for exec bit changes
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
285 elif m in "ge": # get or exec change |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
286 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
287 repo.dirstate.normaldirty(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
288 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
289 repo.dirstate.normal(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
290 elif m == "m": # merge |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
291 f2, fd, flag, move = a[2:] |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
292 if branchmerge: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
293 # 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
|
294 # 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
|
295 repo.dirstate.merge(fd) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
296 if f != f2: # copy/rename |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
297 if move: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
298 repo.dirstate.remove(f) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
299 if f != fd: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
300 repo.dirstate.copy(f, fd) |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
301 else: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
302 repo.dirstate.copy(f2, fd) |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
303 else: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
304 # We've update-merged a locally modified file, so |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
305 # we set the dirstate to emulate a normal checkout |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
306 # 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
|
307 # merge will appear as a normal local file |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
308 # 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
|
309 repo.dirstate.normallookup(fd) |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
310 if move: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
311 repo.dirstate.forget(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
312 elif m == "d": # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
313 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
|
314 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
|
315 # untracked file moved |
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
316 continue |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
317 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
318 repo.dirstate.add(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
319 if f: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
320 repo.dirstate.remove(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
321 repo.dirstate.copy(f, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
322 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
323 repo.dirstate.copy(f2, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
324 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
325 repo.dirstate.normal(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
326 if f: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
327 repo.dirstate.forget(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
328 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
329 def update(repo, node, branchmerge, force, partial): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
330 """ |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
331 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
|
332 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
333 branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
334 force = whether to force branch merging or file overwriting |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
335 partial = a function to filter file lists (dirstate not updated) |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
336 """ |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
337 |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
338 wlock = repo.wlock() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
339 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
340 wc = repo.workingctx() |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
341 if node is None: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
342 # tip of current branch |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
343 try: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
344 node = repo.branchtags()[wc.branch()] |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
345 except KeyError: |
5570
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
346 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
|
347 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
|
348 else: |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
349 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
|
350 overwrite = force and not branchmerge |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
351 pl = wc.parents() |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
352 p1, p2 = pl[0], repo.changectx(node) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
353 pa = p1.ancestor(p2) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
354 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
|
355 fastforward = False |
3314 | 356 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
357 ### check phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
358 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
|
359 raise util.Abort(_("outstanding uncommitted merges")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
360 if branchmerge: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
361 if pa == p2: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
362 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
|
363 elif pa == p1: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
364 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
|
365 fastforward = True |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
366 else: |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
367 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
|
368 " or check 'hg heads')")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
369 if not force and (wc.files() or wc.deleted()): |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
370 raise util.Abort(_("outstanding uncommitted changes")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
371 elif not overwrite: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
372 if pa == p1 or pa == p2: # linear |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
373 pass # all good |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
374 elif p1.branch() == p2.branch(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
375 if wc.files() or wc.deleted(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
376 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
|
377 "'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
|
378 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
|
379 "or 'hg update -C')")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
380 elif wc.files() or wc.deleted(): |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
381 raise util.Abort(_("crosses named branches (use " |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
382 "'hg update -C' to discard changes)")) |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
383 else: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
384 # 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
|
385 overwrite = True |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
386 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
387 ### calculate phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
388 action = [] |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
389 if not force: |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
390 _checkunknown(wc, p2) |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
391 if not util.checkfolding(repo.path): |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
392 _checkcollision(p2) |
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
393 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
|
394 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
|
395 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
396 ### apply phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
397 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
|
398 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
|
399 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
400 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
|
401 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
402 stats = applyupdates(repo, action, wc, p2) |
2899
8743188f4d2e
merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents:
2898
diff
changeset
|
403 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
404 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
405 recordupdates(repo, action, branchmerge) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
406 repo.dirstate.setparents(fp1, fp2) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
407 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
|
408 repo.dirstate.setbranch(p2.branch()) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
409 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
3314 | 410 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
411 return stats |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
412 finally: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
413 del wlock |