comparison mercurial/hgweb/webcommands.py @ 36886:563fd95a6efb

hgweb: pass modern request type into various webutil functions (API) Our march towards killing wsgirequest continues. .. api:: Various functions in hgweb.webutil now take a modern request object instead of ``wsgirequest``. Differential Revision: https://phab.mercurial-scm.org/D2802
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 10 Mar 2018 19:57:08 -0800
parents c68e79dcf21c
children 4daa22071d5d
comparison
equal deleted inserted replaced
36885:c68e79dcf21c 36886:563fd95a6efb
106 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', '')) 106 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
107 if not path: 107 if not path:
108 return manifest(web, req, None) 108 return manifest(web, req, None)
109 109
110 try: 110 try:
111 fctx = webutil.filectx(web.repo, req) 111 fctx = webutil.filectx(web.repo, web.req)
112 except error.LookupError as inst: 112 except error.LookupError as inst:
113 try: 113 try:
114 return manifest(web, req, None) 114 return manifest(web, req, None)
115 except ErrorResponse: 115 except ErrorResponse:
116 raise inst 116 raise inst
155 return web.sendtemplate( 155 return web.sendtemplate(
156 'filerevision', 156 'filerevision',
157 file=f, 157 file=f,
158 path=webutil.up(f), 158 path=webutil.up(f),
159 text=lines(), 159 text=lines(),
160 symrev=webutil.symrevorshortnode(req, fctx), 160 symrev=webutil.symrevorshortnode(web.req, fctx),
161 rename=webutil.renamelink(fctx), 161 rename=webutil.renamelink(fctx),
162 permissions=fctx.manifest().flags(f), 162 permissions=fctx.manifest().flags(f),
163 ishead=int(ishead), 163 ishead=int(ishead),
164 **pycompat.strkwargs(webutil.commonentry(web.repo, fctx))) 164 **pycompat.strkwargs(webutil.commonentry(web.repo, fctx)))
165 165
188 188
189 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', '')) 189 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
190 if not path: 190 if not path:
191 return manifest(web, req, None) 191 return manifest(web, req, None)
192 try: 192 try:
193 return _filerevision(web, req, webutil.filectx(web.repo, req)) 193 return _filerevision(web, req, webutil.filectx(web.repo, web.req))
194 except error.LookupError as inst: 194 except error.LookupError as inst:
195 try: 195 try:
196 return manifest(web, req, None) 196 return manifest(web, req, None)
197 except ErrorResponse: 197 except ErrorResponse:
198 raise inst 198 raise inst
379 For non-searches, the ``changelog`` template will be rendered. 379 For non-searches, the ``changelog`` template will be rendered.
380 """ 380 """
381 381
382 query = '' 382 query = ''
383 if 'node' in web.req.qsparams: 383 if 'node' in web.req.qsparams:
384 ctx = webutil.changectx(web.repo, req) 384 ctx = webutil.changectx(web.repo, web.req)
385 symrev = webutil.symrevorshortnode(req, ctx) 385 symrev = webutil.symrevorshortnode(web.req, ctx)
386 elif 'rev' in web.req.qsparams: 386 elif 'rev' in web.req.qsparams:
387 return _search(web) 387 return _search(web)
388 else: 388 else:
389 ctx = web.repo['tip'] 389 ctx = web.repo['tip']
390 symrev = 'tip' 390 symrev = 'tip'
479 479
480 The ``changeset`` template is rendered. Contents of the ``changesettag``, 480 The ``changeset`` template is rendered. Contents of the ``changesettag``,
481 ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many 481 ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
482 templates related to diffs may all be used to produce the output. 482 templates related to diffs may all be used to produce the output.
483 """ 483 """
484 ctx = webutil.changectx(web.repo, req) 484 ctx = webutil.changectx(web.repo, web.req)
485 485
486 return web.sendtemplate( 486 return web.sendtemplate(
487 'changeset', 487 'changeset',
488 **webutil.changesetentry(web, req, ctx)) 488 **webutil.changesetentry(web, ctx))
489 489
490 rev = webcommand('rev')(changeset) 490 rev = webcommand('rev')(changeset)
491 491
492 def decodepath(path): 492 def decodepath(path):
493 """Hook for mapping a path in the repository to a path in the 493 """Hook for mapping a path in the repository to a path in the
513 directories and files. 513 directories and files.
514 514
515 The ``manifest`` template will be rendered for this handler. 515 The ``manifest`` template will be rendered for this handler.
516 """ 516 """
517 if 'node' in web.req.qsparams: 517 if 'node' in web.req.qsparams:
518 ctx = webutil.changectx(web.repo, req) 518 ctx = webutil.changectx(web.repo, web.req)
519 symrev = webutil.symrevorshortnode(req, ctx) 519 symrev = webutil.symrevorshortnode(web.req, ctx)
520 else: 520 else:
521 ctx = web.repo['tip'] 521 ctx = web.repo['tip']
522 symrev = 'tip' 522 symrev = 'tip'
523 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', '')) 523 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
524 mf = ctx.manifest() 524 mf = ctx.manifest()
790 This handler is registered under both the ``/diff`` and ``/filediff`` 790 This handler is registered under both the ``/diff`` and ``/filediff``
791 paths. ``/diff`` is used in modern code. 791 paths. ``/diff`` is used in modern code.
792 """ 792 """
793 fctx, ctx = None, None 793 fctx, ctx = None, None
794 try: 794 try:
795 fctx = webutil.filectx(web.repo, req) 795 fctx = webutil.filectx(web.repo, web.req)
796 except LookupError: 796 except LookupError:
797 ctx = webutil.changectx(web.repo, req) 797 ctx = webutil.changectx(web.repo, web.req)
798 path = webutil.cleanpath(web.repo, web.req.qsparams['file']) 798 path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
799 if path not in ctx.files(): 799 if path not in ctx.files():
800 raise 800 raise
801 801
802 if fctx is not None: 802 if fctx is not None:
817 ctx = ctx 817 ctx = ctx
818 818
819 return web.sendtemplate( 819 return web.sendtemplate(
820 'filediff', 820 'filediff',
821 file=path, 821 file=path,
822 symrev=webutil.symrevorshortnode(req, ctx), 822 symrev=webutil.symrevorshortnode(web.req, ctx),
823 rename=rename, 823 rename=rename,
824 diff=diffs, 824 diff=diffs,
825 **pycompat.strkwargs(webutil.commonentry(web.repo, ctx))) 825 **pycompat.strkwargs(webutil.commonentry(web.repo, ctx)))
826 826
827 diff = webcommand('diff')(filediff) 827 diff = webcommand('diff')(filediff)
841 The ``context`` query string argument can be used to control the lines of 841 The ``context`` query string argument can be used to control the lines of
842 context in the diff. 842 context in the diff.
843 843
844 The ``filecomparison`` template is rendered. 844 The ``filecomparison`` template is rendered.
845 """ 845 """
846 ctx = webutil.changectx(web.repo, req) 846 ctx = webutil.changectx(web.repo, web.req)
847 if 'file' not in web.req.qsparams: 847 if 'file' not in web.req.qsparams:
848 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given') 848 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
849 path = webutil.cleanpath(web.repo, web.req.qsparams['file']) 849 path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
850 850
851 parsecontext = lambda v: v == 'full' and -1 or int(v) 851 parsecontext = lambda v: v == 'full' and -1 or int(v)
890 ctx = ctx 890 ctx = ctx
891 891
892 return web.sendtemplate( 892 return web.sendtemplate(
893 'filecomparison', 893 'filecomparison',
894 file=path, 894 file=path,
895 symrev=webutil.symrevorshortnode(req, ctx), 895 symrev=webutil.symrevorshortnode(web.req, ctx),
896 rename=rename, 896 rename=rename,
897 leftrev=leftrev, 897 leftrev=leftrev,
898 leftnode=hex(leftnode), 898 leftnode=hex(leftnode),
899 rightrev=rightrev, 899 rightrev=rightrev,
900 rightnode=hex(rightnode), 900 rightnode=hex(rightnode),
916 false and ``1`` and ``true`` are true. If not defined, the server 916 false and ``1`` and ``true`` are true. If not defined, the server
917 default settings are used. 917 default settings are used.
918 918
919 The ``fileannotate`` template is rendered. 919 The ``fileannotate`` template is rendered.
920 """ 920 """
921 fctx = webutil.filectx(web.repo, req) 921 fctx = webutil.filectx(web.repo, web.req)
922 f = fctx.path() 922 f = fctx.path()
923 parity = paritygen(web.stripecount) 923 parity = paritygen(web.stripecount)
924 ishead = fctx.filerev() in fctx.filelog().headrevs() 924 ishead = fctx.filerev() in fctx.filelog().headrevs()
925 925
926 # parents() is called once per line and several lines likely belong to 926 # parents() is called once per line and several lines likely belong to
946 if fctx.isbinary(): 946 if fctx.isbinary():
947 mt = (mimetypes.guess_type(fctx.path())[0] 947 mt = (mimetypes.guess_type(fctx.path())[0]
948 or 'application/octet-stream') 948 or 'application/octet-stream')
949 lines = [((fctx.filectx(fctx.filerev()), 1), '(binary:%s)' % mt)] 949 lines = [((fctx.filectx(fctx.filerev()), 1), '(binary:%s)' % mt)]
950 else: 950 else:
951 lines = webutil.annotate(req, fctx, web.repo.ui) 951 lines = webutil.annotate(web.req, fctx, web.repo.ui)
952 952
953 previousrev = None 953 previousrev = None
954 blockparitygen = paritygen(1) 954 blockparitygen = paritygen(1)
955 for lineno, (aline, l) in enumerate(lines): 955 for lineno, (aline, l) in enumerate(lines):
956 f = aline.fctx 956 f = aline.fctx
976 "lineno": lineno + 1, 976 "lineno": lineno + 1,
977 "lineid": "l%d" % (lineno + 1), 977 "lineid": "l%d" % (lineno + 1),
978 "linenumber": "% 6d" % (lineno + 1), 978 "linenumber": "% 6d" % (lineno + 1),
979 "revdate": f.date()} 979 "revdate": f.date()}
980 980
981 diffopts = webutil.difffeatureopts(req, web.repo.ui, 'annotate') 981 diffopts = webutil.difffeatureopts(web.req, web.repo.ui, 'annotate')
982 diffopts = {k: getattr(diffopts, k) for k in diffopts.defaults} 982 diffopts = {k: getattr(diffopts, k) for k in diffopts.defaults}
983 983
984 return web.sendtemplate( 984 return web.sendtemplate(
985 'fileannotate', 985 'fileannotate',
986 file=f, 986 file=f,
987 annotate=annotate, 987 annotate=annotate,
988 path=webutil.up(f), 988 path=webutil.up(f),
989 symrev=webutil.symrevorshortnode(req, fctx), 989 symrev=webutil.symrevorshortnode(web.req, fctx),
990 rename=webutil.renamelink(fctx), 990 rename=webutil.renamelink(fctx),
991 permissions=fctx.manifest().flags(f), 991 permissions=fctx.manifest().flags(f),
992 ishead=int(ishead), 992 ishead=int(ishead),
993 diffopts=diffopts, 993 diffopts=diffopts,
994 **pycompat.strkwargs(webutil.commonentry(web.repo, fctx))) 994 **pycompat.strkwargs(webutil.commonentry(web.repo, fctx)))
1006 1006
1007 The ``filelog`` template will be rendered. 1007 The ``filelog`` template will be rendered.
1008 """ 1008 """
1009 1009
1010 try: 1010 try:
1011 fctx = webutil.filectx(web.repo, req) 1011 fctx = webutil.filectx(web.repo, web.req)
1012 f = fctx.path() 1012 f = fctx.path()
1013 fl = fctx.filelog() 1013 fl = fctx.filelog()
1014 except error.LookupError: 1014 except error.LookupError:
1015 f = webutil.cleanpath(web.repo, web.req.qsparams['file']) 1015 f = webutil.cleanpath(web.repo, web.req.qsparams['file'])
1016 fl = web.repo.file(f) 1016 fl = web.repo.file(f)
1017 numrevs = len(fl) 1017 numrevs = len(fl)
1018 if not numrevs: # file doesn't exist at all 1018 if not numrevs: # file doesn't exist at all
1019 raise 1019 raise
1020 rev = webutil.changectx(web.repo, req).rev() 1020 rev = webutil.changectx(web.repo, web.req).rev()
1021 first = fl.linkrev(0) 1021 first = fl.linkrev(0)
1022 if rev < first: # current rev is from before file existed 1022 if rev < first: # current rev is from before file existed
1023 raise 1023 raise
1024 frev = numrevs - 1 1024 frev = numrevs - 1
1025 while fl.linkrev(frev) > rev: 1025 while fl.linkrev(frev) > rev:
1033 revcount = max(revcount, 1) 1033 revcount = max(revcount, 1)
1034 web.tmpl.defaults['sessionvars']['revcount'] = revcount 1034 web.tmpl.defaults['sessionvars']['revcount'] = revcount
1035 except ValueError: 1035 except ValueError:
1036 pass 1036 pass
1037 1037
1038 lrange = webutil.linerange(req) 1038 lrange = webutil.linerange(web.req)
1039 1039
1040 lessvars = copy.copy(web.tmpl.defaults['sessionvars']) 1040 lessvars = copy.copy(web.tmpl.defaults['sessionvars'])
1041 lessvars['revcount'] = max(revcount // 2, 1) 1041 lessvars['revcount'] = max(revcount // 2, 1)
1042 morevars = copy.copy(web.tmpl.defaults['sessionvars']) 1042 morevars = copy.copy(web.tmpl.defaults['sessionvars'])
1043 morevars['revcount'] = revcount * 2 1043 morevars['revcount'] = revcount * 2
1118 1118
1119 return web.sendtemplate( 1119 return web.sendtemplate(
1120 'filelog', 1120 'filelog',
1121 file=f, 1121 file=f,
1122 nav=nav, 1122 nav=nav,
1123 symrev=webutil.symrevorshortnode(req, fctx), 1123 symrev=webutil.symrevorshortnode(web.req, fctx),
1124 entries=entries, 1124 entries=entries,
1125 descend=descend, 1125 descend=descend,
1126 patch=patch, 1126 patch=patch,
1127 latestentry=latestentry, 1127 latestentry=latestentry,
1128 linerange=linerange, 1128 linerange=linerange,
1170 arch_version = key 1170 arch_version = key
1171 if cnode == key or key == 'tip': 1171 if cnode == key or key == 'tip':
1172 arch_version = short(cnode) 1172 arch_version = short(cnode)
1173 name = "%s-%s" % (reponame, arch_version) 1173 name = "%s-%s" % (reponame, arch_version)
1174 1174
1175 ctx = webutil.changectx(web.repo, req) 1175 ctx = webutil.changectx(web.repo, web.req)
1176 pats = [] 1176 pats = []
1177 match = scmutil.match(ctx, []) 1177 match = scmutil.match(ctx, [])
1178 file = web.req.qsparams.get('file') 1178 file = web.req.qsparams.get('file')
1179 if file: 1179 if file:
1180 pats = ['path:' + file] 1180 pats = ['path:' + file]
1243 1243
1244 This handler will render the ``graph`` template. 1244 This handler will render the ``graph`` template.
1245 """ 1245 """
1246 1246
1247 if 'node' in web.req.qsparams: 1247 if 'node' in web.req.qsparams:
1248 ctx = webutil.changectx(web.repo, req) 1248 ctx = webutil.changectx(web.repo, web.req)
1249 symrev = webutil.symrevorshortnode(req, ctx) 1249 symrev = webutil.symrevorshortnode(web.req, ctx)
1250 else: 1250 else:
1251 ctx = web.repo['tip'] 1251 ctx = web.repo['tip']
1252 symrev = 'tip' 1252 symrev = 'tip'
1253 rev = ctx.rev() 1253 rev = ctx.rev()
1254 1254