435 except ValueError, inst: |
435 except ValueError, inst: |
436 raise util.Abort(str(inst)) |
436 raise util.Abort(str(inst)) |
437 |
437 |
438 def docopy(ui, repo, pats, opts, wlock): |
438 def docopy(ui, repo, pats, opts, wlock): |
439 # called with the repo lock held |
439 # called with the repo lock held |
|
440 # |
|
441 # hgsep => pathname that uses "/" to separate directories |
|
442 # ossep => pathname that uses os.sep to separate directories |
440 cwd = repo.getcwd() |
443 cwd = repo.getcwd() |
441 errors = 0 |
444 errors = 0 |
442 copied = [] |
445 copied = [] |
443 targets = {} |
446 targets = {} |
444 |
447 |
|
448 # abs: hgsep |
|
449 # rel: ossep |
|
450 # return: hgsep |
445 def okaytocopy(abs, rel, exact): |
451 def okaytocopy(abs, rel, exact): |
446 reasons = {'?': _('is not managed'), |
452 reasons = {'?': _('is not managed'), |
447 'a': _('has been marked for add'), |
453 'a': _('has been marked for add'), |
448 'r': _('has been marked for remove')} |
454 'r': _('has been marked for remove')} |
449 state = repo.dirstate.state(abs) |
455 state = repo.dirstate.state(abs) |
456 if exact: |
462 if exact: |
457 ui.warn(_('%s: not copying - file %s\n') % (rel, reason)) |
463 ui.warn(_('%s: not copying - file %s\n') % (rel, reason)) |
458 else: |
464 else: |
459 return abs |
465 return abs |
460 |
466 |
|
467 # origsrc: hgsep |
|
468 # abssrc: hgsep |
|
469 # relsrc: ossep |
|
470 # target: ossep |
461 def copy(origsrc, abssrc, relsrc, target, exact): |
471 def copy(origsrc, abssrc, relsrc, target, exact): |
462 abstarget = util.canonpath(repo.root, cwd, target) |
472 abstarget = util.canonpath(repo.root, cwd, target) |
463 reltarget = util.pathto(cwd, abstarget) |
473 reltarget = util.pathto(cwd, abstarget) |
464 prevsrc = targets.get(abstarget) |
474 prevsrc = targets.get(abstarget) |
465 if prevsrc is not None: |
475 if prevsrc is not None: |
466 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
476 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
467 (reltarget, abssrc, prevsrc)) |
477 (reltarget, util.localpath(abssrc), |
|
478 util.localpath(prevsrc))) |
468 return |
479 return |
469 if (not opts['after'] and os.path.exists(reltarget) or |
480 if (not opts['after'] and os.path.exists(reltarget) or |
470 opts['after'] and repo.dirstate.state(abstarget) not in '?r'): |
481 opts['after'] and repo.dirstate.state(abstarget) not in '?r'): |
471 if not opts['force']: |
482 if not opts['force']: |
472 ui.warn(_('%s: not overwriting - file exists\n') % |
483 ui.warn(_('%s: not overwriting - file exists\n') % |
505 targets[abstarget] = abssrc |
516 targets[abstarget] = abssrc |
506 if abstarget != origsrc and not opts.get('dry_run'): |
517 if abstarget != origsrc and not opts.get('dry_run'): |
507 repo.copy(origsrc, abstarget, wlock) |
518 repo.copy(origsrc, abstarget, wlock) |
508 copied.append((abssrc, relsrc, exact)) |
519 copied.append((abssrc, relsrc, exact)) |
509 |
520 |
|
521 # pat: ossep |
|
522 # dest ossep |
|
523 # srcs: list of (hgsep, hgsep, ossep, bool) |
|
524 # return: function that takes hgsep and returns ossep |
510 def targetpathfn(pat, dest, srcs): |
525 def targetpathfn(pat, dest, srcs): |
511 if os.path.isdir(pat): |
526 if os.path.isdir(pat): |
512 abspfx = util.canonpath(repo.root, cwd, pat) |
527 abspfx = util.canonpath(repo.root, cwd, pat) |
|
528 abspfx = util.localpath(abspfx) |
513 if destdirexists: |
529 if destdirexists: |
514 striplen = len(os.path.split(abspfx)[0]) |
530 striplen = len(os.path.split(abspfx)[0]) |
515 else: |
531 else: |
516 striplen = len(abspfx) |
532 striplen = len(abspfx) |
517 if striplen: |
533 if striplen: |
518 striplen += len(os.sep) |
534 striplen += len(os.sep) |
519 res = lambda p: os.path.join(dest, p[striplen:]) |
535 res = lambda p: os.path.join(dest, util.localpath(p)[striplen:]) |
520 elif destdirexists: |
536 elif destdirexists: |
521 res = lambda p: os.path.join(dest, os.path.basename(p)) |
537 res = lambda p: os.path.join(dest, |
|
538 os.path.basename(util.localpath(p))) |
522 else: |
539 else: |
523 res = lambda p: dest |
540 res = lambda p: dest |
524 return res |
541 return res |
525 |
542 |
|
543 # pat: ossep |
|
544 # dest ossep |
|
545 # srcs: list of (hgsep, hgsep, ossep, bool) |
|
546 # return: function that takes hgsep and returns ossep |
526 def targetpathafterfn(pat, dest, srcs): |
547 def targetpathafterfn(pat, dest, srcs): |
527 if util.patkind(pat, None)[0]: |
548 if util.patkind(pat, None)[0]: |
528 # a mercurial pattern |
549 # a mercurial pattern |
529 res = lambda p: os.path.join(dest, os.path.basename(p)) |
550 res = lambda p: os.path.join(dest, |
|
551 os.path.basename(util.localpath(p))) |
530 else: |
552 else: |
531 abspfx = util.canonpath(repo.root, cwd, pat) |
553 abspfx = util.canonpath(repo.root, cwd, pat) |
532 if len(abspfx) < len(srcs[0][0]): |
554 if len(abspfx) < len(srcs[0][0]): |
533 # A directory. Either the target path contains the last |
555 # A directory. Either the target path contains the last |
534 # component of the source path or it does not. |
556 # component of the source path or it does not. |
535 def evalpath(striplen): |
557 def evalpath(striplen): |
536 score = 0 |
558 score = 0 |
537 for s in srcs: |
559 for s in srcs: |
538 t = os.path.join(dest, s[0][striplen:]) |
560 t = os.path.join(dest, util.localpath(s[0])[striplen:]) |
539 if os.path.exists(t): |
561 if os.path.exists(t): |
540 score += 1 |
562 score += 1 |
541 return score |
563 return score |
542 |
564 |
|
565 abspfx = util.localpath(abspfx) |
543 striplen = len(abspfx) |
566 striplen = len(abspfx) |
544 if striplen: |
567 if striplen: |
545 striplen += len(os.sep) |
568 striplen += len(os.sep) |
546 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])): |
569 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])): |
547 score = evalpath(striplen) |
570 score = evalpath(striplen) |
548 striplen1 = len(os.path.split(abspfx)[0]) |
571 striplen1 = len(os.path.split(abspfx)[0]) |
549 if striplen1: |
572 if striplen1: |
550 striplen1 += len(os.sep) |
573 striplen1 += len(os.sep) |
551 if evalpath(striplen1) > score: |
574 if evalpath(striplen1) > score: |
552 striplen = striplen1 |
575 striplen = striplen1 |
553 res = lambda p: os.path.join(dest, p[striplen:]) |
576 res = lambda p: os.path.join(dest, |
|
577 util.localpath(p)[striplen:]) |
554 else: |
578 else: |
555 # a file |
579 # a file |
556 if destdirexists: |
580 if destdirexists: |
557 res = lambda p: os.path.join(dest, os.path.basename(p)) |
581 res = lambda p: os.path.join(dest, |
|
582 os.path.basename(util.localpath(p))) |
558 else: |
583 else: |
559 res = lambda p: dest |
584 res = lambda p: dest |
560 return res |
585 return res |
561 |
586 |
562 |
587 |