Mercurial > hg
comparison mercurial/merge.py @ 3372:ba7c74081861
merge: update dirstate correctly for non-branchmerge updates
- we don't actually need the context in recordupdates
- use -1 for filesize to force check on normal update
- only record copy for branchmerges
- forget moved files on update
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 13 Oct 2006 17:58:04 -0500 |
parents | 8c36b33a27c7 |
children | d2b55e3c4e25 |
comparison
equal
deleted
inserted
replaced
3371:8c36b33a27c7 | 3372:ba7c74081861 |
---|---|
310 flag = a[2] | 310 flag = a[2] |
311 util.set_exec(repo.wjoin(f), flag) | 311 util.set_exec(repo.wjoin(f), flag) |
312 | 312 |
313 return updated, merged, removed, unresolved | 313 return updated, merged, removed, unresolved |
314 | 314 |
315 def recordupdates(repo, action, branchmerge, mctx): | 315 def recordupdates(repo, action, branchmerge): |
316 "record merge actions to the dirstate" | 316 "record merge actions to the dirstate" |
317 | 317 |
318 for a in action: | 318 for a in action: |
319 f, m = a[:2] | 319 f, m = a[:2] |
320 if m == "r": # remove | 320 if m == "r": # remove |
333 f2, fd, flag, move = a[2:] | 333 f2, fd, flag, move = a[2:] |
334 if branchmerge: | 334 if branchmerge: |
335 # We've done a branch merge, mark this file as merged | 335 # We've done a branch merge, mark this file as merged |
336 # so that we properly record the merger later | 336 # so that we properly record the merger later |
337 repo.dirstate.update([fd], 'm') | 337 repo.dirstate.update([fd], 'm') |
338 if f != f2: # copy/rename | |
339 if move: | |
340 repo.dirstate.update([f], 'r') | |
341 if f != fd: | |
342 repo.dirstate.copy(f, fd) | |
343 else: | |
344 repo.dirstate.copy(f2, fd) | |
338 else: | 345 else: |
339 # We've update-merged a locally modified file, so | 346 # We've update-merged a locally modified file, so |
340 # we set the dirstate to emulate a normal checkout | 347 # we set the dirstate to emulate a normal checkout |
341 # of that file some time in the past. Thus our | 348 # of that file some time in the past. Thus our |
342 # merge will appear as a normal local file | 349 # merge will appear as a normal local file |
343 # modification. | 350 # modification. |
344 f_len = mctx.filectx(f).size() | 351 repo.dirstate.update([fd], 'n', st_size=-1, st_mtime=-1) |
345 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1) | |
346 if f != f2: # copy/rename | |
347 if move: | 352 if move: |
348 repo.dirstate.update([f], 'r') | 353 repo.dirstate.forget([f]) |
349 if f != fd: | |
350 repo.dirstate.copy(f, fd) | |
351 else: | |
352 repo.dirstate.copy(f2, fd) | |
353 | 354 |
354 def update(repo, node, branchmerge, force, partial, wlock): | 355 def update(repo, node, branchmerge, force, partial, wlock): |
355 """ | 356 """ |
356 Perform a merge between the working directory and the given node | 357 Perform a merge between the working directory and the given node |
357 | 358 |
401 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) | 402 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2) |
402 | 403 |
403 stats = applyupdates(repo, action, wc, p2) | 404 stats = applyupdates(repo, action, wc, p2) |
404 | 405 |
405 if not partial: | 406 if not partial: |
406 recordupdates(repo, action, branchmerge, p2) | 407 recordupdates(repo, action, branchmerge) |
407 repo.dirstate.setparents(fp1, fp2) | 408 repo.dirstate.setparents(fp1, fp2) |
408 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) | 409 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3]) |
409 | 410 |
410 return stats | 411 return stats |
411 | 412 |