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.
This commit is contained in:
Piotr Klecha 2014-02-25 21:26:25 +01:00
parent 202d2d5cf4
commit 0968676adc
2 changed files with 46 additions and 38 deletions

View File

@ -4605,47 +4605,50 @@ def pull(ui, repo, source="default", **opts):
"""
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:
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)
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:
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',

View File

@ -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