mercurial/commands.py
changeset 535 fba26990604a
parent 534 ab0d1bfeee7c
child 536 c15b4bc0a11c
child 542 eda4c32c167a
--- 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"""