Mercurial > public > mercurial-scm > hg
annotate mercurial/merge.py @ 18650:de0bd4bfc6d7
merge: run _forgetremoved after manifestmerge
_forgetremoved can trigger manifest construction, but we only want it to
happen after manifestmerge, so that our attempt to read the manifests in the
right order in an upcoming patch actually works.
author | Siddharth Agarwal <sid0@fb.com> |
---|---|
date | Sun, 10 Feb 2013 12:16:46 +0000 |
parents | a8648f32b8ed |
children | e556659340f0 |
rev | line source |
---|---|
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
1 # merge.py - directory-level update/merge handling for Mercurial |
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
2 # |
4635
63b9d2deed48
Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4633
diff
changeset
|
3 # Copyright 2006, 2007 Matt Mackall <mpm@selenic.com> |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8152
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
7 |
6518 | 8 from node import nullid, nullrev, hex, bin |
3891 | 9 from i18n import _ |
18639
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
10 import error, util, filemerge, copies, subrepo, worker |
8312
b87a50b7125c
separate import lines from mercurial and general python modules
Simon Heimberg <simohe@besonet.ch>
parents:
8259
diff
changeset
|
11 import errno, os, shutil |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
12 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
13 class mergestate(object): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
14 '''track 3-way merge state of individual files''' |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
15 def __init__(self, repo): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
16 self._repo = repo |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
17 self._dirty = False |
6518 | 18 self._read() |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
19 def reset(self, node=None): |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
20 self._state = {} |
7848
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
21 if node: |
89e05c02a4af
resolve: move reset to localrepo.commit
Matt Mackall <mpm@selenic.com>
parents:
7768
diff
changeset
|
22 self._local = node |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
23 shutil.rmtree(self._repo.join("merge"), True) |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
24 self._dirty = False |
6518 | 25 def _read(self): |
26 self._state = {} | |
27 try: | |
28 f = self._repo.opener("merge/state") | |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
29 for i, l in enumerate(f): |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
30 if i == 0: |
11451
51021f4c80b5
resolve: do not crash on empty mergestate
Martin Geisler <mg@lazybytes.net>
parents:
11417
diff
changeset
|
31 self._local = bin(l[:-1]) |
6530
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
32 else: |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
33 bits = l[:-1].split("\0") |
4b92591c69a7
merge: replace readline() call, missing from posixfile_nt
Patrick Mezard <pmezard@gmail.com>
parents:
6518
diff
changeset
|
34 self._state[bits[0]] = bits[1:] |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
35 f.close() |
6518 | 36 except IOError, err: |
37 if err.errno != errno.ENOENT: | |
38 raise | |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
39 self._dirty = False |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
40 def commit(self): |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
41 if self._dirty: |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
42 f = self._repo.opener("merge/state", "w") |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
43 f.write(hex(self._local) + "\n") |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
44 for d, v in self._state.iteritems(): |
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
45 f.write("\0".join([d] + v) + "\n") |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
46 f.close() |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
47 self._dirty = False |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
48 def add(self, fcl, fco, fca, fd): |
6517
fcfb6a0a0a84
python-2.6: use sha wrapper from util for new merge code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6512
diff
changeset
|
49 hash = util.sha1(fcl.path()).hexdigest() |
14168
135e244776f0
prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
14064
diff
changeset
|
50 self._repo.opener.write("merge/" + hash, fcl.data()) |
6518 | 51 self._state[fd] = ['u', hash, fcl.path(), fca.path(), |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
52 hex(fca.filenode()), fco.path(), fcl.flags()] |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
53 self._dirty = True |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
54 def __contains__(self, dfile): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
55 return dfile in self._state |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
56 def __getitem__(self, dfile): |
6518 | 57 return self._state[dfile][0] |
58 def __iter__(self): | |
59 l = self._state.keys() | |
60 l.sort() | |
61 for f in l: | |
62 yield f | |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
63 def mark(self, dfile, state): |
6518 | 64 self._state[dfile][0] = state |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
65 self._dirty = True |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
66 def resolve(self, dfile, wctx, octx): |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
67 if self[dfile] == 'r': |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
68 return 0 |
6518 | 69 state, hash, lfile, afile, anode, ofile, flags = self._state[dfile] |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
70 fcd = wctx[dfile] |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
71 fco = octx[ofile] |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
72 fca = self._repo.filectx(afile, fileid=anode) |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
73 # "premerge" x flags |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
74 flo = fco.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
75 fla = fca.flags() |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
76 if 'x' in flags + flo + fla and 'l' not in flags + flo + fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
77 if fca.node() == nullid: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
78 self._repo.ui.warn(_('warning: cannot merge flags for %s\n') % |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
79 afile) |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
80 elif flags == fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
81 flags = flo |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
82 # restore local |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
83 f = self._repo.opener("merge/" + hash) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
84 self._repo.wwrite(dfile, f.read(), flags) |
13400
14f3795a5ed7
explicitly close files
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
13323
diff
changeset
|
85 f.close() |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
86 r = filemerge.filemerge(self._repo, self._local, lfile, fcd, fco, fca) |
13536
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
87 if r is None: |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
88 # no real conflict |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
89 del self._state[dfile] |
fac040b7e822
merge: drop resolve state for mergers with identical contents (issue2680)
Matt Mackall <mpm@selenic.com>
parents:
13437
diff
changeset
|
90 elif not r: |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
91 self.mark(dfile, 'r') |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
92 return r |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
93 |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
94 def _checkunknownfile(repo, wctx, mctx, f): |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
95 return (not repo.dirstate._ignore(f) |
16534
11212babc690
merge: check for untracked files more precisely (issue3400)
Matt Mackall <mpm@selenic.com>
parents:
16492
diff
changeset
|
96 and os.path.isfile(repo.wjoin(f)) |
16284
2b0a406d3043
merge: fix unknown file merge detection for case-folding systems
Matt Mackall <mpm@selenic.com>
parents:
16261
diff
changeset
|
97 and repo.dirstate.normalize(f) not in repo.dirstate |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
98 and mctx[f].cmp(wctx[f])) |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
99 |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
100 def _checkunknown(repo, wctx, mctx): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
101 "check for collisions between unknown files and files in mctx" |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
102 |
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
103 error = False |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
104 for f in mctx: |
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
105 if f not in wctx and _checkunknownfile(repo, wctx, mctx, f): |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
106 error = True |
16093
7e30f5f2285f
merge: refactor unknown file conflict checking
Matt Mackall <mpm@selenic.com>
parents:
16092
diff
changeset
|
107 wctx._repo.ui.warn(_("%s: untracked file differs\n") % f) |
15894
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
108 if error: |
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
109 raise util.Abort(_("untracked files in working directory differ " |
44fa047cef57
merge: report all files in _checkunknown
Jordi Guti?rrez Hermoso <jordigh@octave.org>
parents:
15774
diff
changeset
|
110 "from files in requested revision")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
111 |
17889
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
112 def _remains(f, m, ma, workingctx=False): |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
113 """check whether specified file remains after merge. |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
114 |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
115 It is assumed that specified file is not contained in the manifest |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
116 of the other context. |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
117 """ |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
118 if f in ma: |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
119 n = m[f] |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
120 if n != ma[f]: |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
121 return True # because it is changed locally |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
122 # even though it doesn't remain, if "remote deleted" is |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
123 # chosen in manifestmerge() |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
124 elif workingctx and n[20:] == "a": |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
125 return True # because it is added locally (linear merge specific) |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
126 else: |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
127 return False # because it is removed remotely |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
128 else: |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
129 return True # because it is added locally |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
130 |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
131 def _checkcollision(mctx, extractxs): |
3785 | 132 "check for case folding collisions in the destination context" |
133 folded = {} | |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
134 for fn in mctx: |
15637
7f01ad702405
icasefs: use util.normcase() instead of str.lower() or os.path.normpath()
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15538
diff
changeset
|
135 fold = util.normcase(fn) |
3785 | 136 if fold in folded: |
137 raise util.Abort(_("case-folding collision between %s and %s") | |
138 % (fn, folded[fold])) | |
139 folded[fold] = fn | |
140 | |
17889
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
141 if extractxs: |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
142 wctx, actx = extractxs |
16478
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
143 # class to delay looking up copy mapping |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
144 class pathcopies(object): |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
145 @util.propertycache |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
146 def map(self): |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
147 # {dst@mctx: src@wctx} copy mapping |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
148 return copies.pathcopies(wctx, mctx) |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
149 pc = pathcopies() |
cbf2ea2f5ca1
icasefs: make case-folding collision detection as rename aware (issue3370)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16284
diff
changeset
|
150 |
15673
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
151 for fn in wctx: |
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
152 fold = util.normcase(fn) |
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
153 mfn = folded.get(fold, None) |
17889
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
154 if (mfn and mfn != fn and pc.map.get(mfn) != fn and |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
155 _remains(fn, wctx.manifest(), actx.manifest(), True) and |
ce7bc04d863b
icasefs: make case-folding collision detection as deletion aware (issue3648)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
16794
diff
changeset
|
156 _remains(mfn, mctx.manifest(), actx.manifest())): |
15673
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
157 raise util.Abort(_("case-folding collision between %s and %s") |
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
158 % (mfn, fn)) |
d550168f11ce
merge: check filename case collision between changesets for branch merging
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15637
diff
changeset
|
159 |
6269
ffdf70e74623
merge: privatize some functions, unnest some others
Matt Mackall <mpm@selenic.com>
parents:
6268
diff
changeset
|
160 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
|
161 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
162 Forget removed files |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
163 |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 manifest. |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
169 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
170 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
|
171 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
|
172 as removed. |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
173 """ |
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
174 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
175 actions = [] |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
176 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
|
177 for f in wctx.deleted(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
178 if f not in mctx: |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
179 actions.append((f, state, None, "forget deleted")) |
6242
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
180 |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
181 if not branchmerge: |
a375ffc2aa1b
merge: fix handling of deleted files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
6211
diff
changeset
|
182 for f in wctx.removed(): |
6272
dd9bd227ae9a
merge: simplify some helpers
Matt Mackall <mpm@selenic.com>
parents:
6271
diff
changeset
|
183 if f not in mctx: |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
184 actions.append((f, "f", None, "forget removed")) |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
185 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
186 return actions |
3107
3bd05ad67f45
merge: pull manifest checks and updates into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3106
diff
changeset
|
187 |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
188 def manifestmerge(repo, wctx, p2, pa, branchmerge, force, partial): |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
189 """ |
11817
d12fe809e1ee
merge: fix typo in docstring
Alecs King <alecsk@gmail.com>
parents:
11759
diff
changeset
|
190 Merge p1 and p2 with ancestor pa and generate merge action list |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
191 |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
192 branchmerge and force are as passed in to update |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
193 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
|
194 """ |
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
195 |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
196 overwrite = force and not branchmerge |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
197 actions, copy, movewithdir = [], {}, {} |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
198 |
8749
69caf50da4a0
merge: refactor some initialization, drop backwards var
Matt Mackall <mpm@selenic.com>
parents:
8748
diff
changeset
|
199 if overwrite: |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
200 pa = wctx |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
201 elif pa == p2: # backwards |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
202 pa = wctx.p1() |
18612
0b6e6eacc939
merge: don't call copies.mergecopies unless we need to
Bryan O'Sullivan <bryano@fb.com>
parents:
18611
diff
changeset
|
203 elif not branchmerge and not wctx.dirty(missing=True): |
0b6e6eacc939
merge: don't call copies.mergecopies unless we need to
Bryan O'Sullivan <bryano@fb.com>
parents:
18611
diff
changeset
|
204 pass |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
205 elif pa and repo.ui.configbool("merge", "followcopies", True): |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
206 ret = copies.mergecopies(repo, wctx, p2, pa) |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
207 copy, movewithdir, diverge, renamedelete = ret |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
208 for of, fl in diverge.iteritems(): |
18544 | 209 actions.append((of, "dr", (fl,), "divergent renames")) |
16794
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
210 for of, fl in renamedelete.iteritems(): |
18544 | 211 actions.append((of, "rd", (fl,), "rename and delete")) |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
212 |
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
213 repo.ui.note(_("resolving manifests\n")) |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
214 repo.ui.debug(" branchmerge: %s, force: %s, partial: %s\n" |
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
215 % (bool(branchmerge), bool(force), bool(partial))) |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
216 repo.ui.debug(" ancestor: %s, local: %s, remote: %s\n" % (pa, wctx, p2)) |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
217 |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
218 m1, m2, ma = wctx.manifest(), p2.manifest(), pa.manifest() |
8753
af5f099d932b
merge: refactor manifestmerge init to better report effective ancestor
Matt Mackall <mpm@selenic.com>
parents:
8752
diff
changeset
|
219 copied = set(copy.values()) |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
220 copied.update(movewithdir.values()) |
3295
72d1e521da77
merge: use contexts for manifestmerge
Matt Mackall <mpm@selenic.com>
parents:
3292
diff
changeset
|
221 |
11470
34e33d50c26b
subrepo: correctly handle update -C with modified subrepos (issue2022)
Matt Mackall <mpm@selenic.com>
parents:
11466
diff
changeset
|
222 if '.hgsubstate' in m1: |
9783
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
223 # check whether sub state is modified |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
224 for s in sorted(wctx.substate): |
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
225 if wctx.sub(s).dirty(): |
9783
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
226 m1['.hgsubstate'] += "+" |
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
227 break |
ee00ef6f9be7
submerge: properly deal with overwrites
Matt Mackall <mpm@selenic.com>
parents:
9780
diff
changeset
|
228 |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
229 aborts, prompts = [], [] |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
230 # Compare manifests |
18542
46be5c9dac91
merge: backout manifest sorting and workarounds for cost of it
Mads Kiilerich <madski@unity3d.com>
parents:
18541
diff
changeset
|
231 for f, n in m1.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
232 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
233 continue |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
234 if f in m2: |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
235 n2 = m2[f] |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
236 fl1, fl2, fla = m1.flags(f), m2.flags(f), ma.flags(f) |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
237 nol = 'l' not in fl1 + fl2 + fla |
8752
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
238 a = ma.get(f, nullid) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
239 if n == n2 and fl1 == fl2: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
240 pass # same - keep local |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
241 elif n2 == a and fl2 == fla: |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
242 pass # remote unchanged - keep local |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
243 elif n == a and fl1 == fla: # local unchanged - use remote |
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
244 if n == n2: # optimization: keep local content |
18544 | 245 actions.append((f, "e", (fl2,), "update permissions")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
246 else: |
18544 | 247 actions.append((f, "g", (fl2,), "remote is newer")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
248 elif nol and n2 == a: # remote only changed 'x' |
18544 | 249 actions.append((f, "e", (fl2,), "update permissions")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
250 elif nol and n == a: # local only changed 'x' |
18544 | 251 actions.append((f, "g", (fl1,), "remote is newer")) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
252 else: # both changed something |
18544 | 253 actions.append((f, "m", (f, f, False), "versions differ")) |
8752
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
254 elif f in copied: # files we'll deal with on m2 side |
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
255 pass |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
256 elif f in movewithdir: # directory rename |
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
257 f2 = movewithdir[f] |
18544 | 258 actions.append((f, "d", (None, f2, m1.flags(f)), |
259 "remote renamed directory to " + f2)) | |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
260 elif f in copy: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
261 f2 = copy[f] |
18544 | 262 actions.append((f, "m", (f2, f, False), |
263 "local copied/moved to " + f2)) | |
8744
6b675c781c6d
merge: simplify 'other deleted' case
Matt Mackall <mpm@selenic.com>
parents:
8743
diff
changeset
|
264 elif f in ma: # clean, a different, no remote |
8739
226f1005133c
merge: drop an overwrite test
Matt Mackall <mpm@selenic.com>
parents:
8738
diff
changeset
|
265 if n != ma[f]: |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
266 prompts.append((f, "cd")) # prompt changed/deleted |
8751
e8d80e0835c7
merge: make locally-added file test more correct
Matt Mackall <mpm@selenic.com>
parents:
8750
diff
changeset
|
267 elif n[20:] == "a": # added, no remote |
18544 | 268 actions.append((f, "f", None, "remote deleted")) |
16094
0776a6cababe
merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents:
16093
diff
changeset
|
269 else: |
18544 | 270 actions.append((f, "r", None, "other deleted")) |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
271 |
18542
46be5c9dac91
merge: backout manifest sorting and workarounds for cost of it
Mads Kiilerich <madski@unity3d.com>
parents:
18541
diff
changeset
|
272 for f, n in m2.iteritems(): |
3248
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
273 if partial and not partial(f): |
751840e739a1
merge: reduce manifest copying
Matt Mackall <mpm@selenic.com>
parents:
3247
diff
changeset
|
274 continue |
8752
f177bdab261b
merge: simplify file revision comparison logic
Matt Mackall <mpm@selenic.com>
parents:
8751
diff
changeset
|
275 if f in m1 or f in copied: # files already visited |
3729
581d20773326
merge: add copied hash to simplify copy logic
Matt Mackall <mpm@selenic.com>
parents:
3728
diff
changeset
|
276 continue |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
277 if f in movewithdir: |
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
278 f2 = movewithdir[f] |
18544 | 279 actions.append((None, "d", (f, f2, m2.flags(f)), |
280 "local renamed directory to " + f2)) | |
18134
6c35b53cd28b
copies: separate moves via directory renames from explicit copies
Siddharth Agarwal <sid0@fb.com>
parents:
18042
diff
changeset
|
281 elif f in copy: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
282 f2 = copy[f] |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
283 if f2 in m2: |
18544 | 284 actions.append((f2, "m", (f, f, False), |
285 "remote copied to " + f)) | |
18339
aadefcee1f5e
merge: remove "case" comments
Mads Kiilerich <mads@kiilerich.com>
parents:
18338
diff
changeset
|
286 else: |
18544 | 287 actions.append((f2, "m", (f, f, True), |
288 "remote moved to " + f)) | |
8741
e592180ba435
merge: reorder remote creation tests
Matt Mackall <mpm@selenic.com>
parents:
8740
diff
changeset
|
289 elif f not in ma: |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
290 # local unknown, remote created: the logic is described by the |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
291 # following table: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
292 # |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
293 # force branchmerge different | action |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
294 # n * n | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
295 # n * y | abort |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
296 # y n * | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
297 # y y n | get |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
298 # y y y | merge |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
299 # |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
300 # Checking whether the files are different is expensive, so we |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
301 # don't do that when we can avoid it. |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
302 if force and not branchmerge: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
303 actions.append((f, "g", (m2.flags(f),), "remote created")) |
16094
0776a6cababe
merge: don't use unknown()
Matt Mackall <mpm@selenic.com>
parents:
16093
diff
changeset
|
304 else: |
18611
18c2184c27dc
merge: rename p1 to wctx in manifestmerge
Bryan O'Sullivan <bryano@fb.com>
parents:
18606
diff
changeset
|
305 different = _checkunknownfile(repo, wctx, p2, f) |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
306 if force and branchmerge and different: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
307 actions.append((f, "m", (f, f, False), |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
308 "remote differs from untracked local")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
309 elif not force and different: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
310 aborts.append((f, "ud")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
311 else: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
312 actions.append((f, "g", (m2.flags(f),), "remote created")) |
8741
e592180ba435
merge: reorder remote creation tests
Matt Mackall <mpm@selenic.com>
parents:
8740
diff
changeset
|
313 elif n != ma[f]: |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
314 prompts.append((f, "dc")) # prompt deleted/changed |
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
315 |
18606
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
316 for f, m in sorted(aborts): |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
317 if m == "ud": |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
318 repo.ui.warn(_("%s: untracked file differs\n") % f) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
319 else: assert False, m |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
320 if aborts: |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
321 raise util.Abort(_("untracked files in working directory differ " |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
322 "from files in requested revision")) |
95773237df7f
manifestmerge: handle abort on local unknown, remote created files
Siddharth Agarwal <sid0@fb.com>
parents:
18605
diff
changeset
|
323 |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
324 for f, m in sorted(prompts): |
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
325 if m == "cd": |
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
326 if repo.ui.promptchoice( |
18543
c8ba98bf0e71
merge: don't indent "local changed %s which remote deleted" prompt
Mads Kiilerich <madski@unity3d.com>
parents:
18542
diff
changeset
|
327 _("local changed %s which remote deleted\n" |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
328 "use (c)hanged version or (d)elete?") % f, |
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
329 (_("&Changed"), _("&Delete")), 0): |
18544 | 330 actions.append((f, "r", None, "prompt delete")) |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
331 else: |
18544 | 332 actions.append((f, "a", None, "prompt keep")) |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
333 elif m == "dc": |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
9030
diff
changeset
|
334 if repo.ui.promptchoice( |
8741
e592180ba435
merge: reorder remote creation tests
Matt Mackall <mpm@selenic.com>
parents:
8740
diff
changeset
|
335 _("remote changed %s which local deleted\n" |
e592180ba435
merge: reorder remote creation tests
Matt Mackall <mpm@selenic.com>
parents:
8740
diff
changeset
|
336 "use (c)hanged version or leave (d)eleted?") % f, |
9048
86b4a9b0ddda
ui: extract choice from prompt
Simon Heimberg <simohe@besonet.ch>
parents:
9030
diff
changeset
|
337 (_("&Changed"), _("&Deleted")), 0) == 0: |
18544 | 338 actions.append((f, "g", (m2.flags(f),), "prompt recreating")) |
18539
cf25e4efd685
merge: delay prompts a bit and show them in (extra) sorted order
Mads Kiilerich <madski@unity3d.com>
parents:
18505
diff
changeset
|
339 else: assert False, m |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
340 return actions |
3105
7c7469d41ade
merge: pull manifest comparison out into separate function
Matt Mackall <mpm@selenic.com>
parents:
3104
diff
changeset
|
341 |
8366
0bf0045000b5
some modernization cleanups, forward compatibility
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8312
diff
changeset
|
342 def actionkey(a): |
18329
eb6ca96f4dd0
merge: consistently use "x" instead of 'x' for internal action types
Mads Kiilerich <mads@kiilerich.com>
parents:
18328
diff
changeset
|
343 return a[1] == "r" and -1 or 0, a |
6805
482581431dcd
Sort removes first when applying updates (fixes issues 750 and 912)
Paul Moore <p.f.moore@gmail.com>
parents:
6762
diff
changeset
|
344 |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
345 def getremove(repo, mctx, overwrite, args): |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
346 """apply usually-non-interactive updates to the working directory |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
347 |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
348 mctx is the context to be merged into the working copy |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
349 |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
350 yields tuples for progress updates |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
351 """ |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
352 verbose = repo.ui.verbose |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
353 unlink = util.unlinkpath |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
354 wjoin = repo.wjoin |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
355 fctx = mctx.filectx |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
356 wwrite = repo.wwrite |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
357 audit = repo.wopener.audit |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
358 i = 0 |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
359 for arg in args: |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
360 f = arg[0] |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
361 if arg[1] == 'r': |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
362 if verbose: |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
363 repo.ui.note(_("removing %s\n") % f) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
364 audit(f) |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
365 try: |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
366 unlink(wjoin(f), ignoremissing=True) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
367 except OSError, inst: |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
368 repo.ui.warn(_("update failed to remove %s: %s!\n") % |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
369 (f, inst.strerror)) |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
370 else: |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
371 if verbose: |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
372 repo.ui.note(_("getting %s\n") % f) |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
373 wwrite(f, fctx(f).data(), arg[2][0]) |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
374 if i == 100: |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
375 yield i, f |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
376 i = 0 |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
377 i += 1 |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
378 if i > 0: |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
379 yield i, f |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
380 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
381 def applyupdates(repo, actions, wctx, mctx, actx, overwrite): |
11454
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
382 """apply the merge action list to the working directory |
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
383 |
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
384 wctx is the working copy context |
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
385 mctx is the context to be merged into the working copy |
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
386 actx is the context of the common ancestor |
13162
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
387 |
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
388 Return a tuple of counts (updated, merged, removed, unresolved) that |
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
389 describes how many files were affected by the update. |
11454
9b0406b23be0
merge: pass constant cset ancestor to fctx.ancestor
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
11451
diff
changeset
|
390 """ |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
391 |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
392 updated, merged, removed, unresolved = 0, 0, 0, 0 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
393 ms = mergestate(repo) |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13874
diff
changeset
|
394 ms.reset(wctx.p1().node()) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
395 moves = [] |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
396 actions.sort(key=actionkey) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
397 |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
398 # prescan for merges |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
399 for a in actions: |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
400 f, m, args, msg = a |
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
401 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m)) |
18329
eb6ca96f4dd0
merge: consistently use "x" instead of 'x' for internal action types
Mads Kiilerich <mads@kiilerich.com>
parents:
18328
diff
changeset
|
402 if m == "m": # merge |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
403 f2, fd, move = args |
18332
6ba58ab719e5
merge: .hgsubstate is special as merge destination, not as merge source
Mads Kiilerich <mads@kiilerich.com>
parents:
18331
diff
changeset
|
404 if fd == '.hgsubstate': # merged internally |
8814
ab668c92a036
subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents:
8753
diff
changeset
|
405 continue |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
406 repo.ui.debug(" preserving %s for resolve of %s\n" % (f, fd)) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
407 fcl = wctx[f] |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
408 fco = mctx[f2] |
12008
fad5ed0ff997
merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents:
11755
diff
changeset
|
409 if mctx == actx: # backwards, use working dir parent as ancestor |
12664
545ec1775021
merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
410 if fcl.parents(): |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13874
diff
changeset
|
411 fca = fcl.p1() |
12664
545ec1775021
merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
412 else: |
545ec1775021
merge: handle no file parent in backwards merge (issue2364)
Matt Mackall <mpm@selenic.com>
parents:
12401
diff
changeset
|
413 fca = repo.filectx(f, fileid=nullrev) |
12008
fad5ed0ff997
merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents:
11755
diff
changeset
|
414 else: |
fad5ed0ff997
merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents:
11755
diff
changeset
|
415 fca = fcl.ancestor(fco, actx) |
fad5ed0ff997
merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents:
11755
diff
changeset
|
416 if not fca: |
fad5ed0ff997
merge: move reverse-merge logic out of filemerge (issue2342)
Matt Mackall <mpm@selenic.com>
parents:
11755
diff
changeset
|
417 fca = repo.filectx(f, fileid=nullrev) |
18338
384df4db6520
merge: merge file flags together with file content
Mads Kiilerich <mads@kiilerich.com>
parents:
18336
diff
changeset
|
418 ms.add(fcl, fco, fca, fd) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
419 if f != fd and move: |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
420 moves.append(f) |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
421 |
18328
2fee5119099b
merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents:
18143
diff
changeset
|
422 audit = repo.wopener.audit |
14398
ae1f7a5373e8
applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
423 |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
424 # remove renamed files after safely stored |
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
425 for f in moves: |
12032
ad787252fed6
util: remove lexists, Python 2.4 introduced os.path.lexists
Martin Geisler <mg@lazybytes.net>
parents:
12010
diff
changeset
|
426 if os.path.lexists(repo.wjoin(f)): |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9048
diff
changeset
|
427 repo.ui.debug("removing %s\n" % f) |
14398
ae1f7a5373e8
applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
428 audit(f) |
18333
f6f23ecafc9b
merge: use util.unlinkpath for removing moved files
Mads Kiilerich <mads@kiilerich.com>
parents:
18332
diff
changeset
|
429 util.unlinkpath(repo.wjoin(f)) |
5042
f191bc3916f7
merge: do early copy to deal with issue636
Matt Mackall <mpm@selenic.com>
parents:
4997
diff
changeset
|
430 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
431 numupdates = len(actions) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
432 workeractions = [a for a in actions if a[1] in 'gr'] |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
433 updated = len([a for a in workeractions if a[1] == 'g']) |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
434 removed = len([a for a in workeractions if a[1] == 'r']) |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
435 actions = [a for a in actions if a[1] not in 'gr'] |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
436 |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
437 hgsub = [a[1] for a in workeractions if a[0] == '.hgsubstate'] |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
438 if hgsub and hgsub[0] == 'r': |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
439 subrepo.submerge(repo, wctx, mctx, wctx, overwrite) |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
440 |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
441 z = 0 |
18639
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
442 prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite), |
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
443 workeractions) |
5774732bb5e5
merge: apply non-interactive working dir updates in parallel
Bryan O'Sullivan <bryano@fb.com>
parents:
18633
diff
changeset
|
444 for i, item in prog: |
18633
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
445 z += i |
6390dd22b12f
merge: report non-interactive progress in chunks
Bryan O'Sullivan <bryano@fb.com>
parents:
18632
diff
changeset
|
446 repo.ui.progress(_('updating'), z, item=item, total=numupdates, |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
447 unit=_('files')) |
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
448 |
18632
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
449 if hgsub and hgsub[0] == 'g': |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
450 subrepo.submerge(repo, wctx, mctx, wctx, overwrite) |
3e20079117c5
merge: handle subrepo merges and .hgsubstate specially
Bryan O'Sullivan <bryano@fb.com>
parents:
18630
diff
changeset
|
451 |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
452 _updating = _('updating') |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
453 _files = _('files') |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
454 progress = repo.ui.progress |
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
455 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
456 for i, a in enumerate(actions): |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
457 f, m, args, msg = a |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
458 progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files) |
18630
9b9e2d9e83a1
merge: split out mostly-non-interactive working dir updates
Bryan O'Sullivan <bryano@fb.com>
parents:
18612
diff
changeset
|
459 if m == "m": # merge |
18332
6ba58ab719e5
merge: .hgsubstate is special as merge destination, not as merge source
Mads Kiilerich <mads@kiilerich.com>
parents:
18331
diff
changeset
|
460 if fd == '.hgsubstate': # subrepo states need updating |
16683 | 461 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx), |
462 overwrite) | |
8814
ab668c92a036
subrepo: add update/merge logic
Matt Mackall <mpm@selenic.com>
parents:
8753
diff
changeset
|
463 continue |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
464 f2, fd, move = args |
18328
2fee5119099b
merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents:
18143
diff
changeset
|
465 audit(fd) |
6512
368a4ec603cc
merge: introduce mergestate
Matt Mackall <mpm@selenic.com>
parents:
6425
diff
changeset
|
466 r = ms.resolve(fd, wctx, mctx) |
9030
3f56055ff1d7
compat: can't compare two values of unequal datatypes
Alejandro Santos <alejolp@alejolp.com>
parents:
8814
diff
changeset
|
467 if r is not None and r > 0: |
3249
f05c182430a0
merge: add rename following
Matt Mackall <mpm@selenic.com>
parents:
3248
diff
changeset
|
468 unresolved += 1 |
3309
e8be5942335d
merge: pull file copy/move out of filemerge
Matt Mackall <mpm@selenic.com>
parents:
3308
diff
changeset
|
469 else: |
3400
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
470 if r is None: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
471 updated += 1 |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
472 else: |
d2b55e3c4e25
merge: if filemerge skips merge, report as updated
Matt Mackall <mpm@selenic.com>
parents:
3372
diff
changeset
|
473 merged += 1 |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
474 elif m == "d": # directory rename |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
475 f2, fd, flags = args |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
476 if f: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
477 repo.ui.note(_("moving %s to %s\n") % (f, fd)) |
14398
ae1f7a5373e8
applyupdates: audit unlinking of renamed files and directories
Adrian Buehlmann <adrian@cadifra.com>
parents:
14232
diff
changeset
|
478 audit(f) |
18335
435909bf0257
merge: drop reference to file contents immediately after write
Mads Kiilerich <mads@kiilerich.com>
parents:
18334
diff
changeset
|
479 repo.wwrite(fd, wctx.filectx(f).data(), flags) |
13235
6bf39d88c857
rename util.unlink to unlinkpath
Adrian Buehlmann <adrian@cadifra.com>
parents:
13162
diff
changeset
|
480 util.unlinkpath(repo.wjoin(f)) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
481 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
482 repo.ui.note(_("getting %s to %s\n") % (f2, fd)) |
18335
435909bf0257
merge: drop reference to file contents immediately after write
Mads Kiilerich <mads@kiilerich.com>
parents:
18334
diff
changeset
|
483 repo.wwrite(fd, mctx.filectx(f2).data(), flags) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
484 updated += 1 |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
485 elif m == "dr": # divergent renames |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
486 fl, = args |
12757
62c8f7691bc3
merge: make 'diverging renames' diagnostic a more helpful note.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
12746
diff
changeset
|
487 repo.ui.warn(_("note: possible conflict - %s was renamed " |
62c8f7691bc3
merge: make 'diverging renames' diagnostic a more helpful note.
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents:
12746
diff
changeset
|
488 "multiple times to:\n") % f) |
4674
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
489 for nf in fl: |
723e0ddb6ada
merge: warn user about divergent renames
Matt Mackall <mpm@selenic.com>
parents:
4635
diff
changeset
|
490 repo.ui.warn(" %s\n" % nf) |
16794
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
491 elif m == "rd": # rename and delete |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
492 fl, = args |
16794
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
493 repo.ui.warn(_("note: possible conflict - %s was deleted " |
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
494 "and renamed to:\n") % f) |
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
495 for nf in fl: |
98687cdddcb1
merge: warn about file deleted in one branch and renamed in other (issue3074)
Thomas Arendsen Hein <thomas@intevation.de>
parents:
16719
diff
changeset
|
496 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
|
497 elif m == "e": # exec |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
498 flags, = args |
18328
2fee5119099b
merge: consistently use repo.wopener.audit instead of creating a new auditor
Mads Kiilerich <mads@kiilerich.com>
parents:
18143
diff
changeset
|
499 audit(f) |
14232
df2399663392
rename util.set_flags to setflags
Adrian Buehlmann <adrian@cadifra.com>
parents:
14220
diff
changeset
|
500 util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags) |
18334
44bda93df90e
merge: changing the mode of a file is also an update
Mads Kiilerich <mads@kiilerich.com>
parents:
18333
diff
changeset
|
501 updated += 1 |
12369
6f0d9d79111f
merge: delay writing the mergestate during until commit is called
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
12279
diff
changeset
|
502 ms.commit() |
18640
a8648f32b8ed
merge: don't fiddle with name lookups or i18n in hot loops
Bryan O'Sullivan <bryano@fb.com>
parents:
18639
diff
changeset
|
503 progress(_updating, None, total=numupdates, unit=_files) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
504 |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
505 return updated, merged, removed, unresolved |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
506 |
18035
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
507 def calculateupdates(repo, tctx, mctx, ancestor, branchmerge, force, partial): |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
508 "Calculate the actions needed to merge mctx into tctx" |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
509 actions = [] |
18035
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
510 folding = not util.checkcase(repo.path) |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
511 if folding: |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
512 # collision check is not needed for clean update |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
513 if (not branchmerge and |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
514 (force or not tctx.dirty(missing=True, branch=False))): |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
515 _checkcollision(mctx, None) |
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
516 else: |
18042
551e2901192e
merge: fix mistake in moved _checkcollision call from 5881d5b7552f
Kevin Bullock <kbullock@ringworld.org>
parents:
18036
diff
changeset
|
517 _checkcollision(mctx, (tctx, ancestor)) |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
518 actions += manifestmerge(repo, tctx, mctx, |
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
519 ancestor, |
18605
bcf29565d89f
manifestmerge: pass in branchmerge and force separately
Siddharth Agarwal <sid0@fb.com>
parents:
18544
diff
changeset
|
520 branchmerge, force, |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
521 partial) |
18650
de0bd4bfc6d7
merge: run _forgetremoved after manifestmerge
Siddharth Agarwal <sid0@fb.com>
parents:
18640
diff
changeset
|
522 if tctx.rev() is None: |
de0bd4bfc6d7
merge: run _forgetremoved after manifestmerge
Siddharth Agarwal <sid0@fb.com>
parents:
18640
diff
changeset
|
523 actions += _forgetremoved(tctx, mctx, branchmerge) |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
524 return actions |
18035
5881d5b7552f
merge: refactor action calculation into function
David Schleimer <dschleimer@fb.com>
parents:
17889
diff
changeset
|
525 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
526 def recordupdates(repo, actions, branchmerge): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
527 "record merge actions to the dirstate" |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
528 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
529 for a in actions: |
18541
5ed6a375e9ca
merge: delay debug messages for merge actions
Mads Kiilerich <madski@unity3d.com>
parents:
18540
diff
changeset
|
530 f, m, args, msg = a |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
531 if m == "r": # remove |
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
532 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
533 repo.dirstate.remove(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
534 else: |
14434
cc8c09855d19
dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents:
14406
diff
changeset
|
535 repo.dirstate.drop(f) |
7768
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
536 elif m == "a": # re-add |
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
537 if not branchmerge: |
5bf5fd1e2a74
merge: mark kept local files as readded on linear update (issue539)
Matt Mackall <mpm@selenic.com>
parents:
7631
diff
changeset
|
538 repo.dirstate.add(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
539 elif m == "f": # forget |
14434
cc8c09855d19
dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents:
14406
diff
changeset
|
540 repo.dirstate.drop(f) |
7569
89207edf3973
correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7066
diff
changeset
|
541 elif m == "e": # exec change |
7630
a679bd371091
merge: fix execute bit update issue introduced by 89207edf3973
Patrick Mezard <pmezard@gmail.com>
parents:
7569
diff
changeset
|
542 repo.dirstate.normallookup(f) |
7569
89207edf3973
correctly update dirstate after update+mode change (issue1456)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
7066
diff
changeset
|
543 elif m == "g": # get |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
544 if branchmerge: |
10968
7a0d096e221e
dirstate: more explicit name, rename normaldirty() to otherparent()
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10492
diff
changeset
|
545 repo.dirstate.otherparent(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
546 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
547 repo.dirstate.normal(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
548 elif m == "m": # merge |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
549 f2, fd, move = args |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
550 if branchmerge: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
551 # 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
|
552 # 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
|
553 repo.dirstate.merge(fd) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
554 if f != f2: # copy/rename |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
555 if move: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
556 repo.dirstate.remove(f) |
3372
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
557 if f != fd: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
558 repo.dirstate.copy(f, fd) |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
559 else: |
ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
Matt Mackall <mpm@selenic.com>
parents:
3371
diff
changeset
|
560 repo.dirstate.copy(f2, fd) |
3251
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
561 else: |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
562 # We've update-merged a locally modified file, so |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
563 # we set the dirstate to emulate a normal checkout |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
564 # 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
|
565 # merge will appear as a normal local file |
c93ce7f10f85
merge: fixes for merge+rename
Matt Mackall <mpm@selenic.com>
parents:
3249
diff
changeset
|
566 # modification. |
11178
21a7ae13208f
merge: avoid to break the dirstate copy status on moved files
Gilles Moris <gilles.moris@free.fr>
parents:
11101
diff
changeset
|
567 if f2 == fd: # file not locally copied/moved |
21a7ae13208f
merge: avoid to break the dirstate copy status on moved files
Gilles Moris <gilles.moris@free.fr>
parents:
11101
diff
changeset
|
568 repo.dirstate.normallookup(fd) |
3308
ecc1bf27378c
merge: unify merge and copy actions
Matt Mackall <mpm@selenic.com>
parents:
3307
diff
changeset
|
569 if move: |
14434
cc8c09855d19
dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents:
14406
diff
changeset
|
570 repo.dirstate.drop(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
571 elif m == "d": # directory rename |
18540
139529b0a191
merge: make all action tuples have the same length - keep args as tuple
Mads Kiilerich <madski@unity3d.com>
parents:
18539
diff
changeset
|
572 f2, fd, flag = args |
4819
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
573 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
|
574 # untracked file moved |
9797124581c9
merge: fix adding untracked files on directory rename (issue612)
Matt Mackall <mpm@selenic.com>
parents:
4748
diff
changeset
|
575 continue |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
576 if branchmerge: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
577 repo.dirstate.add(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
578 if f: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
579 repo.dirstate.remove(f) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
580 repo.dirstate.copy(f, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
581 if f2: |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
582 repo.dirstate.copy(f2, fd) |
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
583 else: |
4904
6fd953d5faea
dirstate: break update into separate functions
Matt Mackall <mpm@selenic.com>
parents:
4884
diff
changeset
|
584 repo.dirstate.normal(fd) |
3733
9e67fecbfd16
merge: handle directory renames
Matt Mackall <mpm@selenic.com>
parents:
3732
diff
changeset
|
585 if f: |
14434
cc8c09855d19
dirstate: rename forget to drop
Matt Mackall <mpm@selenic.com>
parents:
14406
diff
changeset
|
586 repo.dirstate.drop(f) |
3111
5cc62d99b785
merge: move apply and dirstate code into separate functions
Matt Mackall <mpm@selenic.com>
parents:
3110
diff
changeset
|
587 |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
588 def update(repo, node, branchmerge, force, partial, ancestor=None, |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
589 mergeancestor=False): |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
590 """ |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
591 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
|
592 |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
593 node = the node to update to, or None if unspecified |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
594 branchmerge = whether to merge between branches |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
595 force = whether to force branch merging or file overwriting |
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
596 partial = a function to filter file lists (dirstate not updated) |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
597 mergeancestor = if false, merging with an ancestor (fast-forward) |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
598 is only allowed between different named branches. This flag |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
599 is used by rebase extension as a temporary fix and should be |
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
600 avoided in general. |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
601 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
602 The table below shows all the behaviors of the update command |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
603 given the -c and -C or no options, whether the working directory |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
604 is dirty, whether a revision is specified, and the relationship of |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
605 the parent rev to the target rev (linear, on the same named |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
606 branch, or on another named branch). |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
607 |
12279 | 608 This logic is tested by test-update-branches.t. |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
609 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
610 -c -C dirty rev | linear same cross |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
611 n n n n | ok (1) x |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
612 n n n y | ok ok ok |
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
613 n n y * | merge (2) (2) |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
614 n y * * | --- discard --- |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
615 y n y * | --- (3) --- |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
616 y n n * | --- ok --- |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
617 y y * * | --- (4) --- |
9716
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
618 |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
619 x = can't happen |
ea8c207a0f78
update: add comments and test cases for updating across branches
Stuart W Marks <smarks@smarks.org>
parents:
9467
diff
changeset
|
620 * = don't-care |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
621 1 = abort: crosses branches (use 'hg merge' or 'hg update -c') |
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
622 2 = abort: crosses branches (use 'hg merge' to merge or |
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
623 use 'hg update -C' to discard changes) |
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
624 3 = abort: uncommitted local changes |
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
625 4 = incompatible options (checked in commands.py) |
13162
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
626 |
115a9760c382
merge: document some internal return values.
Greg Ward <greg-hg@gerg.ca>
parents:
13158
diff
changeset
|
627 Return the same tuple as applyupdates(). |
3315
38be819a1225
merge: update some docstrings
Matt Mackall <mpm@selenic.com>
parents:
3314
diff
changeset
|
628 """ |
2815
4870f795f681
Merge: combine force and forcemerge arguments
Matt Mackall <mpm@selenic.com>
parents:
2814
diff
changeset
|
629 |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
630 onode = node |
4917
126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
Matt Mackall <mpm@selenic.com>
parents:
4915
diff
changeset
|
631 wlock = repo.wlock() |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
632 try: |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6746
diff
changeset
|
633 wc = repo[None] |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
634 if node is None: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
635 # tip of current branch |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
636 try: |
16719
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16696
diff
changeset
|
637 node = repo.branchtip(wc.branch()) |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16696
diff
changeset
|
638 except error.RepoLookupError: |
5570
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
639 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
|
640 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
|
641 else: |
78a6b985882f
update: default to tipmost branch if default branch doesn't exist
Matt Mackall <mpm@selenic.com>
parents:
5489
diff
changeset
|
642 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
|
643 overwrite = force and not branchmerge |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
644 pl = wc.parents() |
6747
f6c00b17387c
use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents:
6746
diff
changeset
|
645 p1, p2 = pl[0], repo[node] |
13874
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
646 if ancestor: |
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
647 pa = repo[ancestor] |
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
648 else: |
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
649 pa = p1.ancestor(p2) |
9d67277c9204
merge: add ancestor to the update function
Matt Mackall <mpm@selenic.com>
parents:
13728
diff
changeset
|
650 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
651 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2) |
3314 | 652 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
653 ### check phase |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
654 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
|
655 raise util.Abort(_("outstanding uncommitted merges")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
656 if branchmerge: |
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
657 if pa == p2: |
11417
6f1d1ed3e19a
merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents:
11178
diff
changeset
|
658 raise util.Abort(_("merging with a working directory ancestor" |
6f1d1ed3e19a
merge: improve merge with ancestor message
Matt Mackall <mpm@selenic.com>
parents:
11178
diff
changeset
|
659 " has no effect")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
660 elif pa == p1: |
16696
d1afbf03e69a
rebase: allow collapsing branches in place (issue3111)
Patrick Mezard <patrick@mezard.eu>
parents:
16683
diff
changeset
|
661 if not mergeancestor and p1.branch() == p2.branch(): |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
662 raise util.Abort(_("nothing to merge"), |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
663 hint=_("use 'hg update' " |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
664 "or check 'hg heads'")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
665 if not force and (wc.files() or wc.deleted()): |
15619
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
666 raise util.Abort(_("outstanding uncommitted changes"), |
6c8573dd1b6b
merge: make 'nothing to merge' aborts consistent
Kevin Bullock <kbullock@ringworld.org>
parents:
15538
diff
changeset
|
667 hint=_("use 'hg status' to list changes")) |
18364
6252b4f1c4b4
subrepos: process subrepos in sorted order
Mads Kiilerich <mads@kiilerich.com>
parents:
18360
diff
changeset
|
668 for s in sorted(wc.substate): |
13437
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
669 if wc.sub(s).dirty(): |
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
670 raise util.Abort(_("outstanding uncommitted changes in " |
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
671 "subrepository '%s'") % s) |
6169493ac3f9
Do not allow merging with uncommitted changes in a subrepo
Oleg Stepanov <oleg.stepanov@jetbrains.com>
parents:
13400
diff
changeset
|
672 |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
673 elif not overwrite: |
12401
4cdaf1adafc8
backout most of 4f8067c94729
Matt Mackall <mpm@selenic.com>
parents:
12387
diff
changeset
|
674 if pa == p1 or pa == p2: # linear |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
675 pass # all good |
14663
88cb01c4575e
update: check wc.dirty() before setting overwrite=True
Augie Fackler <durin42@gmail.com>
parents:
14485
diff
changeset
|
676 elif wc.dirty(missing=True): |
12681
bc13e17067d9
update: use higher level wording for "crosses branches" error
Brodie Rao <brodie@bitheap.org>
parents:
12664
diff
changeset
|
677 raise util.Abort(_("crosses branches (merge branches or use" |
bc13e17067d9
update: use higher level wording for "crosses branches" error
Brodie Rao <brodie@bitheap.org>
parents:
12664
diff
changeset
|
678 " --clean to discard changes)")) |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
679 elif onode is None: |
14485
610873cf064a
Make pull -u behave like pull && update
Brendan Cully <brendan@kublai.com>
parents:
14434
diff
changeset
|
680 raise util.Abort(_("crosses branches (merge branches or update" |
12681
bc13e17067d9
update: use higher level wording for "crosses branches" error
Brodie Rao <brodie@bitheap.org>
parents:
12664
diff
changeset
|
681 " --check to force update)")) |
6375
cdc458b12f0f
update: better logic and messages for updates
Matt Mackall <mpm@selenic.com>
parents:
6350
diff
changeset
|
682 else: |
9717
68a1b9d0663e
update: allow branch crossing without -c or -C, with no uncommitted changes
Stuart W Marks <smarks@smarks.org>
parents:
9716
diff
changeset
|
683 # Allow jumping branches if clean and specific rev given |
16092
914bc95e227b
update: use normal update path with --check (issue2450)
Matt Mackall <mpm@selenic.com>
parents:
16001
diff
changeset
|
684 pa = p1 |
2814
0f787997e3c2
Merge: move most tests to the beginning
Matt Mackall <mpm@selenic.com>
parents:
2813
diff
changeset
|
685 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
686 ### calculate phase |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
687 actions = calculateupdates(repo, wc, p2, pa, |
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
688 branchmerge, force, partial) |
2775
b550cd82f92a
Move merge code to its own module
Matt Mackall <mpm@selenic.com>
parents:
diff
changeset
|
689 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
690 ### apply phase |
13550
1792b8a9422b
merge: back out single-parent fast-forward merge
Matt Mackall <mpm@selenic.com>
parents:
13536
diff
changeset
|
691 if not branchmerge: # just jump to the new rev |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
692 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
|
693 if not partial: |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
694 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
|
695 |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
696 stats = applyupdates(repo, actions, wc, p2, pa, overwrite) |
2899
8743188f4d2e
merge: consolidate dirstate updates
Matt Mackall <mpm@selenic.com>
parents:
2898
diff
changeset
|
697 |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
698 if not partial: |
16551
ebf6d38c9063
localrepo: add setparents() to adjust dirstate copies (issue3407)
Patrick Mezard <patrick@mezard.eu>
parents:
16534
diff
changeset
|
699 repo.setparents(fp1, fp2) |
18330
b717f49833a2
merge: rename list of actions from action to actions
Mads Kiilerich <mads@kiilerich.com>
parents:
18329
diff
changeset
|
700 recordupdates(repo, actions, branchmerge) |
13561
0ab0ceefddf2
merge: remove last traces of fastforward merging
Mads Kiilerich <mads@kiilerich.com>
parents:
13550
diff
changeset
|
701 if not branchmerge: |
4915
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
702 repo.dirstate.setbranch(p2.branch()) |
97b734fb9c6f
Use try/finally pattern to cleanup locks and transactions
Matt Mackall <mpm@selenic.com>
parents:
4904
diff
changeset
|
703 finally: |
8109
496ae1ea4698
switch lock releasing in the core from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents:
7848
diff
changeset
|
704 wlock.release() |
10492
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
705 |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
706 if not partial: |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
707 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
0e64d814d7d0
run commit and update hooks after command completion (issue1827)
Sune Foldager <cryo@cyanite.org>
parents:
10431
diff
changeset
|
708 return stats |