comparison mercurial/commands.py @ 46702:a4c19a162615

sshpeer: enable+fix warning about sshpeers not being closed explicitly I recommend looking at this with a diff that ignores indentation. The test changes are because localrepo.close() updates some cache, which appears happens earlier now on rollbacks or strips or something. The http changes are because httppeer.close() prints stats with --verbose. Differential Revision: https://phab.mercurial-scm.org/D9999
author Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
date Mon, 15 Feb 2021 14:48:36 -0500
parents 4a012e531066
children 66fb04552122
comparison
equal deleted inserted replaced
46701:db8037e38085 46702:a4c19a162615
3818 3818
3819 default = not (num or id or branch or tags or bookmarks) 3819 default = not (num or id or branch or tags or bookmarks)
3820 output = [] 3820 output = []
3821 revs = [] 3821 revs = []
3822 3822
3823 if source: 3823 peer = None
3824 source, branches = hg.parseurl(ui.expandpath(source)) 3824 try:
3825 peer = hg.peer(repo or ui, opts, source) # only pass ui when no repo 3825 if source:
3826 repo = peer.local() 3826 source, branches = hg.parseurl(ui.expandpath(source))
3827 revs, checkout = hg.addbranchrevs(repo, peer, branches, None) 3827 # only pass ui when no repo
3828 3828 peer = hg.peer(repo or ui, opts, source)
3829 fm = ui.formatter(b'identify', opts) 3829 repo = peer.local()
3830 fm.startitem() 3830 revs, checkout = hg.addbranchrevs(repo, peer, branches, None)
3831 3831
3832 if not repo: 3832 fm = ui.formatter(b'identify', opts)
3833 if num or branch or tags: 3833 fm.startitem()
3834 raise error.InputError( 3834
3835 _(b"can't query remote revision number, branch, or tags") 3835 if not repo:
3836 ) 3836 if num or branch or tags:
3837 if not rev and revs: 3837 raise error.InputError(
3838 rev = revs[0] 3838 _(b"can't query remote revision number, branch, or tags")
3839 if not rev: 3839 )
3840 rev = b"tip" 3840 if not rev and revs:
3841 3841 rev = revs[0]
3842 remoterev = peer.lookup(rev) 3842 if not rev:
3843 hexrev = fm.hexfunc(remoterev) 3843 rev = b"tip"
3844 if default or id: 3844
3845 output = [hexrev] 3845 remoterev = peer.lookup(rev)
3846 fm.data(id=hexrev) 3846 hexrev = fm.hexfunc(remoterev)
3847 3847 if default or id:
3848 @util.cachefunc 3848 output = [hexrev]
3849 def getbms(): 3849 fm.data(id=hexrev)
3850 bms = [] 3850
3851 3851 @util.cachefunc
3852 if b'bookmarks' in peer.listkeys(b'namespaces'): 3852 def getbms():
3853 hexremoterev = hex(remoterev) 3853 bms = []
3854 bms = [ 3854
3855 bm 3855 if b'bookmarks' in peer.listkeys(b'namespaces'):
3856 for bm, bmr in pycompat.iteritems( 3856 hexremoterev = hex(remoterev)
3857 peer.listkeys(b'bookmarks') 3857 bms = [
3858 bm
3859 for bm, bmr in pycompat.iteritems(
3860 peer.listkeys(b'bookmarks')
3861 )
3862 if bmr == hexremoterev
3863 ]
3864
3865 return sorted(bms)
3866
3867 if fm.isplain():
3868 if bookmarks:
3869 output.extend(getbms())
3870 elif default and not ui.quiet:
3871 # multiple bookmarks for a single parent separated by '/'
3872 bm = b'/'.join(getbms())
3873 if bm:
3874 output.append(bm)
3875 else:
3876 fm.data(node=hex(remoterev))
3877 if bookmarks or b'bookmarks' in fm.datahint():
3878 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark'))
3879 else:
3880 if rev:
3881 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn')
3882 ctx = scmutil.revsingle(repo, rev, None)
3883
3884 if ctx.rev() is None:
3885 ctx = repo[None]
3886 parents = ctx.parents()
3887 taglist = []
3888 for p in parents:
3889 taglist.extend(p.tags())
3890
3891 dirty = b""
3892 if ctx.dirty(missing=True, merge=False, branch=False):
3893 dirty = b'+'
3894 fm.data(dirty=dirty)
3895
3896 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3897 if default or id:
3898 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3899 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3900
3901 if num:
3902 numoutput = [b"%d" % p.rev() for p in parents]
3903 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3904
3905 fm.data(
3906 parents=fm.formatlist(
3907 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3858 ) 3908 )
3859 if bmr == hexremoterev 3909 )
3860 ] 3910 else:
3861 3911 hexoutput = fm.hexfunc(ctx.node())
3862 return sorted(bms) 3912 if default or id:
3863 3913 output = [hexoutput]
3864 if fm.isplain(): 3914 fm.data(id=hexoutput)
3865 if bookmarks: 3915
3866 output.extend(getbms()) 3916 if num:
3867 elif default and not ui.quiet: 3917 output.append(pycompat.bytestr(ctx.rev()))
3918 taglist = ctx.tags()
3919
3920 if default and not ui.quiet:
3921 b = ctx.branch()
3922 if b != b'default':
3923 output.append(b"(%s)" % b)
3924
3925 # multiple tags for a single parent separated by '/'
3926 t = b'/'.join(taglist)
3927 if t:
3928 output.append(t)
3929
3868 # multiple bookmarks for a single parent separated by '/' 3930 # multiple bookmarks for a single parent separated by '/'
3869 bm = b'/'.join(getbms()) 3931 bm = b'/'.join(ctx.bookmarks())
3870 if bm: 3932 if bm:
3871 output.append(bm) 3933 output.append(bm)
3872 else: 3934 else:
3873 fm.data(node=hex(remoterev)) 3935 if branch:
3874 if bookmarks or b'bookmarks' in fm.datahint(): 3936 output.append(ctx.branch())
3875 fm.data(bookmarks=fm.formatlist(getbms(), name=b'bookmark')) 3937
3876 else: 3938 if tags:
3877 if rev: 3939 output.extend(taglist)
3878 repo = scmutil.unhidehashlikerevs(repo, [rev], b'nowarn') 3940
3879 ctx = scmutil.revsingle(repo, rev, None) 3941 if bookmarks:
3880 3942 output.extend(ctx.bookmarks())
3881 if ctx.rev() is None: 3943
3882 ctx = repo[None] 3944 fm.data(node=ctx.hex())
3883 parents = ctx.parents() 3945 fm.data(branch=ctx.branch())
3884 taglist = [] 3946 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
3885 for p in parents: 3947 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
3886 taglist.extend(p.tags()) 3948 fm.context(ctx=ctx)
3887 3949
3888 dirty = b"" 3950 fm.plain(b"%s\n" % b' '.join(output))
3889 if ctx.dirty(missing=True, merge=False, branch=False): 3951 fm.end()
3890 dirty = b'+' 3952 finally:
3891 fm.data(dirty=dirty) 3953 if peer:
3892 3954 peer.close()
3893 hexoutput = [fm.hexfunc(p.node()) for p in parents]
3894 if default or id:
3895 output = [b"%s%s" % (b'+'.join(hexoutput), dirty)]
3896 fm.data(id=b"%s%s" % (b'+'.join(hexoutput), dirty))
3897
3898 if num:
3899 numoutput = [b"%d" % p.rev() for p in parents]
3900 output.append(b"%s%s" % (b'+'.join(numoutput), dirty))
3901
3902 fm.data(
3903 parents=fm.formatlist(
3904 [fm.hexfunc(p.node()) for p in parents], name=b'node'
3905 )
3906 )
3907 else:
3908 hexoutput = fm.hexfunc(ctx.node())
3909 if default or id:
3910 output = [hexoutput]
3911 fm.data(id=hexoutput)
3912
3913 if num:
3914 output.append(pycompat.bytestr(ctx.rev()))
3915 taglist = ctx.tags()
3916
3917 if default and not ui.quiet:
3918 b = ctx.branch()
3919 if b != b'default':
3920 output.append(b"(%s)" % b)
3921
3922 # multiple tags for a single parent separated by '/'
3923 t = b'/'.join(taglist)
3924 if t:
3925 output.append(t)
3926
3927 # multiple bookmarks for a single parent separated by '/'
3928 bm = b'/'.join(ctx.bookmarks())
3929 if bm:
3930 output.append(bm)
3931 else:
3932 if branch:
3933 output.append(ctx.branch())
3934
3935 if tags:
3936 output.extend(taglist)
3937
3938 if bookmarks:
3939 output.extend(ctx.bookmarks())
3940
3941 fm.data(node=ctx.hex())
3942 fm.data(branch=ctx.branch())
3943 fm.data(tags=fm.formatlist(taglist, name=b'tag', sep=b':'))
3944 fm.data(bookmarks=fm.formatlist(ctx.bookmarks(), name=b'bookmark'))
3945 fm.context(ctx=ctx)
3946
3947 fm.plain(b"%s\n" % b' '.join(output))
3948 fm.end()
3949 3955
3950 3956
3951 @command( 3957 @command(
3952 b'import|patch', 3958 b'import|patch',
3953 [ 3959 [
4289 if opts.get(b'bookmarks'): 4295 if opts.get(b'bookmarks'):
4290 source, branches = hg.parseurl( 4296 source, branches = hg.parseurl(
4291 ui.expandpath(source), opts.get(b'branch') 4297 ui.expandpath(source), opts.get(b'branch')
4292 ) 4298 )
4293 other = hg.peer(repo, opts, source) 4299 other = hg.peer(repo, opts, source)
4294 if b'bookmarks' not in other.listkeys(b'namespaces'): 4300 try:
4295 ui.warn(_(b"remote doesn't support bookmarks\n")) 4301 if b'bookmarks' not in other.listkeys(b'namespaces'):
4296 return 0 4302 ui.warn(_(b"remote doesn't support bookmarks\n"))
4297 ui.pager(b'incoming') 4303 return 0
4298 ui.status(_(b'comparing with %s\n') % util.hidepassword(source)) 4304 ui.pager(b'incoming')
4299 return bookmarks.incoming(ui, repo, other) 4305 ui.status(_(b'comparing with %s\n') % util.hidepassword(source))
4306 return bookmarks.incoming(ui, repo, other)
4307 finally:
4308 other.close()
4300 4309
4301 repo._subtoppath = ui.expandpath(source) 4310 repo._subtoppath = ui.expandpath(source)
4302 try: 4311 try:
4303 return hg.incoming(ui, repo, source, opts) 4312 return hg.incoming(ui, repo, source, opts)
4304 finally: 4313 finally:
4325 See :hg:`help urls` for more information. 4334 See :hg:`help urls` for more information.
4326 4335
4327 Returns 0 on success. 4336 Returns 0 on success.
4328 """ 4337 """
4329 opts = pycompat.byteskwargs(opts) 4338 opts = pycompat.byteskwargs(opts)
4330 hg.peer(ui, opts, ui.expandpath(dest), create=True) 4339 peer = hg.peer(ui, opts, ui.expandpath(dest), create=True)
4340 peer.close()
4331 4341
4332 4342
4333 @command( 4343 @command(
4334 b'locate', 4344 b'locate',
4335 [ 4345 [
4961 return 0 4971 return 0
4962 4972
4963 if opts.get(b'bookmarks'): 4973 if opts.get(b'bookmarks'):
4964 dest = path.pushloc or path.loc 4974 dest = path.pushloc or path.loc
4965 other = hg.peer(repo, opts, dest) 4975 other = hg.peer(repo, opts, dest)
4966 if b'bookmarks' not in other.listkeys(b'namespaces'): 4976 try:
4967 ui.warn(_(b"remote doesn't support bookmarks\n")) 4977 if b'bookmarks' not in other.listkeys(b'namespaces'):
4968 return 0 4978 ui.warn(_(b"remote doesn't support bookmarks\n"))
4969 ui.status(_(b'comparing with %s\n') % util.hidepassword(dest)) 4979 return 0
4970 ui.pager(b'outgoing') 4980 ui.status(_(b'comparing with %s\n') % util.hidepassword(dest))
4971 return bookmarks.outgoing(ui, repo, other) 4981 ui.pager(b'outgoing')
4982 return bookmarks.outgoing(ui, repo, other)
4983 finally:
4984 other.close()
4972 4985
4973 repo._subtoppath = path.pushloc or path.loc 4986 repo._subtoppath = path.pushloc or path.loc
4974 try: 4987 try:
4975 return hg.outgoing(ui, repo, dest, opts) 4988 return hg.outgoing(ui, repo, dest, opts)
4976 finally: 4989 finally:
5677 branches = (path.branch, opts.get(b'branch') or []) 5690 branches = (path.branch, opts.get(b'branch') or [])
5678 ui.status(_(b'pushing to %s\n') % util.hidepassword(dest)) 5691 ui.status(_(b'pushing to %s\n') % util.hidepassword(dest))
5679 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev')) 5692 revs, checkout = hg.addbranchrevs(repo, repo, branches, opts.get(b'rev'))
5680 other = hg.peer(repo, opts, dest) 5693 other = hg.peer(repo, opts, dest)
5681 5694
5682 if revs: 5695 try:
5683 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)] 5696 if revs:
5684 if not revs: 5697 revs = [repo[r].node() for r in scmutil.revrange(repo, revs)]
5698 if not revs:
5699 raise error.InputError(
5700 _(b"specified revisions evaluate to an empty set"),
5701 hint=_(b"use different revision arguments"),
5702 )
5703 elif path.pushrev:
5704 # It doesn't make any sense to specify ancestor revisions. So limit
5705 # to DAG heads to make discovery simpler.
5706 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev)
5707 revs = scmutil.revrange(repo, [expr])
5708 revs = [repo[rev].node() for rev in revs]
5709 if not revs:
5710 raise error.InputError(
5711 _(b'default push revset for path evaluates to an empty set')
5712 )
5713 elif ui.configbool(b'commands', b'push.require-revs'):
5685 raise error.InputError( 5714 raise error.InputError(
5686 _(b"specified revisions evaluate to an empty set"), 5715 _(b'no revisions specified to push'),
5687 hint=_(b"use different revision arguments"), 5716 hint=_(b'did you mean "hg push -r ."?'),
5688 ) 5717 )
5689 elif path.pushrev: 5718
5690 # It doesn't make any sense to specify ancestor revisions. So limit 5719 repo._subtoppath = dest
5691 # to DAG heads to make discovery simpler. 5720 try:
5692 expr = revsetlang.formatspec(b'heads(%r)', path.pushrev) 5721 # push subrepos depth-first for coherent ordering
5693 revs = scmutil.revrange(repo, [expr]) 5722 c = repo[b'.']
5694 revs = [repo[rev].node() for rev in revs] 5723 subs = c.substate # only repos that are committed
5695 if not revs: 5724 for s in sorted(subs):
5696 raise error.InputError( 5725 result = c.sub(s).push(opts)
5697 _(b'default push revset for path evaluates to an empty set') 5726 if result == 0:
5698 ) 5727 return not result
5699 elif ui.configbool(b'commands', b'push.require-revs'): 5728 finally:
5700 raise error.InputError( 5729 del repo._subtoppath
5701 _(b'no revisions specified to push'), 5730
5702 hint=_(b'did you mean "hg push -r ."?'), 5731 opargs = dict(
5732 opts.get(b'opargs', {})
5733 ) # copy opargs since we may mutate it
5734 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5735
5736 pushop = exchange.push(
5737 repo,
5738 other,
5739 opts.get(b'force'),
5740 revs=revs,
5741 newbranch=opts.get(b'new_branch'),
5742 bookmarks=opts.get(b'bookmark', ()),
5743 publish=opts.get(b'publish'),
5744 opargs=opargs,
5703 ) 5745 )
5704 5746
5705 repo._subtoppath = dest 5747 result = not pushop.cgresult
5706 try: 5748
5707 # push subrepos depth-first for coherent ordering 5749 if pushop.bkresult is not None:
5708 c = repo[b'.'] 5750 if pushop.bkresult == 2:
5709 subs = c.substate # only repos that are committed 5751 result = 2
5710 for s in sorted(subs): 5752 elif not result and pushop.bkresult:
5711 result = c.sub(s).push(opts) 5753 result = 2
5712 if result == 0:
5713 return not result
5714 finally: 5754 finally:
5715 del repo._subtoppath 5755 other.close()
5716
5717 opargs = dict(opts.get(b'opargs', {})) # copy opargs since we may mutate it
5718 opargs.setdefault(b'pushvars', []).extend(opts.get(b'pushvars', []))
5719
5720 pushop = exchange.push(
5721 repo,
5722 other,
5723 opts.get(b'force'),
5724 revs=revs,
5725 newbranch=opts.get(b'new_branch'),
5726 bookmarks=opts.get(b'bookmark', ()),
5727 publish=opts.get(b'publish'),
5728 opargs=opargs,
5729 )
5730
5731 result = not pushop.cgresult
5732
5733 if pushop.bkresult is not None:
5734 if pushop.bkresult == 2:
5735 result = 2
5736 elif not result and pushop.bkresult:
5737 result = 2
5738
5739 return result 5756 return result
5740 5757
5741 5758
5742 @command( 5759 @command(
5743 b'recover', 5760 b'recover',