Mercurial > hg > mercurial-crew-with-dirclash
comparison mercurial/commands.py @ 500:ebc4714a7632
[PATCH] Clean up destination directory if a clone fails.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[PATCH] Clean up destination directory if a clone fails.
From: Bryan O'Sullivan <bos@serpentine.com>
On Mon, 2005-06-27 at 16:27 +0800, Soh Tk-r28629 wrote:
> Hg clone left the dest directory if the source isn't valid.
> I think it should either validate the source before mkdir, or do a
> rmdir to clean it up.
Good suggestion, thanks. As validating the source in advance isn't
really practical, I opted for the latter.
manifest hash: 1508afddd2402142f9d8b2387652d4cb28ccc1f5
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (GNU/Linux)
iD8DBQFCwRGPywK+sNU5EO8RApBOAJ9Fj22MP3pYJhxWsj8BYbcgWzIOKwCff9yC
lX87RrDKicM1W61lBpQl20w=
=efck
-----END PGP SIGNATURE-----
author | mpm@selenic.com |
---|---|
date | Tue, 28 Jun 2005 00:59:59 -0800 |
parents | 81c563a254be |
children | c6a2e41c8c60 |
comparison
equal
deleted
inserted
replaced
499:81c563a254be | 500:ebc4714a7632 |
---|---|
232 f = name.find('@') | 232 f = name.find('@') |
233 if f >= 0: | 233 if f >= 0: |
234 name = name[:f] | 234 name = name[:f] |
235 bcache[rev] = name | 235 bcache[rev] = name |
236 return name | 236 return name |
237 | 237 |
238 bcache = {} | 238 bcache = {} |
239 opmap = [['user', getname], ['number', str], ['changeset', getnode]] | 239 opmap = [['user', getname], ['number', str], ['changeset', getnode]] |
240 if not ops['user'] and not ops['changeset']: | 240 if not ops['user'] and not ops['changeset']: |
241 ops['number'] = 1 | 241 ops['number'] = 1 |
242 | 242 |
271 for name, path in ui.configitems("paths"): | 271 for name, path in ui.configitems("paths"): |
272 paths[name] = path | 272 paths[name] = path |
273 | 273 |
274 if source in paths: source = paths[source] | 274 if source in paths: source = paths[source] |
275 | 275 |
276 created = False | |
277 | |
276 if dest is None: | 278 if dest is None: |
277 dest = os.getcwd() | 279 dest = os.getcwd() |
278 elif not os.path.exists(dest): | 280 elif not os.path.exists(dest): |
279 os.makedirs(dest) | 281 os.mkdir(dest) |
280 | 282 created = True |
281 link = 0 | 283 |
282 if not source.startswith("http://"): | 284 try: |
283 source = os.path.realpath(source) | 285 dest = os.path.realpath(dest) |
284 d1 = os.stat(dest).st_dev | 286 |
285 d2 = os.stat(source).st_dev | 287 link = 0 |
286 if d1 == d2: link = 1 | 288 if not source.startswith("http://"): |
287 | 289 source = os.path.realpath(source) |
288 os.chdir(dest) | 290 d1 = os.stat(dest).st_dev |
289 | 291 d2 = os.stat(source).st_dev |
290 if link: | 292 if d1 == d2: link = 1 |
291 ui.debug("copying by hardlink\n") | 293 |
292 os.system("cp -al %s/.hg .hg" % source) | 294 os.chdir(dest) |
293 try: | 295 |
294 os.remove(".hg/dirstate") | 296 if link: |
295 except: pass | 297 ui.debug("copying by hardlink\n") |
296 | 298 os.system("cp -al %s/.hg .hg" % source) |
297 repo = hg.repository(ui, ".") | 299 try: |
298 | 300 os.remove(".hg/dirstate") |
299 else: | 301 except: pass |
300 repo = hg.repository(ui, ".", create=1) | 302 |
301 other = hg.repository(ui, source) | 303 repo = hg.repository(ui, ".") |
302 cg = repo.getchangegroup(other) | 304 |
303 repo.addchangegroup(cg) | 305 else: |
304 | 306 repo = hg.repository(ui, ".", create=1) |
305 f = repo.opener("hgrc", "w") | 307 other = hg.repository(ui, source) |
306 f.write("[paths]\n") | 308 cg = repo.getchangegroup(other) |
307 f.write("default = %s\n" % source) | 309 repo.addchangegroup(cg) |
308 | 310 |
309 if not opts['no-update']: | 311 f = repo.opener("hgrc", "w") |
310 update(ui, repo) | 312 f.write("[paths]\n") |
311 | 313 f.write("default = %s\n" % source) |
314 | |
315 if not opts['no-update']: | |
316 update(ui, repo) | |
317 except: | |
318 if created: | |
319 import shutil | |
320 shutil.rmtree(dest, True) | |
321 raise | |
322 | |
312 def commit(ui, repo, *files, **opts): | 323 def commit(ui, repo, *files, **opts): |
313 """commit the specified files or all outstanding changes""" | 324 """commit the specified files or all outstanding changes""" |
314 text = opts['text'] | 325 text = opts['text'] |
315 if not text and opts['logfile']: | 326 if not text and opts['logfile']: |
316 try: text = open(opts['logfile']).read() | 327 try: text = open(opts['logfile']).read() |
457 psyco.full() | 468 psyco.full() |
458 except: | 469 except: |
459 pass | 470 pass |
460 | 471 |
461 patches = (patch1,) + patches | 472 patches = (patch1,) + patches |
462 | 473 |
463 d = opts["base"] | 474 d = opts["base"] |
464 strip = opts["strip"] | 475 strip = opts["strip"] |
465 | 476 |
466 for patch in patches: | 477 for patch in patches: |
467 ui.status("applying %s\n" % patch) | 478 ui.status("applying %s\n" % patch) |
541 | 552 |
542 if source in paths: | 553 if source in paths: |
543 source = paths[source] | 554 source = paths[source] |
544 | 555 |
545 ui.status('pulling from %s\n' % (source)) | 556 ui.status('pulling from %s\n' % (source)) |
546 | 557 |
547 other = hg.repository(ui, source) | 558 other = hg.repository(ui, source) |
548 cg = repo.getchangegroup(other) | 559 cg = repo.getchangegroup(other) |
549 r = repo.addchangegroup(cg) | 560 r = repo.addchangegroup(cg) |
550 if cg and not r: | 561 if cg and not r: |
551 if opts['update']: | 562 if opts['update']: |
560 paths = {} | 571 paths = {} |
561 for name, path in ui.configitems("paths"): | 572 for name, path in ui.configitems("paths"): |
562 paths[name] = path | 573 paths[name] = path |
563 | 574 |
564 if dest in paths: dest = paths[dest] | 575 if dest in paths: dest = paths[dest] |
565 | 576 |
566 if not dest.startswith("ssh://"): | 577 if not dest.startswith("ssh://"): |
567 ui.warn("abort: can only push to ssh:// destinations currently\n") | 578 ui.warn("abort: can only push to ssh:// destinations currently\n") |
568 return 1 | 579 return 1 |
569 | 580 |
570 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) | 581 m = re.match(r'ssh://(([^@]+)@)?([^:/]+)(:(\d+))?(/(.*))?', dest) |
605 files = relpath(repo, list(flist)) | 616 files = relpath(repo, list(flist)) |
606 if rc['files']: | 617 if rc['files']: |
607 files += open(rc['files']).read().splitlines() | 618 files += open(rc['files']).read().splitlines() |
608 | 619 |
609 rc['parent'] = map(repo.lookup, rc['parent']) | 620 rc['parent'] = map(repo.lookup, rc['parent']) |
610 | 621 |
611 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) | 622 repo.rawcommit(files, text, rc['user'], rc['date'], *rc['parent']) |
612 | 623 |
613 def recover(ui, repo): | 624 def recover(ui, repo): |
614 """roll back an interrupted transaction""" | 625 """roll back an interrupted transaction""" |
615 repo.recover() | 626 repo.recover() |
616 | 627 |
617 def remove(ui, repo, file, *files): | 628 def remove(ui, repo, file, *files): |
624 | 635 |
625 def serve(ui, repo, **opts): | 636 def serve(ui, repo, **opts): |
626 """export the repository via HTTP""" | 637 """export the repository via HTTP""" |
627 hgweb.server(repo.root, opts["name"], opts["templates"], | 638 hgweb.server(repo.root, opts["name"], opts["templates"], |
628 opts["address"], opts["port"]) | 639 opts["address"], opts["port"]) |
629 | 640 |
630 def status(ui, repo): | 641 def status(ui, repo): |
631 '''show changed files in the working directory | 642 '''show changed files in the working directory |
632 | 643 |
633 C = changed | 644 C = changed |
634 A = added | 645 A = added |
643 for f in d: print "R", f | 654 for f in d: print "R", f |
644 for f in u: print "?", f | 655 for f in u: print "?", f |
645 | 656 |
646 def tag(ui, repo, name, rev = None, **opts): | 657 def tag(ui, repo, name, rev = None, **opts): |
647 """add a tag for the current tip or a given revision""" | 658 """add a tag for the current tip or a given revision""" |
648 | 659 |
649 if name == "tip": | 660 if name == "tip": |
650 ui.warn("abort: 'tip' is a reserved name!\n") | 661 ui.warn("abort: 'tip' is a reserved name!\n") |
651 return -1 | 662 return -1 |
652 | 663 |
653 (c, a, d, u) = repo.diffdir(repo.root) | 664 (c, a, d, u) = repo.diffdir(repo.root) |
753 "hg import [options] <patches>"), | 764 "hg import [options] <patches>"), |
754 "init": (init, [], 'hg init'), | 765 "init": (init, [], 'hg init'), |
755 "log": (log, [], 'hg log <file>'), | 766 "log": (log, [], 'hg log <file>'), |
756 "manifest": (manifest, [], 'hg manifest [rev]'), | 767 "manifest": (manifest, [], 'hg manifest [rev]'), |
757 "parents": (parents, [], 'hg parents [node]'), | 768 "parents": (parents, [], 'hg parents [node]'), |
758 "pull": (pull, | 769 "pull": (pull, |
759 [('u', 'update', None, 'update working directory')], | 770 [('u', 'update', None, 'update working directory')], |
760 'hg pull [options] [source]'), | 771 'hg pull [options] [source]'), |
761 "push": (push, [], 'hg push <destination>'), | 772 "push": (push, [], 'hg push <destination>'), |
762 "rawcommit": (rawcommit, | 773 "rawcommit": (rawcommit, |
763 [('p', 'parent', [], 'parent'), | 774 [('p', 'parent', [], 'parent'), |