Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/cmdutil.py @ 5607:e9bae5c80ab4
copy: minor cleanups
- add after and dryrun variables
- add some comments
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Fri, 07 Dec 2007 02:01:10 -0600 |
parents | 447ea621e50e |
children | 784eadabd985 |
comparison
equal
deleted
inserted
replaced
5606:447ea621e50e | 5607:e9bae5c80ab4 |
---|---|
292 # hgsep => pathname that uses "/" to separate directories | 292 # hgsep => pathname that uses "/" to separate directories |
293 # ossep => pathname that uses os.sep to separate directories | 293 # ossep => pathname that uses os.sep to separate directories |
294 cwd = repo.getcwd() | 294 cwd = repo.getcwd() |
295 copied = [] | 295 copied = [] |
296 targets = {} | 296 targets = {} |
297 after = opts.get("after") | |
298 dryrun = opts.get("dry_run") | |
297 | 299 |
298 def walkpat(pat): | 300 def walkpat(pat): |
299 srcs = [] | 301 srcs = [] |
300 for tag, abs, rel, exact in walk(repo, [pat], opts, globbed=True): | 302 for tag, abs, rel, exact in walk(repo, [pat], opts, globbed=True): |
301 state = repo.dirstate[abs] | 303 state = repo.dirstate[abs] |
315 # relsrc: ossep | 317 # relsrc: ossep |
316 # otarget: ossep | 318 # otarget: ossep |
317 def copyfile(abssrc, relsrc, otarget, exact): | 319 def copyfile(abssrc, relsrc, otarget, exact): |
318 abstarget = util.canonpath(repo.root, cwd, otarget) | 320 abstarget = util.canonpath(repo.root, cwd, otarget) |
319 reltarget = repo.pathto(abstarget, cwd) | 321 reltarget = repo.pathto(abstarget, cwd) |
322 target = repo.wjoin(abstarget) | |
323 src = repo.wjoin(abssrc) | |
324 | |
325 # check for collisions | |
320 prevsrc = targets.get(abstarget) | 326 prevsrc = targets.get(abstarget) |
321 src = repo.wjoin(abssrc) | |
322 target = repo.wjoin(abstarget) | |
323 if prevsrc is not None: | 327 if prevsrc is not None: |
324 ui.warn(_('%s: not overwriting - %s collides with %s\n') % | 328 ui.warn(_('%s: not overwriting - %s collides with %s\n') % |
325 (reltarget, repo.pathto(abssrc, cwd), | 329 (reltarget, repo.pathto(abssrc, cwd), |
326 repo.pathto(prevsrc, cwd))) | 330 repo.pathto(prevsrc, cwd))) |
327 return | 331 return |
328 if (not opts['after'] and os.path.exists(target) or | 332 |
329 opts['after'] and repo.dirstate[abstarget] in 'mn'): | 333 # check for overwrites |
334 if (not after and os.path.exists(target) or | |
335 after and repo.dirstate[abstarget] in 'mn'): | |
330 if not opts['force']: | 336 if not opts['force']: |
331 ui.warn(_('%s: not overwriting - file exists\n') % | 337 ui.warn(_('%s: not overwriting - file exists\n') % |
332 reltarget) | 338 reltarget) |
333 return | 339 return |
334 if not opts['after'] and not opts.get('dry_run'): | 340 if not after and not dryrun: |
335 os.unlink(target) | 341 os.unlink(target) |
336 if opts['after']: | 342 |
343 if after: | |
337 if not os.path.exists(target): | 344 if not os.path.exists(target): |
338 return | 345 return |
339 else: | 346 else: |
340 targetdir = os.path.dirname(target) or '.' | 347 targetdir = os.path.dirname(target) or '.' |
341 if not os.path.isdir(targetdir) and not opts.get('dry_run'): | 348 if not os.path.isdir(targetdir) and not dryrun: |
342 os.makedirs(targetdir) | 349 os.makedirs(targetdir) |
343 try: | 350 try: |
344 restore = repo.dirstate[abstarget] == 'r' | 351 restore = repo.dirstate[abstarget] == 'r' |
345 if restore and not opts.get('dry_run'): | 352 if restore and not dryrun: |
346 repo.undelete([abstarget]) | 353 repo.undelete([abstarget]) |
347 try: | 354 try: |
348 if not opts.get('dry_run'): | 355 if not dryrun: |
349 util.copyfile(src, target) | 356 util.copyfile(src, target) |
350 restore = False | 357 restore = False |
351 finally: | 358 finally: |
352 if restore: | 359 if restore: |
353 repo.remove([abstarget]) | 360 repo.remove([abstarget]) |
356 ui.warn(_('%s: deleted in working copy\n') % relsrc) | 363 ui.warn(_('%s: deleted in working copy\n') % relsrc) |
357 else: | 364 else: |
358 ui.warn(_('%s: cannot copy - %s\n') % | 365 ui.warn(_('%s: cannot copy - %s\n') % |
359 (relsrc, inst.strerror)) | 366 (relsrc, inst.strerror)) |
360 return True # report a failure | 367 return True # report a failure |
368 | |
361 if ui.verbose or not exact: | 369 if ui.verbose or not exact: |
362 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) | 370 ui.status(_('copying %s to %s\n') % (relsrc, reltarget)) |
363 targets[abstarget] = abssrc | 371 targets[abstarget] = abssrc |
372 | |
373 # fix up dirstate | |
364 origsrc = repo.dirstate.copied(abssrc) or abssrc | 374 origsrc = repo.dirstate.copied(abssrc) or abssrc |
365 if abstarget == origsrc: # copying back a copy? | 375 if abstarget == origsrc: # copying back a copy? |
366 if repo.dirstate[abstarget] not in 'mn': | 376 if repo.dirstate[abstarget] not in 'mn': |
367 if not opts.get('dry_run'): | 377 if not dryrun: |
368 repo.add([abstarget]) | 378 repo.add([abstarget]) |
369 else: | 379 else: |
370 if repo.dirstate[origsrc] == 'a': | 380 if repo.dirstate[origsrc] == 'a': |
371 if not ui.quiet: | 381 if not ui.quiet: |
372 ui.warn(_("%s has not been committed yet, so no copy " | 382 ui.warn(_("%s has not been committed yet, so no copy " |
373 "data will be stored for %s.\n") | 383 "data will be stored for %s.\n") |
374 % (repo.pathto(origsrc, cwd), reltarget)) | 384 % (repo.pathto(origsrc, cwd), reltarget)) |
375 if abstarget not in repo.dirstate and not opts.get('dry_run'): | 385 if abstarget not in repo.dirstate and not dryrun: |
376 repo.add([abstarget]) | 386 repo.add([abstarget]) |
377 elif not opts.get('dry_run'): | 387 elif not dryrun: |
378 repo.copy(origsrc, abstarget) | 388 repo.copy(origsrc, abstarget) |
379 copied.append((abssrc, relsrc, exact)) | 389 copied.append((abssrc, relsrc, exact)) |
380 | 390 |
381 # pat: ossep | 391 # pat: ossep |
382 # dest ossep | 392 # dest ossep |
456 if len(pats) > 1 or util.patkind(pats[0], None)[0]: | 466 if len(pats) > 1 or util.patkind(pats[0], None)[0]: |
457 raise util.Abort(_('with multiple sources, destination must be an ' | 467 raise util.Abort(_('with multiple sources, destination must be an ' |
458 'existing directory')) | 468 'existing directory')) |
459 if dest.endswith(os.sep) or os.altsep and dest.endswith(os.altsep): | 469 if dest.endswith(os.sep) or os.altsep and dest.endswith(os.altsep): |
460 raise util.Abort(_('destination %s is not a directory') % dest) | 470 raise util.Abort(_('destination %s is not a directory') % dest) |
461 if opts['after']: | 471 |
472 tfn = targetpathfn | |
473 if after: | |
462 tfn = targetpathafterfn | 474 tfn = targetpathafterfn |
463 else: | |
464 tfn = targetpathfn | |
465 copylist = [] | 475 copylist = [] |
466 for pat in pats: | 476 for pat in pats: |
467 srcs = walkpat(pat) | 477 srcs = walkpat(pat) |
468 if not srcs: | 478 if not srcs: |
469 continue | 479 continue |