Show More
@@ -348,7 +348,7 b' def updatedir(ui, repo, patches, similar' | |||
|
348 | 348 | |
|
349 | 349 | wctx = repo[None] |
|
350 | 350 | for src, dst in copies: |
|
351 | wctx.copy(src, dst) | |
|
351 | dirstatecopy(ui, repo, wctx, src, dst, cwd=cwd) | |
|
352 | 352 | if (not similarity) and removes: |
|
353 | 353 | wctx.remove(sorted(removes), True) |
|
354 | 354 | |
@@ -367,6 +367,25 b' def updatedir(ui, repo, patches, similar' | |||
|
367 | 367 | files.extend([r for r in removes if r not in files]) |
|
368 | 368 | return sorted(files) |
|
369 | 369 | |
|
370 | def dirstatecopy(ui, repo, wctx, src, dst, dryrun=False, cwd=None): | |
|
371 | """Update the dirstate to reflect the intent of copying src to dst. For | |
|
372 | different reasons it might not end with dst being marked as copied from src. | |
|
373 | """ | |
|
374 | origsrc = repo.dirstate.copied(src) or src | |
|
375 | if dst == origsrc: # copying back a copy? | |
|
376 | if repo.dirstate[dst] not in 'mn' and not dryrun: | |
|
377 | repo.dirstate.normallookup(dst) | |
|
378 | else: | |
|
379 | if repo.dirstate[origsrc] == 'a' and origsrc == src: | |
|
380 | if not ui.quiet: | |
|
381 | ui.warn(_("%s has not been committed yet, so no copy " | |
|
382 | "data will be stored for %s.\n") | |
|
383 | % (repo.pathto(origsrc, cwd), repo.pathto(dst, cwd))) | |
|
384 | if repo.dirstate[dst] in '?r' and not dryrun: | |
|
385 | wctx.add([dst]) | |
|
386 | elif not dryrun: | |
|
387 | wctx.copy(origsrc, dst) | |
|
388 | ||
|
370 | 389 | def copy(ui, repo, pats, opts, rename=False): |
|
371 | 390 | # called with the repo lock held |
|
372 | 391 | # |
@@ -458,21 +477,7 b' def copy(ui, repo, pats, opts, rename=Fa' | |||
|
458 | 477 | targets[abstarget] = abssrc |
|
459 | 478 | |
|
460 | 479 | # fix up dirstate |
|
461 | origsrc = repo.dirstate.copied(abssrc) or abssrc | |
|
462 | if abstarget == origsrc: # copying back a copy? | |
|
463 | if state not in 'mn' and not dryrun: | |
|
464 | repo.dirstate.normallookup(abstarget) | |
|
465 | else: | |
|
466 | if repo.dirstate[origsrc] == 'a' and origsrc == abssrc: | |
|
467 | if not ui.quiet: | |
|
468 | ui.warn(_("%s has not been committed yet, so no copy " | |
|
469 | "data will be stored for %s.\n") | |
|
470 | % (repo.pathto(origsrc, cwd), reltarget)) | |
|
471 | if repo.dirstate[abstarget] in '?r' and not dryrun: | |
|
472 | wctx.add([abstarget]) | |
|
473 | elif not dryrun: | |
|
474 | wctx.copy(origsrc, abstarget) | |
|
475 | ||
|
480 | dirstatecopy(ui, repo, wctx, abssrc, abstarget, dryrun=dryrun, cwd=cwd) | |
|
476 | 481 | if rename and not dryrun: |
|
477 | 482 | wctx.remove([abssrc], not after) |
|
478 | 483 |
@@ -361,4 +361,25 b' Move text file and patch as binary' | |||
|
361 | 361 | A binary2 |
|
362 | 362 | text2 |
|
363 | 363 | R text2 |
|
364 | $ cd .. | |
|
364 | 365 | |
|
366 | Consecutive import with renames (issue2459) | |
|
367 | ||
|
368 | $ hg init issue2459 | |
|
369 | $ cd issue2459 | |
|
370 | $ hg import --no-commit --force - <<EOF | |
|
371 | > diff --git a/a b/a | |
|
372 | > new file mode 100644 | |
|
373 | > EOF | |
|
374 | applying patch from stdin | |
|
375 | $ hg import --no-commit --force - <<EOF | |
|
376 | > diff --git a/a b/b | |
|
377 | > rename from a | |
|
378 | > rename to b | |
|
379 | > EOF | |
|
380 | applying patch from stdin | |
|
381 | a has not been committed yet, so no copy data will be stored for b. | |
|
382 | $ hg debugstate | |
|
383 | a 0 -1 unset b | |
|
384 | $ hg ci -m done | |
|
385 | $ cd .. |
General Comments 0
You need to be logged in to leave comments.
Login now