mercurial/cmdutil.py
branchstable
changeset 16283 6c4dbe28dda3
parent 16165 60101427d618
child 16304 a740fa28d718
equal deleted inserted replaced
16282:50247a7a9983 16283:6c4dbe28dda3
   283                      repo.pathto(prevsrc, cwd)))
   283                      repo.pathto(prevsrc, cwd)))
   284             return
   284             return
   285 
   285 
   286         # check for overwrites
   286         # check for overwrites
   287         exists = os.path.lexists(target)
   287         exists = os.path.lexists(target)
       
   288         samefile = False
       
   289         if exists and abssrc != abstarget:
       
   290             if (repo.dirstate.normalize(abssrc) ==
       
   291                 repo.dirstate.normalize(abstarget)):
       
   292                 if not rename:
       
   293                     ui.warn(_("%s: can't copy - same file\n") % reltarget)
       
   294                     return
       
   295                 exists = False
       
   296                 samefile = True
       
   297 
   288         if not after and exists or after and state in 'mn':
   298         if not after and exists or after and state in 'mn':
   289             if not opts['force']:
   299             if not opts['force']:
   290                 ui.warn(_('%s: not overwriting - file exists\n') %
   300                 ui.warn(_('%s: not overwriting - file exists\n') %
   291                         reltarget)
   301                         reltarget)
   292                 return
   302                 return
   305                 if exists:
   315                 if exists:
   306                     os.unlink(target)
   316                     os.unlink(target)
   307                 targetdir = os.path.dirname(target) or '.'
   317                 targetdir = os.path.dirname(target) or '.'
   308                 if not os.path.isdir(targetdir):
   318                 if not os.path.isdir(targetdir):
   309                     os.makedirs(targetdir)
   319                     os.makedirs(targetdir)
   310                 util.copyfile(src, target)
   320                 if samefile:
       
   321                     tmp = target + "~hgrename"
       
   322                     os.rename(src, tmp)
       
   323                     os.rename(tmp, target)
       
   324                 else:
       
   325                     util.copyfile(src, target)
   311                 srcexists = True
   326                 srcexists = True
   312             except IOError, inst:
   327             except IOError, inst:
   313                 if inst.errno == errno.ENOENT:
   328                 if inst.errno == errno.ENOENT:
   314                     ui.warn(_('%s: deleted in working copy\n') % relsrc)
   329                     ui.warn(_('%s: deleted in working copy\n') % relsrc)
   315                     srcexists = False
   330                     srcexists = False
   328 
   343 
   329         # fix up dirstate
   344         # fix up dirstate
   330         scmutil.dirstatecopy(ui, repo, wctx, abssrc, abstarget,
   345         scmutil.dirstatecopy(ui, repo, wctx, abssrc, abstarget,
   331                              dryrun=dryrun, cwd=cwd)
   346                              dryrun=dryrun, cwd=cwd)
   332         if rename and not dryrun:
   347         if rename and not dryrun:
   333             if not after and srcexists:
   348             if not after and srcexists and not samefile:
   334                 util.unlinkpath(repo.wjoin(abssrc))
   349                 util.unlinkpath(repo.wjoin(abssrc))
   335             wctx.forget([abssrc])
   350             wctx.forget([abssrc])
   336 
   351 
   337     # pat: ossep
   352     # pat: ossep
   338     # dest ossep
   353     # dest ossep