Mercurial > public > mercurial-scm > hg
comparison mercurial/cmdutil.py @ 5608:784eadabd985
copy: simplify inner copy
- save dirstate lookup and exists check
- do all fs work inside a single dryrun clause
- move unlinking into inner copy section
- move target dir creation
- eliminate undelete mess
- fix a bug on mv a -> b -> a after merge
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 07 Dec 2007 02:01:13 -0600 |
parents | e9bae5c80ab4 |
children | a783d3627144 |
comparison
equal
deleted
inserted
replaced
5607:e9bae5c80ab4 | 5608:784eadabd985 |
---|---|
319 def copyfile(abssrc, relsrc, otarget, exact): | 319 def copyfile(abssrc, relsrc, otarget, exact): |
320 abstarget = util.canonpath(repo.root, cwd, otarget) | 320 abstarget = util.canonpath(repo.root, cwd, otarget) |
321 reltarget = repo.pathto(abstarget, cwd) | 321 reltarget = repo.pathto(abstarget, cwd) |
322 target = repo.wjoin(abstarget) | 322 target = repo.wjoin(abstarget) |
323 src = repo.wjoin(abssrc) | 323 src = repo.wjoin(abssrc) |
324 state = repo.dirstate[abstarget] | |
324 | 325 |
325 # check for collisions | 326 # check for collisions |
326 prevsrc = targets.get(abstarget) | 327 prevsrc = targets.get(abstarget) |
327 if prevsrc is not None: | 328 if prevsrc is not None: |
328 ui.warn(_('%s: not overwriting - %s collides with %s\n') % | 329 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
329 (reltarget, repo.pathto(abssrc, cwd), | 330 (reltarget, repo.pathto(abssrc, cwd), |
330 repo.pathto(prevsrc, cwd))) | 331 repo.pathto(prevsrc, cwd))) |
331 return | 332 return |
332 | 333 |
333 # check for overwrites | 334 # check for overwrites |
334 if (not after and os.path.exists(target) or | 335 exists = os.path.exists(target) |
335 after and repo.dirstate[abstarget] in 'mn'): | 336 if (not after and exists or after and state in 'mn'): |
336 if not opts['force']: | 337 if not opts['force']: |
337 ui.warn(_('%s: not overwriting - file exists\n') % | 338 ui.warn(_('%s: not overwriting - file exists\n') % |
338 reltarget) | 339 reltarget) |
339 return | 340 return |
340 if not after and not dryrun: | |
341 os.unlink(target) | |
342 | 341 |
343 if after: | 342 if after: |
344 if not os.path.exists(target): | 343 if not exists: |
345 return | 344 return |
346 else: | 345 elif not dryrun: |
347 targetdir = os.path.dirname(target) or '.' | |
348 if not os.path.isdir(targetdir) and not dryrun: | |
349 os.makedirs(targetdir) | |
350 try: | 346 try: |
351 restore = repo.dirstate[abstarget] == 'r' | 347 if exists: |
352 if restore and not dryrun: | 348 os.unlink(target) |
353 repo.undelete([abstarget]) | 349 targetdir = os.path.dirname(target) or '.' |
354 try: | 350 if not os.path.isdir(targetdir): |
355 if not dryrun: | 351 os.makedirs(targetdir) |
356 util.copyfile(src, target) | 352 util.copyfile(src, target) |
357 restore = False | |
358 finally: | |
359 if restore: | |
360 repo.remove([abstarget]) | |
361 except IOError, inst: | 353 except IOError, inst: |
362 if inst.errno == errno.ENOENT: | 354 if inst.errno == errno.ENOENT: |
363 ui.warn(_('%s: deleted in working copy\n') % relsrc) | 355 ui.warn(_('%s: deleted in working copy\n') % relsrc) |
364 else: | 356 else: |
365 ui.warn(_('%s: cannot copy - %s\n') % | 357 ui.warn(_('%s: cannot copy - %s\n') % |
366 (relsrc, inst.strerror)) | 358 (relsrc, inst.strerror)) |
367 return True # report a failure | 359 return True # report a failure |
368 | 360 |
369 if ui.verbose or not exact: | 361 if ui.verbose or not exact: |
370 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) | 362 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) |
363 | |
371 targets[abstarget] = abssrc | 364 targets[abstarget] = abssrc |
372 | 365 |
373 # fix up dirstate | 366 # fix up dirstate |
374 origsrc = repo.dirstate.copied(abssrc) or abssrc | 367 origsrc = repo.dirstate.copied(abssrc) or abssrc |
375 if abstarget == origsrc: # copying back a copy? | 368 if abstarget == origsrc: # copying back a copy? |
376 if repo.dirstate[abstarget] not in 'mn': | 369 if state not in 'mn' and not dryrun: |
377 if not dryrun: | 370 repo.dirstate.normallookup(abstarget) |
378 repo.add([abstarget]) | |
379 else: | 371 else: |
380 if repo.dirstate[origsrc] == 'a': | 372 if repo.dirstate[origsrc] == 'a': |
381 if not ui.quiet: | 373 if not ui.quiet: |
382 ui.warn(_("%s has not been committed yet, so no copy " | 374 ui.warn(_("%s has not been committed yet, so no copy " |
383 "data will be stored for %s.\n") | 375 "data will be stored for %s.\n") |