--- a/mercurial/commands.py Mon Feb 15 14:40:17 2021 -0500
+++ b/mercurial/commands.py Mon Feb 15 14:48:36 2021 -0500
@@ -3820,132 +3820,138 @@
output = []
revs = []
- if source:
- source, branches = hg.parseurl(ui.expandpath(source))
- peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo
- repo = peer.local()
- revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
-
- fm = ui.formatter(b'identify', opts)
- fm.startitem()
-
- if not repo:
- if num or branch or tags:
- raise error.InputError(
- _(b"can't query remote revision number, branch, or tags")
- )
- if not rev and revs:
- rev = revs[0]
- if not rev:
- rev = b"tip"
-
- remoterev = peer.lookup(rev)
- hexrev = fm.hexfunc(remoterev)
- if default or id:
- output = [hexrev]
- fm.data(id=hexrev)
-
- @util.cachefunc
- def getbms():
- bms = []
-
- if b'bookmarks' in peer.listkeys(b'namespaces'):
- hexremoterev = hex(remoterev)
- bms = [
- bm
- for bm, bmr in pycompat.iteritems(
- peer.listkeys(b'bookmarks')
+ peer = None
+ try:
+ if source:
+ source, branches = hg.parseurl(ui.expandpath(source))
+ # only pass ui when no repo
+ peer = hg.peer(repo or ui, opts, source)
+ repo = peer.local()
+ revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
+
+ fm = ui.formatter(b'identify', opts)
+ fm.startitem()
+
+ if not repo:
+ if num or branch or tags:
+ raise error.InputError(
+ _(b"can't query remote revision number, branch, or tags")
+ )
+ if not rev and revs:
+ rev = revs[0]
+ if not rev:
+ rev = b"tip"
+
+ remoterev = peer.lookup(rev)
+ hexrev = fm.hexfunc(remoterev)
+ if default or id:
+ output = [hexrev]
+ fm.data(id=hexrev)
+
+ @util.cachefunc
+ def getbms():
+ bms = []
+
+ if b'bookmarks' in peer.listkeys(b'namespaces'):
+ hexremoterev = hex(remoterev)
+ bms = [
+ bm
+ for bm, bmr in pycompat.iteritems(
+ peer.listkeys(b'bookmarks')
+ )
+ if bmr == hexremoterev
+ ]
+
+ return sorted(bms)
+
+ if fm.isplain():
+ if bookmarks:
+ output.extend(getbms())
+ elif default and not ui.quiet:
+ # multiple bookmarks for a single parent separated by '/'
+ bm = b'/'.join(getbms())
+ if bm:
+ output.append(bm)
+ else:
+ fm.data(node=hex(remoterev))
+ if bookmarks or b'bookmarks' in fm.datahint():
+ fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
+ else:
+ if rev:
+ repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
+ ctx = scmutil.revsingle(repo, rev, None)
+
+ if ctx.rev() is None:
+ ctx = repo[None]
+ parents = ctx.parents()
+ taglist = []
+ for p in parents:
+ taglist.extend(p.tags())
+
+ dirty = b""
+ if ctx.dirty(missing=True, merge=False, branch=False):
+ dirty = b'+'
+ fm.data(dirty=dirty)
+
+ hexoutput = [fm.hexfunc(p.node()) for p in parents]
+ if default or id:
+ output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
+ fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
+
+ if num:
+ numoutput = [b"%d" % p.rev() for p in parents]
+ output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
+
+ fm.data(
+ parents=fm.formatlist(
+ [fm.hexfunc(p.node()) for p in parents], name=b'node'
)
- if bmr == hexremoterev
- ]
-
- return sorted(bms)
-
- if fm.isplain():
- if bookmarks:
- output.extend(getbms())
- elif default and not ui.quiet:
+ )
+ else:
+ hexoutput = fm.hexfunc(ctx.node())
+ if default or id:
+ output = [hexoutput]
+ fm.data(id=hexoutput)
+
+ if num:
+ output.append(pycompat.bytestr(ctx.rev()))
+ taglist = ctx.tags()
+
+ if default and not ui.quiet:
+ b = ctx.branch()
+ if b != b'default':
+ output.append(b"(%s)" % b)
+
+ # multiple tags for a single parent separated by '/'
+ t = b'/'.join(taglist)
+ if t:
+ output.append(t)
+
# multiple bookmarks for a single parent separated by '/'
- bm = b'/'.join(getbms())
+ bm = b'/'.join(ctx.bookmarks())
if bm:
output.append(bm)
- else:
- fm.data(node=hex(remoterev))
- if bookmarks or b'bookmarks' in fm.datahint():
- fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
- else:
- if rev:
- repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
- ctx = scmutil.revsingle(repo, rev, None)
-
- if ctx.rev() is None:
- ctx = repo[None]
- parents = ctx.parents()
- taglist = []
- for p in parents:
- taglist.extend(p.tags())
-
- dirty = b""
- if ctx.dirty(missing=True, merge=False, branch=False):
- dirty = b'+'
- fm.data(dirty=dirty)
-
- hexoutput = [fm.hexfunc(p.node()) for p in parents]
- if default or id:
- output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
- fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
-
- if num:
- numoutput = [b"%d" % p.rev() for p in parents]
- output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
-
- fm.data(
- parents=fm.formatlist(
- [fm.hexfunc(p.node()) for p in parents], name=b'node'
- )
- )
- else:
- hexoutput = fm.hexfunc(ctx.node())
- if default or id:
- output = [hexoutput]
- fm.data(id=hexoutput)
-
- if num:
- output.append(pycompat.bytestr(ctx.rev()))
- taglist = ctx.tags()
-
- if default and not ui.quiet:
- b = ctx.branch()
- if b != b'default':
- output.append(b"(%s)" % b)
-
- # multiple tags for a single parent separated by '/'
- t = b'/'.join(taglist)
- if t:
- output.append(t)
-
- # multiple bookmarks for a single parent separated by '/'
- bm = b'/'.join(ctx.bookmarks())
- if bm:
- output.append(bm)
- else:
- if branch:
- output.append(ctx.branch())
-
- if tags:
- output.extend(taglist)
-
- if bookmarks:
- output.extend(ctx.bookmarks())
-
- fm.data(node=ctx.hex())
- fm.data(branch=ctx.branch())
- fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
- fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
- fm.context(ctx=ctx)
-
- fm.plain(b"%s\n" % b' '.join(output))
- fm.end()
+ else:
+ if branch:
+ output.append(ctx.branch())
+
+ if tags:
+ output.extend(taglist)
+
+ if bookmarks:
+ output.extend(ctx.bookmarks())
+
+ fm.data(node=ctx.hex())
+ fm.data(branch=ctx.branch())
+ fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
+ fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
+ fm.context(ctx=ctx)
+
+ fm.plain(b"%s\n" % b' '.join(output))
+ fm.end()
+ finally:
+ if peer:
+ peer.close()
@command(
@@ -4291,12 +4297,15 @@
ui.expandpath(source), opts.get(b'branch')
)
other = hg.peer(repo, opts, source)
- if b'bookmarks' not in other.listkeys(b'namespaces'):
- ui.warn(_(b"remote doesn't support bookmarks\n"))
- return 0
- ui.pager(b'incoming')
- ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
- return bookmarks.incoming(ui, repo, other)
+ try:
+ if b'bookmarks' not in other.listkeys(b'namespaces'):
+ ui.warn(_(b"remote doesn't support bookmarks\n"))
+ return 0
+ ui.pager(b'incoming')
+ ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
+ return bookmarks.incoming(ui, repo, other)
+ finally:
+ other.close()
repo._subtoppath = ui.expandpath(source)
try:
@@ -4327,7 +4336,8 @@
Returns 0 on success.
"""
opts = pycompat.byteskwargs(opts)
- hg.peer(ui, opts, ui.expandpath(dest), create=True)
+ peer = hg.peer(ui, opts, ui.expandpath(dest), create=True)
+ peer.close()
@command(
@@ -4963,12 +4973,15 @@
if opts.get(b'bookmarks'):
dest = path.pushloc or path.loc
other = hg.peer(repo, opts, dest)
- if b'bookmarks' not in other.listkeys(b'namespaces'):
- ui.warn(_(b"remote doesn't support bookmarks\n"))
- return 0
- ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
- ui.pager(b'outgoing')
- return bookmarks.outgoing(ui, repo, other)
+ try:
+ if b'bookmarks' not in other.listkeys(b'namespaces'):
+ ui.warn(_(b"remote doesn't support bookmarks\n"))
+ return 0
+ ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
+ ui.pager(b'outgoing')
+ return bookmarks.outgoing(ui, repo, other)
+ finally:
+ other.close()
repo._subtoppath = path.pushloc or path.loc
try:
@@ -5679,63 +5692,67 @@
revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev'))
other = hg.peer(repo, opts, dest)
- if revs:
- revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
- if not revs:
+ try:
+ if revs:
+ revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
+ if not revs:
+ raise error.InputError(
+ _(b"specified revisions evaluate to an empty set"),
+ hint=_(b"use different revision arguments"),
+ )
+ elif path.pushrev:
+ # It doesn't make any sense to specify ancestor revisions. So limit
+ # to DAG heads to make discovery simpler.
+ expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
+ revs = scmutil.revrange(repo, [expr])
+ revs = [repo[rev].node() for rev in revs]
+ if not revs:
+ raise error.InputError(
+ _(b'default push revset for path evaluates to an empty set')
+ )
+ elif ui.configbool(b'commands', b'push.require-revs'):
raise error.InputError(
- _(b"specified revisions evaluate to an empty set"),
- hint=_(b"use different revision arguments"),
+ _(b'no revisions specified to push'),
+ hint=_(b'did you mean "hg push -r ."?'),
)
- elif path.pushrev:
- # It doesn't make any sense to specify ancestor revisions. So limit
- # to DAG heads to make discovery simpler.
- expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
- revs = scmutil.revrange(repo, [expr])
- revs = [repo[rev].node() for rev in revs]
- if not revs:
- raise error.InputError(
- _(b'default push revset for path evaluates to an empty set')
- )
- elif ui.configbool(b'commands', b'push.require-revs'):
- raise error.InputError(
- _(b'no revisions specified to push'),
- hint=_(b'did you mean "hg push -r ."?'),
+
+ repo._subtoppath = dest
+ try:
+ # push subrepos depth-first for coherent ordering
+ c = repo[b'.']
+ subs = c.substate # only repos that are committed
+ for s in sorted(subs):
+ result = c.sub(s).push(opts)
+ if result == 0:
+ return not result
+ finally:
+ del repo._subtoppath
+
+ opargs = dict(
+ opts.get(b'opargs', {})
+ ) # copy opargs since we may mutate it
+ opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
+
+ pushop = exchange.push(
+ repo,
+ other,
+ opts.get(b'force'),
+ revs=revs,
+ newbranch=opts.get(b'new_branch'),
+ bookmarks=opts.get(b'bookmark', ()),
+ publish=opts.get(b'publish'),
+ opargs=opargs,
)
- repo._subtoppath = dest
- try:
- # push subrepos depth-first for coherent ordering
- c = repo[b'.']
- subs = c.substate # only repos that are committed
- for s in sorted(subs):
- result = c.sub(s).push(opts)
- if result == 0:
- return not result
+ result = not pushop.cgresult
+
+ if pushop.bkresult is not None:
+ if pushop.bkresult == 2:
+ result = 2
+ elif not result and pushop.bkresult:
+ result = 2
finally:
- del repo._subtoppath
-
- opargs = dict(opts.get(b'opargs', {})) # copy opargs since we may mutate it
- opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
-
- pushop = exchange.push(
- repo,
- other,
- opts.get(b'force'),
- revs=revs,
- newbranch=opts.get(b'new_branch'),
- bookmarks=opts.get(b'bookmark', ()),
- publish=opts.get(b'publish'),
- opargs=opargs,
- )
-
- result = not pushop.cgresult
-
- if pushop.bkresult is not None:
- if pushop.bkresult == 2:
- result = 2
- elif not result and pushop.bkresult:
- result = 2
-
+ other.close()
return result