Patchwork [V3] pull: close peer repo on completion (issue2491, issue2797)

login
register
mail settings
Submitter pklecha@forcom.com.pl
Date Feb. 25, 2014, 8:33 p.m.
Message ID <6dd4f0684eb55cdecdba.1393360381@PKLECHA>
Download mbox | patch
Permalink /patch/3770/
State Accepted
Headers show

Comments

pklecha@forcom.com.pl - Feb. 25, 2014, 8:33 p.m.
# HG changeset patch
# User Piotr Klecha <pklecha@forcom.com.pl>
# Date 1393359985 -3600
#      Tue Feb 25 21:26:25 2014 +0100
# Node ID 6dd4f0684eb55cdecdbaaa1cae2c0f608bd36943
# Parent  0ad353831461516132f57ccda8e8e0515213ec60
pull: close peer repo on completion (issue2491, issue2797)

When pulling changes from a compressed bundle Mercurial first uncompresses it
to a temporary file in .hg directory. This file will not be deleted unless
the bundlerepo (other) is explicitly closed.

This is similar to cleanup that occurs after incoming.
Matt Mackall - Feb. 27, 2014, 12:09 a.m.
On Tue, 2014-02-25 at 21:33 +0100, Piotr Klecha wrote:
> # HG changeset patch
> # User Piotr Klecha <pklecha@forcom.com.pl>
> # Date 1393359985 -3600
> #      Tue Feb 25 21:26:25 2014 +0100
> # Node ID 6dd4f0684eb55cdecdbaaa1cae2c0f608bd36943
> # Parent  0ad353831461516132f57ccda8e8e0515213ec60
> pull: close peer repo on completion (issue2491, issue2797)

Bugfix -> queued for stable, thanks.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4514,47 +4514,49 @@  def pull(ui, repo, source="default", **o
     """
     source, branches = hg.parseurl(ui.expandpath(source), opts.get('branch'))
     other = hg.peer(repo, opts, source)
-    ui.status(_('pulling from %s\n') % util.hidepassword(source))
-    revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
-
-    remotebookmarks = other.listkeys('bookmarks')
-
-    if opts.get('bookmark'):
-        if not revs:
-            revs = []
-        for b in opts['bookmark']:
-            if b not in remotebookmarks:
-                raise util.Abort(_('remote bookmark %s not found!') % b)
-            revs.append(remotebookmarks[b])
-
-    if revs:
+    try:
+        ui.status(_('pulling from %s\n') % util.hidepassword(source))
+        revs, checkout = hg.addbranchrevs(repo, other, branches, opts.get('rev'))
+
+        remotebookmarks = other.listkeys('bookmarks')
+
+        if opts.get('bookmark'):
+            if not revs:
+                revs = []
+            for b in opts['bookmark']:
+                if b not in remotebookmarks:
+                    raise util.Abort(_('remote bookmark %s not found!') % b)
+                revs.append(remotebookmarks[b])
+
+        if revs:
+            try:
+                revs = [other.lookup(rev) for rev in revs]
+            except error.CapabilityError:
+                err = _("other repository doesn't support revision lookup, "
+                        "so a rev cannot be specified.")
+                raise util.Abort(err)
+
+        modheads = repo.pull(other, heads=revs, force=opts.get('force'))
+        bookmarks.updatefromremote(ui, repo, remotebookmarks, source)
+        if checkout:
+            checkout = str(repo.changelog.rev(other.lookup(checkout)))
+        repo._subtoppath = source
         try:
-            revs = [other.lookup(rev) for rev in revs]
-        except error.CapabilityError:
-            err = _("other repository doesn't support revision lookup, "
-                    "so a rev cannot be specified.")
-            raise util.Abort(err)
-
-    modheads = repo.pull(other, heads=revs, force=opts.get('force'))
-    bookmarks.updatefromremote(ui, repo, remotebookmarks, source)
-    if checkout:
-        checkout = str(repo.changelog.rev(other.lookup(checkout)))
-    repo._subtoppath = source
-    try:
-        ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
-
+            ret = postincoming(ui, repo, modheads, opts.get('update'), checkout)
+
+        finally:
+            del repo._subtoppath
+
+        # update specified bookmarks
+        if opts.get('bookmark'):
+            marks = repo._bookmarks
+            for b in opts['bookmark']:
+                # explicit pull overrides local bookmark if any
+                ui.status(_("importing bookmark %s\n") % b)
+                marks[b] = repo[remotebookmarks[b]].node()
+            marks.write()
     finally:
-        del repo._subtoppath
-
-    # update specified bookmarks
-    if opts.get('bookmark'):
-        marks = repo._bookmarks
-        for b in opts['bookmark']:
-            # explicit pull overrides local bookmark if any
-            ui.status(_("importing bookmark %s\n") % b)
-            marks[b] = repo[remotebookmarks[b]].node()
-        marks.write()
-
+        other.close()
     return ret
 
 @command('^push',
diff --git a/tests/test-bundle.t b/tests/test-bundle.t
--- a/tests/test-bundle.t
+++ b/tests/test-bundle.t
@@ -84,6 +84,11 @@  Pull full.hg into test (using --cwd)
   searching for changes
   no changes found
 
+Verify that there are no leaked temporary files after pull (issue2797)
+
+  $ ls test/.hg | grep .hg10un
+  [1]
+
 Pull full.hg into empty (using --cwd)
 
   $ hg --cwd empty pull ../full.hg