diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -272,8 +272,6 @@ def clone(ui, source, dest = None, **opt """make a copy of an existing repository""" source = ui.expandpath(source) - success = False - if dest is None: dest = os.path.basename(os.path.normpath(source)) @@ -281,45 +279,50 @@ def clone(ui, source, dest = None, **opt ui.warn("abort: destination '%s' already exists\n" % dest) return 1 - os.mkdir(dest) - - try: - link = 0 - if not source.startswith("http://"): - d1 = os.stat(dest).st_dev - d2 = os.stat(source).st_dev - if d1 == d2: link = 1 + class dircleanup: + def __init__(self, dir): + self.dir = dir + os.mkdir(dir) + def close(self): + self.dir = None + def __del__(self): + if self.dir: + import shutil + shutil.rmtree(self.dir, True) - if link: - ui.note("copying by hardlink\n") - util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) - try: - os.remove(os.path.join(dest, ".hg", "dirstate")) - except: pass + d = dircleanup(dest) - repo = hg.repository(ui, dest) + link = 0 + if not source.startswith("http://"): + d1 = os.stat(dest).st_dev + d2 = os.stat(source).st_dev + if d1 == d2: link = 1 - else: - repo = hg.repository(ui, dest, create=1) - other = hg.repository(ui, source) - fetch = repo.findincoming(other) - if fetch: - cg = other.changegroup(fetch) - repo.addchangegroup(cg) + if link: + ui.note("copying by hardlink\n") + util.system("cp -al '%s'/.hg '%s'/.hg" % (source, dest)) + try: + os.remove(os.path.join(dest, ".hg", "dirstate")) + except: pass + + repo = hg.repository(ui, dest) - f = repo.opener("hgrc", "w") - f.write("[paths]\n") - f.write("default = %s\n" % source) - - if not opts['noupdate']: - update(ui, repo) + else: + repo = hg.repository(ui, dest, create=1) + other = hg.repository(ui, source) + fetch = repo.findincoming(other) + if fetch: + cg = other.changegroup(fetch) + repo.addchangegroup(cg) - success = True + f = repo.opener("hgrc", "w") + f.write("[paths]\n") + f.write("default = %s\n" % source) - finally: - if not success: - import shutil - shutil.rmtree(dest, True) + if not opts['noupdate']: + update(ui, repo) + + d.close() def commit(ui, repo, *files, **opts): """commit the specified files or all outstanding changes"""