##// END OF EJS Templates
merge: simplify actions with helper function
Matt Mackall -
r3121:2ef0b3aa default
parent child Browse files
Show More
@@ -1,345 +1,337 b''
1 1 # merge.py - directory-level update/merge handling for Mercurial
2 2 #
3 3 # Copyright 2006 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms
6 6 # of the GNU General Public License, incorporated herein by reference.
7 7
8 8 from node import *
9 9 from i18n import gettext as _
10 10 from demandload import *
11 11 demandload(globals(), "errno util os tempfile")
12 12
13 13 def merge3(repo, fn, my, other, p1, p2):
14 14 """perform a 3-way merge in the working directory"""
15 15
16 16 def temp(prefix, node):
17 17 pre = "%s~%s." % (os.path.basename(fn), prefix)
18 18 (fd, name) = tempfile.mkstemp(prefix=pre)
19 19 f = os.fdopen(fd, "wb")
20 20 repo.wwrite(fn, fl.read(node), f)
21 21 f.close()
22 22 return name
23 23
24 24 fl = repo.file(fn)
25 25 base = fl.ancestor(my, other)
26 26 a = repo.wjoin(fn)
27 27 b = temp("base", base)
28 28 c = temp("other", other)
29 29
30 30 repo.ui.note(_("resolving %s\n") % fn)
31 31 repo.ui.debug(_("file %s: my %s other %s ancestor %s\n") %
32 32 (fn, short(my), short(other), short(base)))
33 33
34 34 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
35 35 or "hgmerge")
36 36 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
37 37 environ={'HG_FILE': fn,
38 38 'HG_MY_NODE': p1,
39 39 'HG_OTHER_NODE': p2,
40 40 'HG_FILE_MY_NODE': hex(my),
41 41 'HG_FILE_OTHER_NODE': hex(other),
42 42 'HG_FILE_BASE_NODE': hex(base)})
43 43 if r:
44 44 repo.ui.warn(_("merging %s failed!\n") % fn)
45 45
46 46 os.unlink(b)
47 47 os.unlink(c)
48 48 return r
49 49
50 50 def checkunknown(repo, m2, status):
51 51 """
52 52 check for collisions between unknown files and files in m2
53 53 """
54 54 modified, added, removed, deleted, unknown = status[:5]
55 55 for f in unknown:
56 56 if f in m2:
57 57 if repo.file(f).cmp(m2[f], repo.wread(f)):
58 58 raise util.Abort(_("'%s' already exists in the working"
59 59 " dir and differs from remote") % f)
60 60
61 61 def workingmanifest(repo, man, status):
62 62 """
63 63 Update manifest to correspond to the working directory
64 64 """
65 65
66 66 modified, added, removed, deleted, unknown = status[:5]
67 67 for i,l in (("a", added), ("m", modified), ("u", unknown)):
68 68 for f in l:
69 69 man[f] = man.get(f, nullid) + i
70 70 man.set(f, util.is_exec(repo.wjoin(f), man.execf(f)))
71 71
72 72 for f in deleted + removed:
73 73 del man[f]
74 74
75 75 return man
76 76
77 77 def forgetremoved(m2, status):
78 78 """
79 79 Forget removed files
80 80
81 81 If we're jumping between revisions (as opposed to merging), and if
82 82 neither the working directory nor the target rev has the file,
83 83 then we need to remove it from the dirstate, to prevent the
84 84 dirstate from listing the file when it is no longer in the
85 85 manifest.
86 86 """
87 87
88 88 modified, added, removed, deleted, unknown = status[:5]
89 89 action = []
90 90
91 91 for f in deleted + removed:
92 92 if f not in m2:
93 93 action.append((f, "f"))
94 94
95 95 return action
96 96
97 97 def manifestmerge(ui, m1, m2, ma, overwrite, backwards, partial):
98 98 """
99 99 Merge manifest m1 with m2 using ancestor ma and generate merge action list
100 100 """
101 101
102 102 def fmerge(f):
103 103 """merge executable flags"""
104 104 a, b, c = ma.execf(f), m1.execf(f), m2.execf(f)
105 105 return ((a^b) | (a^c)) ^ a
106 106
107 107 action = []
108 108
109 def act(msg, f, m, *args):
110 ui.debug(" %s: %s -> %s\n" % (f, msg, m))
111 action.append((f, m) + args)
112
109 113 # Filter manifests
110 114 if partial:
111 115 for f in m1.keys():
112 116 if not partial(f): del m1[f]
113 117 for f in m2.keys():
114 118 if not partial(f): del m2[f]
115 119
116 120 # Compare manifests
117 121 for f, n in m1.iteritems():
118 122 if f in m2:
119 123 # are files different?
120 124 if n != m2[f]:
121 125 a = ma.get(f, nullid)
122 126 # are both different from the ancestor?
123 127 if not overwrite and n != a and m2[f] != a:
124 ui.debug(_(" %s versions differ, resolve\n") % f)
125 action.append((f, "m", fmerge(f), n[:20], m2[f]))
128 act("versions differ", f, "m", fmerge(f), n[:20], m2[f])
126 129 # are we clobbering?
127 130 # is remote's version newer?
128 131 # or are we going back in time and clean?
129 132 elif overwrite or m2[f] != a or (backwards and not n[20:]):
130 ui.debug(_(" remote %s is newer, get\n") % f)
131 action.append((f, "g", m2.execf(f), m2[f]))
133 act("remote is newer", f, "g", m2.execf(f), m2[f])
132 134 # local is newer, not overwrite, check mode bits
133 135 elif fmerge(f) != m1.execf(f):
134 ui.debug(_(" updating permissions for %s\n") % f)
135 action.append((f, "e", m2.execf(f)))
136 act("update permissions", f, "e", m2.execf(f))
136 137 # contents same, check mode bits
137 138 elif m1.execf(f) != m2.execf(f):
138 139 if overwrite or fmerge(f) != m1.execf(f):
139 ui.debug(_(" updating permissions for %s\n") % f)
140 action.append((f, "e", m2.execf(f)))
140 act("update permissions", f, "e", m2.execf(f))
141 141 del m2[f]
142 142 elif f in ma:
143 143 if n != ma[f] and not overwrite:
144 144 if ui.prompt(
145 145 (_(" local changed %s which remote deleted\n") % f) +
146 146 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
147 action.append((f, "r"))
147 act("prompt delete", f, "r")
148 148 else:
149 ui.debug(_("other deleted %s\n") % f)
150 action.append((f, "r"))
149 act("other deleted", f, "r")
151 150 else:
152 151 # file is created on branch or in working directory
153 152 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
154 ui.debug(_("remote deleted %s, clobbering\n") % f)
155 action.append((f, "r"))
156 else:
157 ui.debug(_("local created %s, keeping\n") % f)
153 act("remote deleted", f, "r")
158 154
159 155 for f, n in m2.iteritems():
160 156 if f in ma:
161 157 if overwrite or backwards:
162 ui.debug(_("local deleted %s, recreating\n") % f)
163 action.append((f, "g", m2.execf(f), n))
158 act("recreating", f, "g", m2.execf(f), n)
164 159 elif n != ma[f]:
165 160 if ui.prompt(
166 161 (_("remote changed %s which local deleted\n") % f) +
167 162 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
168 action.append((f, "g", m2.execf(f), n))
169 else:
170 ui.debug(_("local deleted %s\n") % f)
163 act("prompt recreating", f, "g", m2.execf(f), n)
171 164 else:
172 ui.debug(_("remote created %s\n") % f)
173 action.append((f, "g", m2.execf(f), n))
165 act("remote created", f, "g", m2.execf(f), n)
174 166
175 167 return action
176 168
177 169 def applyupdates(repo, action, xp1, xp2):
178 170 updated, merged, removed, unresolved = 0, 0, 0, 0
179 171 action.sort()
180 172 for a in action:
181 173 f, m = a[:2]
182 174 if f[0] == "/":
183 175 continue
184 176 if m == "r": # remove
185 177 repo.ui.note(_("removing %s\n") % f)
186 178 util.audit_path(f)
187 179 try:
188 180 util.unlink(repo.wjoin(f))
189 181 except OSError, inst:
190 182 if inst.errno != errno.ENOENT:
191 183 repo.ui.warn(_("update failed to remove %s: %s!\n") %
192 184 (f, inst.strerror))
193 185 removed +=1
194 186 elif m == "m": # merge
195 187 flag, my, other = a[2:]
196 188 repo.ui.status(_("merging %s\n") % f)
197 189 if merge3(repo, f, my, other, xp1, xp2):
198 190 unresolved += 1
199 191 util.set_exec(repo.wjoin(f), flag)
200 192 merged += 1
201 193 elif m == "g": # get
202 194 flag, node = a[2:]
203 195 repo.ui.note(_("getting %s\n") % f)
204 196 t = repo.file(f).read(node)
205 197 repo.wwrite(f, t)
206 198 util.set_exec(repo.wjoin(f), flag)
207 199 updated += 1
208 200 elif m == "e": # exec
209 201 flag = a[2:]
210 202 util.set_exec(repo.wjoin(f), flag)
211 203
212 204 return updated, merged, removed, unresolved
213 205
214 206 def recordupdates(repo, action, branchmerge):
215 207 for a in action:
216 208 f, m = a[:2]
217 209 if m == "r": # remove
218 210 if branchmerge:
219 211 repo.dirstate.update([f], 'r')
220 212 else:
221 213 repo.dirstate.forget([f])
222 214 elif m == "f": # forget
223 215 repo.dirstate.forget([f])
224 216 elif m == "g": # get
225 217 if branchmerge:
226 218 repo.dirstate.update([f], 'n', st_mtime=-1)
227 219 else:
228 220 repo.dirstate.update([f], 'n')
229 221 elif m == "m": # merge
230 222 flag, my, other = a[2:]
231 223 if branchmerge:
232 224 # We've done a branch merge, mark this file as merged
233 225 # so that we properly record the merger later
234 226 repo.dirstate.update([f], 'm')
235 227 else:
236 228 # We've update-merged a locally modified file, so
237 229 # we set the dirstate to emulate a normal checkout
238 230 # of that file some time in the past. Thus our
239 231 # merge will appear as a normal local file
240 232 # modification.
241 233 fl = repo.file(f)
242 234 f_len = fl.size(fl.rev(other))
243 235 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
244 236
245 237 def update(repo, node, branchmerge=False, force=False, partial=None,
246 238 wlock=None, show_stats=True, remind=True):
247 239
248 240 overwrite = force and not branchmerge
249 241 forcemerge = force and branchmerge
250 242
251 243 if not wlock:
252 244 wlock = repo.wlock()
253 245
254 246 ### check phase
255 247
256 248 pl = repo.dirstate.parents()
257 249 if not overwrite and pl[1] != nullid:
258 250 raise util.Abort(_("outstanding uncommitted merges"))
259 251
260 252 p1, p2 = pl[0], node
261 253 pa = repo.changelog.ancestor(p1, p2)
262 254
263 255 # are we going backwards?
264 256 backwards = (pa == p2)
265 257
266 258 # is there a linear path from p1 to p2?
267 259 if pa == p1 or pa == p2:
268 260 if branchmerge:
269 261 raise util.Abort(_("there is nothing to merge, just use "
270 262 "'hg update' or look at 'hg heads'"))
271 263 elif not (overwrite or branchmerge):
272 264 raise util.Abort(_("update spans branches, use 'hg merge' "
273 265 "or 'hg update -C' to lose changes"))
274 266
275 267 status = repo.status()
276 268 modified, added, removed, deleted, unknown = status[:5]
277 269 if branchmerge and not forcemerge:
278 270 if modified or added or removed:
279 271 raise util.Abort(_("outstanding uncommitted changes"))
280 272
281 273 m1 = repo.changectx(p1).manifest().copy()
282 274 m2 = repo.changectx(p2).manifest().copy()
283 275 ma = repo.changectx(pa).manifest()
284 276
285 277 # resolve the manifest to determine which files
286 278 # we care about merging
287 279 repo.ui.note(_("resolving manifests\n"))
288 280 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") %
289 281 (overwrite, branchmerge, bool(partial)))
290 282 repo.ui.debug(_(" ancestor %s local %s remote %s\n") %
291 283 (short(p1), short(p2), short(pa)))
292 284
293 285 action = []
294 286 m1 = workingmanifest(repo, m1, status)
295 287
296 288 if not force:
297 289 checkunknown(repo, m2, status)
298 290 if not branchmerge:
299 291 action += forgetremoved(m2, status)
300 292 action += manifestmerge(repo.ui, m1, m2, ma, overwrite, backwards, partial)
301 293 del m1, m2, ma
302 294
303 295 ### apply phase
304 296
305 297 if not branchmerge:
306 298 # we don't need to do any magic, just jump to the new rev
307 299 p1, p2 = p2, nullid
308 300
309 301 xp1, xp2 = hex(p1), hex(p2)
310 302 if p2 == nullid: xp2 = ''
311 303
312 304 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
313 305
314 306 updated, merged, removed, unresolved = applyupdates(repo, action, xp1, xp2)
315 307
316 308 # update dirstate
317 309 if not partial:
318 310 repo.dirstate.setparents(p1, p2)
319 311 recordupdates(repo, action, branchmerge)
320 312
321 313 if show_stats:
322 314 stats = ((updated, _("updated")),
323 315 (merged - unresolved, _("merged")),
324 316 (removed, _("removed")),
325 317 (unresolved, _("unresolved")))
326 318 note = ", ".join([_("%d files %s") % s for s in stats])
327 319 repo.ui.status("%s\n" % note)
328 320 if not partial:
329 321 if branchmerge:
330 322 if unresolved:
331 323 repo.ui.status(_("There are unresolved merges,"
332 324 " you can redo the full merge using:\n"
333 325 " hg update -C %s\n"
334 326 " hg merge %s\n"
335 327 % (repo.changelog.rev(p1),
336 328 repo.changelog.rev(p2))))
337 329 elif remind:
338 330 repo.ui.status(_("(branch merge, don't forget to commit)\n"))
339 331 elif unresolved:
340 332 repo.ui.status(_("There are unresolved merges with"
341 333 " locally modified files.\n"))
342 334
343 335 repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
344 336 return unresolved
345 337
@@ -1,78 +1,78 b''
1 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
2 2 pulling from ../test-a
3 3 searching for changes
4 4 adding changesets
5 5 adding manifests
6 6 adding file changes
7 7 added 1 changesets with 1 changes to 1 files (+1 heads)
8 8 (run 'hg heads' to see heads, 'hg merge' to merge)
9 9 merge: warning: conflicts during merge
10 10 merging test.txt
11 11 merging test.txt failed!
12 12 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
13 13 There are unresolved merges, you can redo the full merge using:
14 14 hg update -C 1
15 15 hg merge 2
16 16 pulling from ../test-a
17 17 searching for changes
18 18 adding changesets
19 19 adding manifests
20 20 adding file changes
21 21 added 1 changesets with 1 changes to 1 files (+1 heads)
22 22 (run 'hg heads' to see heads, 'hg merge' to merge)
23 23 merge: warning: conflicts during merge
24 24 resolving manifests
25 25 overwrite None branchmerge True partial False
26 26 ancestor 451c744aabcc local a070d41e8360 remote faaea63e63a9
27 test.txt versions differ, resolve
27 test.txt: versions differ -> m
28 28 merging test.txt
29 29 resolving test.txt
30 30 file test.txt: my fc3148072371 other d40249267ae3 ancestor 8fe46a3eb557
31 31 merging test.txt failed!
32 32 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 33 There are unresolved merges, you can redo the full merge using:
34 34 hg update -C 3
35 35 hg merge 4
36 36 one
37 37 <<<<<<<
38 38 two-point-five
39 39 =======
40 40 two-point-one
41 41 >>>>>>>
42 42 three
43 43 rev offset length base linkrev nodeid p1 p2
44 44 0 0 7 0 0 01365c4cca56 000000000000 000000000000
45 45 1 7 9 1 1 7b013192566a 01365c4cca56 000000000000
46 46 2 16 15 2 2 8fe46a3eb557 01365c4cca56 000000000000
47 47 3 31 27 2 3 fc3148072371 7b013192566a 8fe46a3eb557
48 48 4 58 25 4 4 d40249267ae3 8fe46a3eb557 000000000000
49 49 changeset: 4:a070d41e8360
50 50 tag: tip
51 51 parent: 2:faaea63e63a9
52 52 user: test
53 53 date: Mon Jan 12 13:46:40 1970 +0000
54 54 summary: two -> two-point-one
55 55
56 56 changeset: 3:451c744aabcc
57 57 parent: 1:e409be6afcc0
58 58 parent: 2:faaea63e63a9
59 59 user: test
60 60 date: Mon Jan 12 13:46:40 1970 +0000
61 61 summary: Merge 1
62 62
63 63 changeset: 2:faaea63e63a9
64 64 parent: 0:095c92b91f1a
65 65 user: test
66 66 date: Mon Jan 12 13:46:40 1970 +0000
67 67 summary: Numbers as words
68 68
69 69 changeset: 1:e409be6afcc0
70 70 user: test
71 71 date: Mon Jan 12 13:46:40 1970 +0000
72 72 summary: 2 -> 2.5
73 73
74 74 changeset: 0:095c92b91f1a
75 75 user: test
76 76 date: Mon Jan 12 13:46:40 1970 +0000
77 77 summary: Initial
78 78
@@ -1,141 +1,141 b''
1 1 adding a
2 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
3 3 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
4 4 diff -r 33aaa84a386b a
5 5 --- a/a
6 6 +++ b/a
7 7 @@ -1,1 +1,1 @@ a
8 8 -a
9 9 +abc
10 10 adding b
11 11 M a
12 12 changeset: 0:33aaa84a386b
13 13 user: test
14 14 date: Mon Jan 12 13:46:40 1970 +0000
15 15 summary: 1
16 16
17 17 resolving manifests
18 18 overwrite False branchmerge False partial False
19 19 ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
20 a versions differ, resolve
21 remote created b
20 a: versions differ -> m
21 b: remote created -> g
22 22 merging a
23 23 resolving a
24 24 file a: my b789fdd96dc2 other d730145abbf9 ancestor b789fdd96dc2
25 25 getting b
26 26 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
27 27 changeset: 1:802f095af299
28 28 tag: tip
29 29 user: test
30 30 date: Mon Jan 12 13:46:40 1970 +0000
31 31 summary: 2
32 32
33 33 resolving manifests
34 34 overwrite False branchmerge False partial False
35 35 ancestor 802f095af299 local 33aaa84a386b remote 33aaa84a386b
36 remote deleted b, clobbering
36 b: remote deleted -> r
37 37 removing b
38 38 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
39 39 changeset: 0:33aaa84a386b
40 40 user: test
41 41 date: Mon Jan 12 13:46:40 1970 +0000
42 42 summary: 1
43 43
44 44 abort: there is nothing to merge - use "hg update" instead
45 45 failed
46 46 changeset: 0:33aaa84a386b
47 47 user: test
48 48 date: Mon Jan 12 13:46:40 1970 +0000
49 49 summary: 1
50 50
51 51 resolving manifests
52 52 overwrite False branchmerge False partial False
53 53 ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
54 a versions differ, resolve
55 remote created b
54 a: versions differ -> m
55 b: remote created -> g
56 56 merging a
57 57 resolving a
58 58 file a: my b789fdd96dc2 other d730145abbf9 ancestor b789fdd96dc2
59 59 getting b
60 60 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
61 61 changeset: 1:802f095af299
62 62 tag: tip
63 63 user: test
64 64 date: Mon Jan 12 13:46:40 1970 +0000
65 65 summary: 2
66 66
67 67 changeset: 1:802f095af299
68 68 tag: tip
69 69 user: test
70 70 date: Mon Jan 12 13:46:40 1970 +0000
71 71 files: a b
72 72 description:
73 73 2
74 74
75 75
76 76 changeset: 0:33aaa84a386b
77 77 user: test
78 78 date: Mon Jan 12 13:46:40 1970 +0000
79 79 files: a
80 80 description:
81 81 1
82 82
83 83
84 84 diff -r 802f095af299 a
85 85 --- a/a
86 86 +++ b/a
87 87 @@ -1,1 +1,1 @@ a2
88 88 -a2
89 89 +abc
90 90 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
91 91 adding b
92 92 M a
93 93 changeset: 1:802f095af299
94 94 user: test
95 95 date: Mon Jan 12 13:46:40 1970 +0000
96 96 summary: 2
97 97
98 98 abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
99 99 failed
100 100 abort: outstanding uncommitted changes
101 101 failed
102 102 resolving manifests
103 103 overwrite False branchmerge True partial False
104 104 ancestor 802f095af299 local 030602aee63d remote 33aaa84a386b
105 a versions differ, resolve
106 b versions differ, resolve
105 a: versions differ -> m
106 b: versions differ -> m
107 107 merging a
108 108 resolving a
109 109 file a: my d730145abbf9 other 13e0d5f949fa ancestor b789fdd96dc2
110 110 merging b
111 111 resolving b
112 112 file b: my 1e88685f5dde other 61de8c7723ca ancestor 000000000000
113 113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
114 114 (branch merge, don't forget to commit)
115 115 changeset: 1:802f095af299
116 116 user: test
117 117 date: Mon Jan 12 13:46:40 1970 +0000
118 118 summary: 2
119 119
120 120 changeset: 2:030602aee63d
121 121 tag: tip
122 122 parent: 0:33aaa84a386b
123 123 user: test
124 124 date: Mon Jan 12 13:46:40 1970 +0000
125 125 summary: 3
126 126
127 127 diff -r 802f095af299 a
128 128 --- a/a
129 129 +++ b/a
130 130 @@ -1,1 +1,1 @@ a2
131 131 -a2
132 132 +abc
133 133 adding a
134 134 pulling from ../a
135 135 requesting all changes
136 136 adding changesets
137 137 adding manifests
138 138 adding file changes
139 139 added 1 changesets with 1 changes to 1 files
140 140 merging a
141 141 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -1,54 +1,54 b''
1 1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2 2 Main should be gone
3 3 a
4 4 changeset: 3:ded32b0db104
5 5 tag: tip
6 6 user: test
7 7 date: Mon Jan 12 13:46:40 1970 +0000
8 8 summary: Added side2
9 9
10 10 changeset: 2:92a816cea698
11 11 parent: 0:537353581d3d
12 12 user: test
13 13 date: Mon Jan 12 13:46:40 1970 +0000
14 14 summary: Added side1
15 15
16 16 changeset: 1:221226fb2bd8
17 17 user: test
18 18 date: Mon Jan 12 13:46:40 1970 +0000
19 19 summary: Added main
20 20
21 21 changeset: 0:537353581d3d
22 22 user: test
23 23 date: Mon Jan 12 13:46:40 1970 +0000
24 24 summary: Added a
25 25
26 26 Should have two heads, side2 and main
27 27 changeset: 3:ded32b0db104
28 28 tag: tip
29 29 user: test
30 30 date: Mon Jan 12 13:46:40 1970 +0000
31 31 summary: Added side2
32 32
33 33 changeset: 1:221226fb2bd8
34 34 user: test
35 35 date: Mon Jan 12 13:46:40 1970 +0000
36 36 summary: Added main
37 37
38 38 Should show a side1 side2
39 39 a
40 40 side1
41 41 side2
42 42 resolving manifests
43 43 overwrite True branchmerge False partial False
44 44 ancestor ded32b0db104 local 221226fb2bd8 remote 537353581d3d
45 remote deleted side2, clobbering
46 remote deleted side1, clobbering
47 remote created main
45 side2: remote deleted -> r
46 side1: remote deleted -> r
47 main: remote created -> g
48 48 getting main
49 49 removing side1
50 50 removing side2
51 51 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
52 52 Should only show a main
53 53 a
54 54 main
General Comments 0
You need to be logged in to leave comments. Login now