mercurial/commands.py
changeset 3652 d2d8d23944a9
parent 3648 b984dcb1df71
child 3672 e8730b5b8a32
equal deleted inserted replaced
3651:48768b1ab23c 3652:d2d8d23944a9
   827     except ValueError, inst:
   827     except ValueError, inst:
   828         raise util.Abort(str(inst))
   828         raise util.Abort(str(inst))
   829 
   829 
   830 def docopy(ui, repo, pats, opts, wlock):
   830 def docopy(ui, repo, pats, opts, wlock):
   831     # called with the repo lock held
   831     # called with the repo lock held
       
   832     #
       
   833     # hgsep => pathname that uses "/" to separate directories
       
   834     # ossep => pathname that uses os.sep to separate directories
   832     cwd = repo.getcwd()
   835     cwd = repo.getcwd()
   833     errors = 0
   836     errors = 0
   834     copied = []
   837     copied = []
   835     targets = {}
   838     targets = {}
   836 
   839 
       
   840     # abs: hgsep
       
   841     # rel: ossep
       
   842     # return: hgsep
   837     def okaytocopy(abs, rel, exact):
   843     def okaytocopy(abs, rel, exact):
   838         reasons = {'?': _('is not managed'),
   844         reasons = {'?': _('is not managed'),
   839                    'a': _('has been marked for add'),
   845                    'a': _('has been marked for add'),
   840                    'r': _('has been marked for remove')}
   846                    'r': _('has been marked for remove')}
   841         state = repo.dirstate.state(abs)
   847         state = repo.dirstate.state(abs)
   848             if exact:
   854             if exact:
   849                 ui.warn(_('%s: not copying - file %s\n') % (rel, reason))
   855                 ui.warn(_('%s: not copying - file %s\n') % (rel, reason))
   850         else:
   856         else:
   851             return abs
   857             return abs
   852 
   858 
       
   859     # origsrc: hgsep
       
   860     # abssrc: hgsep
       
   861     # relsrc: ossep
       
   862     # target: ossep
   853     def copy(origsrc, abssrc, relsrc, target, exact):
   863     def copy(origsrc, abssrc, relsrc, target, exact):
   854         abstarget = util.canonpath(repo.root, cwd, target)
   864         abstarget = util.canonpath(repo.root, cwd, target)
   855         reltarget = util.pathto(cwd, abstarget)
   865         reltarget = util.pathto(cwd, abstarget)
   856         prevsrc = targets.get(abstarget)
   866         prevsrc = targets.get(abstarget)
   857         if prevsrc is not None:
   867         if prevsrc is not None:
   858             ui.warn(_('%s: not overwriting - %s collides with %s\n') %
   868             ui.warn(_('%s: not overwriting - %s collides with %s\n') %
   859                     (reltarget, abssrc, prevsrc))
   869                     (reltarget, util.localpath(abssrc),
       
   870                      util.localpath(prevsrc)))
   860             return
   871             return
   861         if (not opts['after'] and os.path.exists(reltarget) or
   872         if (not opts['after'] and os.path.exists(reltarget) or
   862             opts['after'] and repo.dirstate.state(abstarget) not in '?r'):
   873             opts['after'] and repo.dirstate.state(abstarget) not in '?r'):
   863             if not opts['force']:
   874             if not opts['force']:
   864                 ui.warn(_('%s: not overwriting - file exists\n') %
   875                 ui.warn(_('%s: not overwriting - file exists\n') %
   897         targets[abstarget] = abssrc
   908         targets[abstarget] = abssrc
   898         if abstarget != origsrc and not opts.get('dry_run'):
   909         if abstarget != origsrc and not opts.get('dry_run'):
   899             repo.copy(origsrc, abstarget, wlock)
   910             repo.copy(origsrc, abstarget, wlock)
   900         copied.append((abssrc, relsrc, exact))
   911         copied.append((abssrc, relsrc, exact))
   901 
   912 
       
   913     # pat: ossep
       
   914     # dest ossep
       
   915     # srcs: list of (hgsep, hgsep, ossep, bool)
       
   916     # return: function that takes hgsep and returns ossep
   902     def targetpathfn(pat, dest, srcs):
   917     def targetpathfn(pat, dest, srcs):
   903         if os.path.isdir(pat):
   918         if os.path.isdir(pat):
   904             abspfx = util.canonpath(repo.root, cwd, pat)
   919             abspfx = util.canonpath(repo.root, cwd, pat)
       
   920             abspfx = util.localpath(abspfx)
   905             if destdirexists:
   921             if destdirexists:
   906                 striplen = len(os.path.split(abspfx)[0])
   922                 striplen = len(os.path.split(abspfx)[0])
   907             else:
   923             else:
   908                 striplen = len(abspfx)
   924                 striplen = len(abspfx)
   909             if striplen:
   925             if striplen:
   910                 striplen += len(os.sep)
   926                 striplen += len(os.sep)
   911             res = lambda p: os.path.join(dest, p[striplen:])
   927             res = lambda p: os.path.join(dest, util.localpath(p)[striplen:])
   912         elif destdirexists:
   928         elif destdirexists:
   913             res = lambda p: os.path.join(dest, os.path.basename(p))
   929             res = lambda p: os.path.join(dest,
       
   930                                          os.path.basename(util.localpath(p)))
   914         else:
   931         else:
   915             res = lambda p: dest
   932             res = lambda p: dest
   916         return res
   933         return res
   917 
   934 
       
   935     # pat: ossep
       
   936     # dest ossep
       
   937     # srcs: list of (hgsep, hgsep, ossep, bool)
       
   938     # return: function that takes hgsep and returns ossep
   918     def targetpathafterfn(pat, dest, srcs):
   939     def targetpathafterfn(pat, dest, srcs):
   919         if util.patkind(pat, None)[0]:
   940         if util.patkind(pat, None)[0]:
   920             # a mercurial pattern
   941             # a mercurial pattern
   921             res = lambda p: os.path.join(dest, os.path.basename(p))
   942             res = lambda p: os.path.join(dest,
       
   943                                          os.path.basename(util.localpath(p)))
   922         else:
   944         else:
   923             abspfx = util.canonpath(repo.root, cwd, pat)
   945             abspfx = util.canonpath(repo.root, cwd, pat)
   924             if len(abspfx) < len(srcs[0][0]):
   946             if len(abspfx) < len(srcs[0][0]):
   925                 # A directory. Either the target path contains the last
   947                 # A directory. Either the target path contains the last
   926                 # component of the source path or it does not.
   948                 # component of the source path or it does not.
   927                 def evalpath(striplen):
   949                 def evalpath(striplen):
   928                     score = 0
   950                     score = 0
   929                     for s in srcs:
   951                     for s in srcs:
   930                         t = os.path.join(dest, s[0][striplen:])
   952                         t = os.path.join(dest, util.localpath(s[0])[striplen:])
   931                         if os.path.exists(t):
   953                         if os.path.exists(t):
   932                             score += 1
   954                             score += 1
   933                     return score
   955                     return score
   934 
   956 
       
   957                 abspfx = util.localpath(abspfx)
   935                 striplen = len(abspfx)
   958                 striplen = len(abspfx)
   936                 if striplen:
   959                 if striplen:
   937                     striplen += len(os.sep)
   960                     striplen += len(os.sep)
   938                 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
   961                 if os.path.isdir(os.path.join(dest, os.path.split(abspfx)[1])):
   939                     score = evalpath(striplen)
   962                     score = evalpath(striplen)
   940                     striplen1 = len(os.path.split(abspfx)[0])
   963                     striplen1 = len(os.path.split(abspfx)[0])
   941                     if striplen1:
   964                     if striplen1:
   942                         striplen1 += len(os.sep)
   965                         striplen1 += len(os.sep)
   943                     if evalpath(striplen1) > score:
   966                     if evalpath(striplen1) > score:
   944                         striplen = striplen1
   967                         striplen = striplen1
   945                 res = lambda p: os.path.join(dest, p[striplen:])
   968                 res = lambda p: os.path.join(dest,
       
   969                                              util.localpath(p)[striplen:])
   946             else:
   970             else:
   947                 # a file
   971                 # a file
   948                 if destdirexists:
   972                 if destdirexists:
   949                     res = lambda p: os.path.join(dest, os.path.basename(p))
   973                     res = lambda p: os.path.join(dest,
       
   974                                         os.path.basename(util.localpath(p)))
   950                 else:
   975                 else:
   951                     res = lambda p: dest
   976                     res = lambda p: dest
   952         return res
   977         return res
   953 
   978 
   954 
   979