Mercurial > hg
annotate mercurial/merge.py @ 4739:1da35d1e7ef9
Added full URL to debug output if something doesn't look like an http hg repo.
This way it is easier to debug problems with failing subcommands, like
changegroupsubset due to permission problems, when generally accessing
the repository works fine.
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 29 Jun 2007 11:13:36 +0200 |
parents | dc5920ea12f8 |
children | 8808ea7da86b |
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 |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
8 from node import * |
3891 | 9 from i18n import _ |
4417 | 10 import errno, util, os, tempfile, context |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
11 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
12 def filemerge(repo, fw, fo, wctx, mctx): |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
13 """perform a 3-way merge in the working directory |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
14 |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
15 fw = filename in the working directory |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
16 fo = filename in other parent |
3297
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
17 wctx, mctx = working and merge changecontexts |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
18 """ |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
19 |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
20 def temp(prefix, ctx): |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
21 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
22 (fd, name) = tempfile.mkstemp(prefix=pre) |
4005
656e06eebda7
replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents:
3891
diff
changeset
|
23 data = repo.wwritedata(ctx.path(), ctx.data()) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
24 f = os.fdopen(fd, "wb") |
4005
656e06eebda7
replace filehandle version of wwrite with wwritedata
Matt Mackall <mpm@selenic.com>
parents:
3891
diff
changeset
|
25 f.write(data) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
26 f.close() |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
27 return name |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
28 |
3299
e7abcf3a7c5f
filemerge: use contexts rather than my and other
Matt Mackall <mpm@selenic.com>
parents:
3297
diff
changeset
|
29 fcm = wctx.filectx(fw) |
e7abcf3a7c5f
filemerge: use contexts rather than my and other
Matt Mackall <mpm@selenic.com>
parents:
3297
diff
changeset
|
30 fco = mctx.filectx(fo) |
3311
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
31 |
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
32 if not fco.cmp(fcm.data()): # files identical? |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
33 return None |
3311
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
34 |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
35 fca = fcm.ancestor(fco) |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
36 if not fca: |
3578
3b4e00cba57a
Define and use nullrev (revision of nullid) instead of -1.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3442
diff
changeset
|
37 fca = repo.filectx(fw, fileid=nullrev) |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
38 a = repo.wjoin(fw) |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
39 b = temp("base", fca) |
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
40 c = temp("other", fco) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
41 |
3311
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
42 if fw != fo: |
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
43 repo.ui.status(_("merging %s and %s\n") % (fw, fo)) |
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
44 else: |
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
45 repo.ui.status(_("merging %s\n") % fw) |
966632304dde
merge: shortcircuit filemerge for identical files
Matt Mackall <mpm@selenic.com>
parents:
3309
diff
changeset
|
46 |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca)) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
48 |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge") |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
50 or "hgmerge") |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root, |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
52 environ={'HG_FILE': fw, |
3297
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
53 'HG_MY_NODE': str(wctx.parents()[0]), |
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
54 'HG_OTHER_NODE': str(mctx)}) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
55 if r: |
3211
3fd098e0902d
merge: extend file merge function for renames
Matt Mackall <mpm@selenic.com>
parents:
3169
diff
changeset
|
56 repo.ui.warn(_("merging %s failed!\n") % fw) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
57 |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
58 os.unlink(b) |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
59 os.unlink(c) |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
60 return r |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
61 |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
62 def checkunknown(wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
63 "check for collisions between unknown files and files in mctx" |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
64 man = mctx.manifest() |
3218
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3212
diff
changeset
|
65 for f in wctx.unknown(): |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
66 if f in man: |
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
67 if mctx.filectx(f).cmp(wctx.filectx(f).data()): |
4633
ff7253a0d1da
Cleanup of whitespace, indentation and line continuation.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4623
diff
changeset
|
68 raise util.Abort(_("untracked local file '%s' differs" |
3618
3109f012c305
Clarify untracked file merge message
Matt Mackall <mpm@selenic.com>
parents:
3593
diff
changeset
|
69 " from remote version") % f) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
70 |
3785 | 71 def checkcollision(mctx): |
72 "check for case folding collisions in the destination context" | |
73 folded = {} | |
74 for fn in mctx.manifest(): | |
75 fold = fn.lower() | |
76 if fold in folded: | |
77 raise util.Abort(_("case-folding collision between %s and %s") | |
78 % (fn, folded[fold])) | |
79 folded[fold] = fn | |
80 | |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
81 def forgetremoved(wctx, mctx): |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
82 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
83 Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
84 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
85 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
|
86 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
|
87 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
|
88 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
|
89 manifest. |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
90 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
91 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
92 action = [] |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
93 man = mctx.manifest() |
3218
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3212
diff
changeset
|
94 for f in wctx.deleted() + wctx.removed(): |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
95 if f not in man: |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
96 action.append((f, "f")) |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
97 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
98 return action |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
99 |
3371
8c36b33a27c7
merge: turn followcopies on by default
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
100 def findcopies(repo, m1, m2, ma, limit): |
3153
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
101 """ |
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
102 Find moves and copies between m1 and m2 back to limit linkrev |
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
103 """ |
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
104 |
4400
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
105 def nonoverlap(d1, d2, d3): |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
106 "Return list of elements in d1 not in d2 or d3" |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
107 l = [d for d in d1 if d not in d3 and d not in d2] |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
108 l.sort() |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
109 return l |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
110 |
4397
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
111 def dirname(f): |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
112 s = f.rfind("/") |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
113 if s == -1: |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
114 return "" |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
115 return f[:s] |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
116 |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
117 def dirs(files): |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
118 d = {} |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
119 for f in files: |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
120 f = dirname(f) |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
121 while f not in d: |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
122 d[f] = True |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
123 f = dirname(f) |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
124 return d |
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
125 |
4416
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
126 wctx = repo.workingctx() |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
127 |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
128 def makectx(f, n): |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
129 if len(n) == 20: |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
130 return repo.filectx(f, fileid=n) |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
131 return wctx.filectx(f) |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
132 ctx = util.cachefunc(makectx) |
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
133 |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
134 def findold(fctx): |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
135 "find files that path was copied from, back to linkrev limit" |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
136 old = {} |
4350
8aee687f0214
merge: fix quadratic behavior in find-copies
Matt Mackall <mpm@selenic.com>
parents:
4304
diff
changeset
|
137 seen = {} |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
138 orig = fctx.path() |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
139 visit = [fctx] |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
140 while visit: |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
141 fc = visit.pop() |
4350
8aee687f0214
merge: fix quadratic behavior in find-copies
Matt Mackall <mpm@selenic.com>
parents:
4304
diff
changeset
|
142 s = str(fc) |
8aee687f0214
merge: fix quadratic behavior in find-copies
Matt Mackall <mpm@selenic.com>
parents:
4304
diff
changeset
|
143 if s in seen: |
8aee687f0214
merge: fix quadratic behavior in find-copies
Matt Mackall <mpm@selenic.com>
parents:
4304
diff
changeset
|
144 continue |
8aee687f0214
merge: fix quadratic behavior in find-copies
Matt Mackall <mpm@selenic.com>
parents:
4304
diff
changeset
|
145 seen[s] = 1 |
3875
c0a12e6441a5
Fix copy detection corner case
Matt Mackall <mpm@selenic.com>
parents:
3862
diff
changeset
|
146 if fc.path() != orig and fc.path() not in old: |
c0a12e6441a5
Fix copy detection corner case
Matt Mackall <mpm@selenic.com>
parents:
3862
diff
changeset
|
147 old[fc.path()] = 1 |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
148 if fc.rev() < limit: |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
149 continue |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
150 visit += fc.parents() |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
151 |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
152 old = old.keys() |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
153 old.sort() |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
154 return old |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
155 |
4400
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
156 copy = {} |
84cd52b48f94
merge: reorganize some hunks in findcopies
Matt Mackall <mpm@selenic.com>
parents:
4399
diff
changeset
|
157 fullcopy = {} |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
158 diverge = {} |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
159 |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
160 def checkcopies(c, man): |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
161 '''check possible copies for filectx c''' |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
162 for of in findold(c): |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
163 fullcopy[c.path()] = of # remember for dir rename detection |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
164 if of not in man: # original file not in other manifest? |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
165 if of in ma: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
166 diverge.setdefault(of, []).append(c.path()) |
4304
4787e2b0dd03
merge: fix a bug where copies were ignored
Matt Mackall <mpm@selenic.com>
parents:
4179
diff
changeset
|
167 continue |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
168 c2 = ctx(of, man[of]) |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
169 ca = c.ancestor(c2) |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
170 if not ca: # unrelated? |
4304
4787e2b0dd03
merge: fix a bug where copies were ignored
Matt Mackall <mpm@selenic.com>
parents:
4179
diff
changeset
|
171 continue |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
172 # named changed on only one side? |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
173 if ca.path() == c.path() or ca.path() == c2.path(): |
4416
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
174 if c == ca or c2 == ca: # no merge needed, ignore copy |
4304
4787e2b0dd03
merge: fix a bug where copies were ignored
Matt Mackall <mpm@selenic.com>
parents:
4179
diff
changeset
|
175 continue |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
176 copy[c.path()] = of |
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
177 |
3371
8c36b33a27c7
merge: turn followcopies on by default
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
178 if not repo.ui.configbool("merge", "followcopies", True): |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
179 return {}, {} |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
180 |
3160
1839e6e91c3a
findcopies: shortcut for empty working dir
Matt Mackall <mpm@selenic.com>
parents:
3155
diff
changeset
|
181 # avoid silly behavior for update from empty dir |
3731
b4af5f92e04b
merge: move check for empty ancestor into findcopies
Matt Mackall <mpm@selenic.com>
parents:
3730
diff
changeset
|
182 if not m1 or not m2 or not ma: |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
183 return {}, {} |
3160
1839e6e91c3a
findcopies: shortcut for empty working dir
Matt Mackall <mpm@selenic.com>
parents:
3155
diff
changeset
|
184 |
3371
8c36b33a27c7
merge: turn followcopies on by default
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
185 u1 = nonoverlap(m1, m2, ma) |
8c36b33a27c7
merge: turn followcopies on by default
Matt Mackall <mpm@selenic.com>
parents:
3316
diff
changeset
|
186 u2 = nonoverlap(m2, m1, ma) |
3153
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
187 |
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
188 for f in u1: |
4416
bb1800a7d7e1
merge: fix spurious merges for copies in linear updates
Matt Mackall <mpm@selenic.com>
parents:
4400
diff
changeset
|
189 checkcopies(ctx(f, m1[f]), m2) |
3153
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
190 |
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
191 for f in u2: |
3732
ffe9fef84801
merge: pull findcopies helpers inside, refactor checkpair to checkcopies
Matt Mackall <mpm@selenic.com>
parents:
3731
diff
changeset
|
192 checkcopies(ctx(f, m2[f]), m1) |
3153
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
193 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
194 d2 = {} |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
195 for of, fl in diverge.items(): |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
196 for f in fl: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
197 fo = list(fl) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
198 fo.remove(f) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
199 d2[f] = (of, fo) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
200 #diverge = d2 |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
201 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
202 if not fullcopy or not repo.ui.configbool("merge", "followdirs", True): |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
203 return copy, diverge |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
204 |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
205 # generate a directory move map |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
206 d1, d2 = dirs(m1), dirs(m2) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
207 invalid = {} |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
208 dirmove = {} |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
209 |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
210 # examine each file copy for a potential directory move, which is |
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
211 # when all the files in a directory are moved to a new directory |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
212 for dst, src in fullcopy.items(): |
4397
9fe267f77f56
merge: fix a bug detecting directory moves
Matt Mackall <mpm@selenic.com>
parents:
4396
diff
changeset
|
213 dsrc, ddst = dirname(src), dirname(dst) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
214 if dsrc in invalid: |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
215 # already seen to be uninteresting |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
216 continue |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
217 elif dsrc in d1 and ddst in d1: |
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
218 # directory wasn't entirely moved locally |
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
219 invalid[dsrc] = True |
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
220 elif dsrc in d2 and ddst in d2: |
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
221 # directory wasn't entirely moved remotely |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
222 invalid[dsrc] = True |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
223 elif dsrc in dirmove and dirmove[dsrc] != ddst: |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
224 # files from the same directory moved to two different places |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
225 invalid[dsrc] = True |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
226 else: |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
227 # looks good so far |
4115
c95060a5391a
merge: fix renaming of subdirectories under renamed directories
Matt Mackall <mpm@selenic.com>
parents:
3875
diff
changeset
|
228 dirmove[dsrc + "/"] = ddst + "/" |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
229 |
4398
3b7e284b8f28
merge: expand and simplify the invalid handling for directory moves
Matt Mackall <mpm@selenic.com>
parents:
4397
diff
changeset
|
230 for i in invalid: |
3b7e284b8f28
merge: expand and simplify the invalid handling for directory moves
Matt Mackall <mpm@selenic.com>
parents:
4397
diff
changeset
|
231 if i in dirmove: |
3b7e284b8f28
merge: expand and simplify the invalid handling for directory moves
Matt Mackall <mpm@selenic.com>
parents:
4397
diff
changeset
|
232 del dirmove[i] |
3b7e284b8f28
merge: expand and simplify the invalid handling for directory moves
Matt Mackall <mpm@selenic.com>
parents:
4397
diff
changeset
|
233 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
234 del d1, d2, invalid |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
235 |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
236 if not dirmove: |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
237 return copy, diverge |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
238 |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
239 # check unaccounted nonoverlapping files against directory moves |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
240 for f in u1 + u2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
241 if f not in fullcopy: |
4115
c95060a5391a
merge: fix renaming of subdirectories under renamed directories
Matt Mackall <mpm@selenic.com>
parents:
3875
diff
changeset
|
242 for d in dirmove: |
c95060a5391a
merge: fix renaming of subdirectories under renamed directories
Matt Mackall <mpm@selenic.com>
parents:
3875
diff
changeset
|
243 if f.startswith(d): |
4396
c04c96504a12
merge: clarify the findcopies code
Matt Mackall <mpm@selenic.com>
parents:
4350
diff
changeset
|
244 # new file added in a directory that was moved, move it |
4115
c95060a5391a
merge: fix renaming of subdirectories under renamed directories
Matt Mackall <mpm@selenic.com>
parents:
3875
diff
changeset
|
245 copy[f] = dirmove[d] + f[len(d):] |
c95060a5391a
merge: fix renaming of subdirectories under renamed directories
Matt Mackall <mpm@selenic.com>
parents:
3875
diff
changeset
|
246 break |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
247 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
248 return copy, diverge |
3153
c82ea81d6850
Add core copy detection algorithm
Matt Mackall <mpm@selenic.com>
parents:
3121
diff
changeset
|
249 |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
250 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
|
251 """ |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
252 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
|
253 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
254 overwrite = whether we clobber working files |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
255 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
|
256 """ |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
257 |
3314 | 258 repo.ui.note(_("resolving manifests\n")) |
259 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial))) | |
260 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2)) | |
261 | |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
262 m1 = p1.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
263 m2 = p2.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
264 ma = pa.manifest() |
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
265 backwards = (pa == p2) |
3314 | 266 action = [] |
267 copy = {} | |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
268 diverge = {} |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
269 |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
270 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
|
271 """merge flags""" |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
272 if not f2: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
273 f2 = f |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
274 fa = f |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
275 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2) |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
276 if ((a^b) | (a^c)) ^ a: |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
277 return 'x' |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
278 a, b, c = ma.linkf(fa), m1.linkf(f), m2.linkf(f2) |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
279 if ((a^b) | (a^c)) ^ a: |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
280 return 'l' |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
281 return '' |
3118
5644a05a608c
merge: simplify exec flag handling
Matt Mackall <mpm@selenic.com>
parents:
3117
diff
changeset
|
282 |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
283 def act(msg, m, f, *args): |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
284 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
|
285 action.append((f, m) + args) |
2ef0b3aae186
merge: simplify actions with helper function
Matt Mackall <mpm@selenic.com>
parents:
3120
diff
changeset
|
286 |
3731
b4af5f92e04b
merge: move check for empty ancestor into findcopies
Matt Mackall <mpm@selenic.com>
parents:
3730
diff
changeset
|
287 if not (backwards or overwrite): |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
288 copy, diverge = findcopies(repo, m1, m2, ma, pa.rev()) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
289 |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
290 for of, fl in diverge.items(): |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
291 act("divergent renames", "dr", of, fl) |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
292 |
3730
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
293 copied = dict.fromkeys(copy.values()) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
294 |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
295 # Compare manifests |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
296 for f, n in m1.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
297 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
298 continue |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
299 if f in m2: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
300 # are files different? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
301 if n != m2[f]: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
302 a = ma.get(f, nullid) |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
303 # are both different from the ancestor? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
304 if not overwrite and n != a and m2[f] != a: |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
305 act("versions differ", "m", f, f, f, fmerge(f), False) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
306 # are we clobbering? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
307 # is remote's version newer? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
308 # or are we going back in time and clean? |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
309 elif overwrite or m2[f] != a or (backwards and not n[20:]): |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
310 act("remote is newer", "g", f, m2.flags(f)) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
311 # local is newer, not overwrite, check mode bits |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
312 elif fmerge(f) != m1.flags(f): |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
313 act("update permissions", "e", f, m2.flags(f)) |
3113
d1d1cd5b9484
merge: eliminate confusing queued variable
Matt Mackall <mpm@selenic.com>
parents:
3112
diff
changeset
|
314 # contents same, check mode bits |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
315 elif m1.flags(f) != m2.flags(f): |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
316 if overwrite or fmerge(f) != m1.flags(f): |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
317 act("update permissions", "e", f, m2.flags(f)) |
3730
d377f8d25662
merge: only store one direction of copies in the copy map
Matt Mackall <mpm@selenic.com>
parents:
3729
diff
changeset
|
318 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
|
319 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
320 elif f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
321 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
322 if f2 not in m2: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
323 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
|
324 f, None, f2, m1.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
325 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
|
326 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
|
327 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
|
328 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
|
329 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
|
330 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
|
331 elif f in ma: |
3117
7a635ef25132
merge: simplify tests for local changed/remote deleted
Matt Mackall <mpm@selenic.com>
parents:
3116
diff
changeset
|
332 if n != ma[f] and not overwrite: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
333 if repo.ui.prompt( |
3117
7a635ef25132
merge: simplify tests for local changed/remote deleted
Matt Mackall <mpm@selenic.com>
parents:
3116
diff
changeset
|
334 (_(" local changed %s which remote deleted\n") % f) + |
3119
b1de36a4b4df
merge: simplify prompt code
Matt Mackall <mpm@selenic.com>
parents:
3118
diff
changeset
|
335 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"): |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
336 act("prompt delete", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
337 else: |
3307
f009a6f12a59
merge: swap file and mode args for act()
Matt Mackall <mpm@selenic.com>
parents:
3306
diff
changeset
|
338 act("other deleted", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
339 else: |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
340 # 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
|
341 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
|
342 act("remote deleted", "r", f) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
343 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
344 for f, n in m2.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
345 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
346 continue |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
347 if f in m1: |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
348 continue |
3729
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
349 if f in copied: |
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
350 continue |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
351 if f in copy: |
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
352 f2 = copy[f] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
353 if f2 not in m1: # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
354 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
|
355 None, f, f2, m2.flags(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 f2, f, f, fmerge(f2, f, f2), True) |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
362 elif f in ma: |
3116
920f54a2249e
merge: more simplification of m2 manifest scanning
Matt Mackall <mpm@selenic.com>
parents:
3115
diff
changeset
|
363 if overwrite or backwards: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
364 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
|
365 elif n != ma[f]: |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
366 if repo.ui.prompt( |
3116
920f54a2249e
merge: more simplification of m2 manifest scanning
Matt Mackall <mpm@selenic.com>
parents:
3115
diff
changeset
|
367 (_("remote changed %s which local deleted\n") % f) + |
3119
b1de36a4b4df
merge: simplify prompt code
Matt Mackall <mpm@selenic.com>
parents:
3118
diff
changeset
|
368 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"): |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
369 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
|
370 else: |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
371 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
|
372 |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
373 return action |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
374 |
3297
69b9471f26bb
merge: pass contexts to applyupdates
Matt Mackall <mpm@selenic.com>
parents:
3296
diff
changeset
|
375 def applyupdates(repo, action, wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
376 "apply the merge action list to the working directory" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
377 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
378 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
|
379 action.sort() |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
380 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
381 f, m = a[:2] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
382 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
|
383 continue |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
384 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
385 repo.ui.note(_("removing %s\n") % f) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
386 util.audit_path(f) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
387 try: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
388 util.unlink(repo.wjoin(f)) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
389 except OSError, inst: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
390 if inst.errno != errno.ENOENT: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
391 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
|
392 (f, inst.strerror)) |
3673
eb0b4a2d70a9
white space and line break cleanups
Thomas Arendsen Hein <thomas@intevation.de>
parents:
3618
diff
changeset
|
393 removed += 1 |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
394 elif m == "m": # merge |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
395 f2, fd, flags, move = a[2:] |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
396 r = filemerge(repo, f, f2, wctx, mctx) |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
397 if r > 0: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
398 unresolved += 1 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
399 else: |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
400 if r is None: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
401 updated += 1 |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
402 else: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
403 merged += 1 |
4682
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
404 if f != fd: |
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
405 repo.ui.debug(_("copying %s to %s\n") % (f, fd)) |
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
406 repo.wwrite(fd, repo.wread(f), flags) |
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
407 if move: |
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
408 repo.ui.debug(_("removing %s\n") % f) |
dc5920ea12f8
merge: fix small bug with a failed merge across a rename
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4674
diff
changeset
|
409 os.unlink(repo.wjoin(f)) |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
410 util.set_exec(repo.wjoin(fd), "x" in flags) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
411 elif m == "g": # get |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
412 flags = a[2] |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
413 repo.ui.note(_("getting %s\n") % f) |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
414 t = mctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
415 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
|
416 updated += 1 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
417 elif m == "d": # directory rename |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
418 f2, fd, flags = a[2:] |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
419 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
420 repo.ui.note(_("moving %s to %s\n") % (f, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
421 t = wctx.filectx(f).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
422 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
423 util.unlink(repo.wjoin(f)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
424 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
425 repo.ui.note(_("getting %s to %s\n") % (f2, fd)) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
426 t = mctx.filectx(f2).data() |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
427 repo.wwrite(fd, t, flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
428 updated += 1 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
429 elif m == "dr": # divergent renames |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
430 fl = a[2] |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
431 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
|
432 for nf in fl: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
433 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
|
434 elif m == "e": # exec |
4007
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
435 flags = a[2] |
20da40cc1c73
symlinks: minimal support for symlinks in merge/update
Matt Mackall <mpm@selenic.com>
parents:
4006
diff
changeset
|
436 util.set_exec(repo.wjoin(f), flags) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
437 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
438 return updated, merged, removed, unresolved |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
439 |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
440 def recordupdates(repo, action, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
441 "record merge actions to the dirstate" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
442 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
443 for a in action: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
444 f, m = a[:2] |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
445 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
446 if branchmerge: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
447 repo.dirstate.update([f], 'r') |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
448 else: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
449 repo.dirstate.forget([f]) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
450 elif m == "f": # forget |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
451 repo.dirstate.forget([f]) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
452 elif m == "g": # get |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
453 if branchmerge: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
454 repo.dirstate.update([f], 'n', st_mtime=-1) |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
455 else: |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
456 repo.dirstate.update([f], 'n') |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
457 elif m == "m": # merge |
3303
488d3062d225
merge: eliminate nodes from action list
Matt Mackall <mpm@selenic.com>
parents:
3299
diff
changeset
|
458 f2, fd, flag, move = a[2:] |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
459 if branchmerge: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
460 # 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
|
461 # so that we properly record the merger later |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
462 repo.dirstate.update([fd], 'm') |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
463 if f != f2: # copy/rename |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
464 if move: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
465 repo.dirstate.update([f], 'r') |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
466 if f != fd: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
467 repo.dirstate.copy(f, fd) |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
468 else: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
469 repo.dirstate.copy(f2, fd) |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
470 else: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
471 # We've update-merged a locally modified file, so |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
472 # we set the dirstate to emulate a normal checkout |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
473 # 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
|
474 # merge will appear as a normal local file |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
475 # modification. |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
476 repo.dirstate.update([fd], 'n', st_size=-1, st_mtime=-1) |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
477 if move: |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
478 repo.dirstate.forget([f]) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
479 elif m == "d": # directory rename |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
480 f2, fd, flag = a[2:] |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
481 if branchmerge: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
482 repo.dirstate.update([fd], 'a') |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
483 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
484 repo.dirstate.update([f], 'r') |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
485 repo.dirstate.copy(f, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
486 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
487 repo.dirstate.copy(f2, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
488 else: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
489 repo.dirstate.update([fd], 'n') |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
490 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
491 repo.dirstate.forget([f]) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
492 |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3315
diff
changeset
|
493 def update(repo, node, branchmerge, force, partial, wlock): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
494 """ |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
495 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
|
496 |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
497 branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
498 force = whether to force branch merging or file overwriting |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
499 partial = a function to filter file lists (dirstate not updated) |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
500 wlock = working dir lock, if already held |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
501 """ |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
502 |
2812
3aeab7bb5adc
Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents:
2811
diff
changeset
|
503 if not wlock: |
3aeab7bb5adc
Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents:
2811
diff
changeset
|
504 wlock = repo.wlock() |
3aeab7bb5adc
Refactor update locking slightly
Matt Mackall <mpm@selenic.com>
parents:
2811
diff
changeset
|
505 |
4182 | 506 wc = repo.workingctx() |
507 if node is None: | |
508 # tip of current branch | |
4232
0d51eb296fb9
Merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4209
diff
changeset
|
509 try: |
0d51eb296fb9
Merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4209
diff
changeset
|
510 node = repo.branchtags()[wc.branch()] |
0d51eb296fb9
Merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4209
diff
changeset
|
511 except KeyError: |
0d51eb296fb9
Merge with crew-stable
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
4209
diff
changeset
|
512 raise util.Abort(_("branch %s not found") % wc.branch()) |
3314 | 513 overwrite = force and not branchmerge |
514 forcemerge = force and branchmerge | |
3218
8d4855fd9d7b
merge: use new working context object in update
Matt Mackall <mpm@selenic.com>
parents:
3212
diff
changeset
|
515 pl = wc.parents() |
3314 | 516 p1, p2 = pl[0], repo.changectx(node) |
517 pa = p1.ancestor(p2) | |
518 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) | |
4410
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
519 fastforward = False |
3314 | 520 |
521 ### check phase | |
3167
e67c22bc8bba
merge: use repo.parents and parent contexts in update
Matt Mackall <mpm@selenic.com>
parents:
3162
diff
changeset
|
522 if not overwrite and len(pl) > 1: |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
523 raise util.Abort(_("outstanding uncommitted merges")) |
3314 | 524 if pa == p1 or pa == p2: # is there a linear path from p1 to p2? |
3110
40e777bda455
merge: remove linear variable
Matt Mackall <mpm@selenic.com>
parents:
3109
diff
changeset
|
525 if branchmerge: |
4410
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
526 if p1.branch() != p2.branch(): |
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
527 fastforward = True |
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
528 else: |
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
529 raise util.Abort(_("there is nothing to merge, just use " |
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
530 "'hg update' or look at 'hg heads'")) |
3592
fffc8a733bf9
Backed out changeset 41989e55fa375de4376e7e64b17e38312e8ec140
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3580
diff
changeset
|
531 elif not (overwrite or branchmerge): |
fffc8a733bf9
Backed out changeset 41989e55fa375de4376e7e64b17e38312e8ec140
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3580
diff
changeset
|
532 raise util.Abort(_("update spans branches, use 'hg merge' " |
fffc8a733bf9
Backed out changeset 41989e55fa375de4376e7e64b17e38312e8ec140
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3580
diff
changeset
|
533 "or 'hg update -C' to lose changes")) |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
534 if branchmerge and not forcemerge: |
3581
be61bd32046c
use workingcontext.files() to detect if the repo is unclean
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3580
diff
changeset
|
535 if wc.files(): |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
536 raise util.Abort(_("outstanding uncommitted changes")) |
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
537 |
3314 | 538 ### calculate phase |
3100
87ea5a71f7b9
merge: convert actions to list
Matt Mackall <mpm@selenic.com>
parents:
2981
diff
changeset
|
539 action = [] |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
540 if not force: |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
541 checkunknown(wc, p2) |
3785 | 542 if not util.checkfolding(repo.path): |
543 checkcollision(p2) | |
3110
40e777bda455
merge: remove linear variable
Matt Mackall <mpm@selenic.com>
parents:
3109
diff
changeset
|
544 if not branchmerge: |
3312
c5075ad5e3e9
merge: use contexts in checkunknown and forgetremoved
Matt Mackall <mpm@selenic.com>
parents:
3311
diff
changeset
|
545 action += forgetremoved(wc, p2) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
546 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
|
547 |
2897
dd032b0f02ac
merge: move forgets to the apply stage
Matt Mackall <mpm@selenic.com>
parents:
2896
diff
changeset
|
548 ### apply phase |
3314 | 549 if not branchmerge: # just jump to the new rev |
550 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, '' | |
3296
20087b4bc6f9
merge: don't call hooks for revert
Matt Mackall <mpm@selenic.com>
parents:
3295
diff
changeset
|
551 if not partial: |
20087b4bc6f9
merge: don't call hooks for revert
Matt Mackall <mpm@selenic.com>
parents:
3295
diff
changeset
|
552 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
|
553 |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3315
diff
changeset
|
554 stats = applyupdates(repo, action, wc, p2) |
2899
8743188f4d2e
merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents:
2898
diff
changeset
|
555 |
2811
1ea086bc2086
Merge: combine choose and moddirstate to partial
Matt Mackall <mpm@selenic.com>
parents:
2810
diff
changeset
|
556 if not partial: |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
557 recordupdates(repo, action, branchmerge) |
3314 | 558 repo.dirstate.setparents(fp1, fp2) |
4410
bbc97d419b16
Add fast-forward branch merging
Brendan Cully <brendan@kublai.com>
parents:
4404
diff
changeset
|
559 if not branchmerge and not fastforward: |
4179
7e1c8a565a4f
Move branch read/write to dirstate where it belongs
Matt Mackall <mpm@selenic.com>
parents:
4115
diff
changeset
|
560 repo.dirstate.setbranch(p2.branch()) |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3315
diff
changeset
|
561 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
3314 | 562 |
3316
39fd6e82ea38
merge: pull user messages out to hg.py
Matt Mackall <mpm@selenic.com>
parents:
3315
diff
changeset
|
563 return stats |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
564 |