Mercurial > public > mercurial-scm > hg
comparison mercurial/merge.py @ 3308:ecc1bf27378c
merge: unify merge and copy actions
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Tue, 10 Oct 2006 00:41:55 -0500 |
parents | f009a6f12a59 |
children | e8be5942335d |
comparison
equal
deleted
inserted
replaced
3307:f009a6f12a59 | 3308:ecc1bf27378c |
---|---|
208 # are files different? | 208 # are files different? |
209 if n != m2[f]: | 209 if n != m2[f]: |
210 a = ma.get(f, nullid) | 210 a = ma.get(f, nullid) |
211 # are both different from the ancestor? | 211 # are both different from the ancestor? |
212 if not overwrite and n != a and m2[f] != a: | 212 if not overwrite and n != a and m2[f] != a: |
213 act("versions differ", "m", f, fmerge(f)) | 213 act("versions differ", "m", f, f, f, fmerge(f), False) |
214 # are we clobbering? | 214 # are we clobbering? |
215 # is remote's version newer? | 215 # is remote's version newer? |
216 # or are we going back in time and clean? | 216 # or are we going back in time and clean? |
217 elif overwrite or m2[f] != a or (backwards and not n[20:]): | 217 elif overwrite or m2[f] != a or (backwards and not n[20:]): |
218 act("remote is newer", "g", f, m2.execf(f)) | 218 act("remote is newer", "g", f, m2.execf(f)) |
224 if overwrite or fmerge(f) != m1.execf(f): | 224 if overwrite or fmerge(f) != m1.execf(f): |
225 act("update permissions", "e", f, m2.execf(f)) | 225 act("update permissions", "e", f, m2.execf(f)) |
226 elif f in copy: | 226 elif f in copy: |
227 f2 = copy[f] | 227 f2 = copy[f] |
228 if f in ma: # case 3,20 A/B/A | 228 if f in ma: # case 3,20 A/B/A |
229 act("remote moved", "c", | 229 act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True) |
230 f, f2, f2, fmerge(f, f2, f), True) | |
231 else: | 230 else: |
232 if f2 in m1: # case 2 A,B/B/B | 231 if f2 in m1: # case 2 A,B/B/B |
233 act("local copied", "c", | 232 act("local copied", "m", |
234 f, f2, f, fmerge(f, f2, f2), False) | 233 f, f2, f, fmerge(f, f2, f2), False) |
235 else: # case 4,21 A/B/B | 234 else: # case 4,21 A/B/B |
236 act("local moved", "c", | 235 act("local moved", "m", |
237 f, f2, f, fmerge(f, f2, f2), False) | 236 f, f2, f, fmerge(f, f2, f2), False) |
238 elif f in ma: | 237 elif f in ma: |
239 if n != ma[f] and not overwrite: | 238 if n != ma[f] and not overwrite: |
240 if repo.ui.prompt( | 239 if repo.ui.prompt( |
241 (_(" local changed %s which remote deleted\n") % f) + | 240 (_(" local changed %s which remote deleted\n") % f) + |
256 if f in copy: | 255 if f in copy: |
257 f2 = copy[f] | 256 f2 = copy[f] |
258 if f2 not in m2: # already seen | 257 if f2 not in m2: # already seen |
259 continue | 258 continue |
260 # rename case 1, A/A,B/A | 259 # rename case 1, A/A,B/A |
261 act("remote copied", "c", f2, f, f, fmerge(f2, f, f2), False) | 260 act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False) |
262 elif f in ma: | 261 elif f in ma: |
263 if overwrite or backwards: | 262 if overwrite or backwards: |
264 act("recreating", "g", f, m2.execf(f)) | 263 act("recreating", "g", f, m2.execf(f)) |
265 elif n != ma[f]: | 264 elif n != ma[f]: |
266 if repo.ui.prompt( | 265 if repo.ui.prompt( |
287 except OSError, inst: | 286 except OSError, inst: |
288 if inst.errno != errno.ENOENT: | 287 if inst.errno != errno.ENOENT: |
289 repo.ui.warn(_("update failed to remove %s: %s!\n") % | 288 repo.ui.warn(_("update failed to remove %s: %s!\n") % |
290 (f, inst.strerror)) | 289 (f, inst.strerror)) |
291 removed +=1 | 290 removed +=1 |
292 elif m == "c": # copy | 291 elif m == "m": # merge |
293 f2, fd, flag, move = a[2:] | 292 f2, fd, flag, move = a[2:] |
294 repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) | 293 if f != f2: |
294 repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd)) | |
295 else: | |
296 repo.ui.status(_("merging %s\n") % f) | |
295 if filemerge(repo, f, f2, fd, wctx, mctx, move): | 297 if filemerge(repo, f, f2, fd, wctx, mctx, move): |
296 unresolved += 1 | 298 unresolved += 1 |
297 util.set_exec(repo.wjoin(fd), flag) | 299 util.set_exec(repo.wjoin(fd), flag) |
298 merged += 1 | |
299 elif m == "m": # merge | |
300 flag = a[2] | |
301 repo.ui.status(_("merging %s\n") % f) | |
302 if filemerge(repo, f, f, f, wctx, mctx, False): | |
303 unresolved += 1 | |
304 util.set_exec(repo.wjoin(f), flag) | |
305 merged += 1 | 300 merged += 1 |
306 elif m == "g": # get | 301 elif m == "g": # get |
307 flag = a[2] | 302 flag = a[2] |
308 repo.ui.note(_("getting %s\n") % f) | 303 repo.ui.note(_("getting %s\n") % f) |
309 t = mctx.filectx(f).data() | 304 t = mctx.filectx(f).data() |
330 if branchmerge: | 325 if branchmerge: |
331 repo.dirstate.update([f], 'n', st_mtime=-1) | 326 repo.dirstate.update([f], 'n', st_mtime=-1) |
332 else: | 327 else: |
333 repo.dirstate.update([f], 'n') | 328 repo.dirstate.update([f], 'n') |
334 elif m == "m": # merge | 329 elif m == "m": # merge |
335 flag = a[2] | 330 f2, fd, flag, move = a[2:] |
336 if branchmerge: | 331 if branchmerge: |
337 # We've done a branch merge, mark this file as merged | 332 # We've done a branch merge, mark this file as merged |
338 # so that we properly record the merger later | 333 # so that we properly record the merger later |
339 repo.dirstate.update([f], 'm') | 334 repo.dirstate.update([fd], 'm') |
340 else: | 335 else: |
341 # We've update-merged a locally modified file, so | 336 # We've update-merged a locally modified file, so |
342 # we set the dirstate to emulate a normal checkout | 337 # we set the dirstate to emulate a normal checkout |
343 # of that file some time in the past. Thus our | 338 # of that file some time in the past. Thus our |
344 # merge will appear as a normal local file | 339 # merge will appear as a normal local file |
345 # modification. | 340 # modification. |
346 fl = repo.file(f) | |
347 f_len = mctx.filectx(f).size() | |
348 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1) | |
349 elif m == "c": # copy | |
350 f2, fd, flag, move = a[2:] | |
351 if branchmerge: | |
352 # We've done a branch merge, mark this file as merged | |
353 # so that we properly record the merger later | |
354 repo.dirstate.update([fd], 'm') | |
355 else: | |
356 # We've update-merged a locally modified file, so | |
357 # we set the dirstate to emulate a normal checkout | |
358 # of that file some time in the past. Thus our | |
359 # merge will appear as a normal local file | |
360 # modification. | |
361 fl = repo.file(f) | |
362 f_len = mctx.filectx(f).size() | 341 f_len = mctx.filectx(f).size() |
363 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1) | 342 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1) |
364 if move: | 343 if f != f2: # copy/rename |
365 repo.dirstate.update([f], 'r') | 344 if move: |
366 if f != fd: | 345 repo.dirstate.update([f], 'r') |
367 repo.dirstate.copy(f, fd) | 346 if f != fd: |
368 else: | 347 repo.dirstate.copy(f, fd) |
369 repo.dirstate.copy(f2, fd) | 348 else: |
349 repo.dirstate.copy(f2, fd) | |
370 | 350 |
371 def update(repo, node, branchmerge=False, force=False, partial=None, | 351 def update(repo, node, branchmerge=False, force=False, partial=None, |
372 wlock=None, show_stats=True, remind=True): | 352 wlock=None, show_stats=True, remind=True): |
373 | 353 |
374 overwrite = force and not branchmerge | 354 overwrite = force and not branchmerge |