comparison mercurial/cmdutil.py @ 16283:6c4dbe28dda3 stable

rename: handle case-changing (issue1717)
author Matt Mackall <mpm@selenic.com>
date Fri, 23 Mar 2012 11:47:27 -0500
parents 60101427d618
children a740fa28d718
comparison
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