mercurial/commands.py
changeset 3672 e8730b5b8a32
parent 3671 86d3f966201d
parent 3652 d2d8d23944a9
child 3673 eb0b4a2d70a9
equal deleted inserted replaced
3671:86d3f966201d 3672:e8730b5b8a32
   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