comparison mercurial/hgweb/webcommands.py @ 36882:66f62d120ba2

hgweb: use web.req instead of req.req We now have access to the modern request type on the requestcontext instance. Let's access it from there. While we're here, remove an unused argument from _search(). Differential Revision: https://phab.mercurial-scm.org/D2798
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 10 Mar 2018 19:11:41 -0800
parents 67fb0dca29bc
children 061635d4221c
comparison
equal deleted inserted replaced
36881:96a93625a824 36882:66f62d120ba2
91 91
92 For URLs of the form ``/log/{revision}/{file}``, the history for a specific 92 For URLs of the form ``/log/{revision}/{file}``, the history for a specific
93 file will be shown. This form is equivalent to the ``filelog`` handler. 93 file will be shown. This form is equivalent to the ``filelog`` handler.
94 """ 94 """
95 95
96 if req.req.qsparams.get('file'): 96 if web.req.qsparams.get('file'):
97 return filelog(web, req, tmpl) 97 return filelog(web, req, tmpl)
98 else: 98 else:
99 return changelog(web, req, tmpl) 99 return changelog(web, req, tmpl)
100 100
101 @webcommand('rawfile') 101 @webcommand('rawfile')
102 def rawfile(web, req, tmpl): 102 def rawfile(web, req, tmpl):
103 guessmime = web.configbool('web', 'guessmime') 103 guessmime = web.configbool('web', 'guessmime')
104 104
105 path = webutil.cleanpath(web.repo, req.req.qsparams.get('file', '')) 105 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
106 if not path: 106 if not path:
107 return manifest(web, req, tmpl) 107 return manifest(web, req, tmpl)
108 108
109 try: 109 try:
110 fctx = webutil.filectx(web.repo, req) 110 fctx = webutil.filectx(web.repo, req)
185 be rendered. 185 be rendered.
186 """ 186 """
187 if web.req.qsparams.get('style') == 'raw': 187 if web.req.qsparams.get('style') == 'raw':
188 return rawfile(web, req, tmpl) 188 return rawfile(web, req, tmpl)
189 189
190 path = webutil.cleanpath(web.repo, req.req.qsparams.get('file', '')) 190 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
191 if not path: 191 if not path:
192 return manifest(web, req, tmpl) 192 return manifest(web, req, tmpl)
193 try: 193 try:
194 return _filerevision(web, req, tmpl, webutil.filectx(web.repo, req)) 194 return _filerevision(web, req, tmpl, webutil.filectx(web.repo, req))
195 except error.LookupError as inst: 195 except error.LookupError as inst:
196 try: 196 try:
197 return manifest(web, req, tmpl) 197 return manifest(web, req, tmpl)
198 except ErrorResponse: 198 except ErrorResponse:
199 raise inst 199 raise inst
200 200
201 def _search(web, req, tmpl): 201 def _search(web, tmpl):
202 MODE_REVISION = 'rev' 202 MODE_REVISION = 'rev'
203 MODE_KEYWORD = 'keyword' 203 MODE_KEYWORD = 'keyword'
204 MODE_REVSET = 'revset' 204 MODE_REVSET = 'revset'
205 205
206 def revsearch(ctx): 206 def revsearch(ctx):
301 **pycompat.strkwargs(webutil.commonentry(web.repo, ctx))) 301 **pycompat.strkwargs(webutil.commonentry(web.repo, ctx)))
302 302
303 if count >= revcount: 303 if count >= revcount:
304 break 304 break
305 305
306 query = req.req.qsparams['rev'] 306 query = web.req.qsparams['rev']
307 revcount = web.maxchanges 307 revcount = web.maxchanges
308 if 'revcount' in req.req.qsparams: 308 if 'revcount' in web.req.qsparams:
309 try: 309 try:
310 revcount = int(req.req.qsparams.get('revcount', revcount)) 310 revcount = int(web.req.qsparams.get('revcount', revcount))
311 revcount = max(revcount, 1) 311 revcount = max(revcount, 1)
312 tmpl.defaults['sessionvars']['revcount'] = revcount 312 tmpl.defaults['sessionvars']['revcount'] = revcount
313 except ValueError: 313 except ValueError:
314 pass 314 pass
315 315
320 morevars['revcount'] = revcount * 2 320 morevars['revcount'] = revcount * 2
321 morevars['rev'] = query 321 morevars['rev'] = query
322 322
323 mode, funcarg = getsearchmode(query) 323 mode, funcarg = getsearchmode(query)
324 324
325 if 'forcekw' in req.req.qsparams: 325 if 'forcekw' in web.req.qsparams:
326 showforcekw = '' 326 showforcekw = ''
327 showunforcekw = searchfuncs[mode][1] 327 showunforcekw = searchfuncs[mode][1]
328 mode = MODE_KEYWORD 328 mode = MODE_KEYWORD
329 funcarg = query 329 funcarg = query
330 else: 330 else:
379 379
380 For non-searches, the ``changelog`` template will be rendered. 380 For non-searches, the ``changelog`` template will be rendered.
381 """ 381 """
382 382
383 query = '' 383 query = ''
384 if 'node' in req.req.qsparams: 384 if 'node' in web.req.qsparams:
385 ctx = webutil.changectx(web.repo, req) 385 ctx = webutil.changectx(web.repo, req)
386 symrev = webutil.symrevorshortnode(req, ctx) 386 symrev = webutil.symrevorshortnode(req, ctx)
387 elif 'rev' in req.req.qsparams: 387 elif 'rev' in web.req.qsparams:
388 return _search(web, req, tmpl) 388 return _search(web, tmpl)
389 else: 389 else:
390 ctx = web.repo['tip'] 390 ctx = web.repo['tip']
391 symrev = 'tip' 391 symrev = 'tip'
392 392
393 def changelist(): 393 def changelist():
407 if shortlog: 407 if shortlog:
408 revcount = web.maxshortchanges 408 revcount = web.maxshortchanges
409 else: 409 else:
410 revcount = web.maxchanges 410 revcount = web.maxchanges
411 411
412 if 'revcount' in req.req.qsparams: 412 if 'revcount' in web.req.qsparams:
413 try: 413 try:
414 revcount = int(req.req.qsparams.get('revcount', revcount)) 414 revcount = int(web.req.qsparams.get('revcount', revcount))
415 revcount = max(revcount, 1) 415 revcount = max(revcount, 1)
416 tmpl.defaults['sessionvars']['revcount'] = revcount 416 tmpl.defaults['sessionvars']['revcount'] = revcount
417 except ValueError: 417 except ValueError:
418 pass 418 pass
419 419
514 is recommended to use the ``file`` handler instead, as it can handle both 514 is recommended to use the ``file`` handler instead, as it can handle both
515 directories and files. 515 directories and files.
516 516
517 The ``manifest`` template will be rendered for this handler. 517 The ``manifest`` template will be rendered for this handler.
518 """ 518 """
519 if 'node' in req.req.qsparams: 519 if 'node' in web.req.qsparams:
520 ctx = webutil.changectx(web.repo, req) 520 ctx = webutil.changectx(web.repo, req)
521 symrev = webutil.symrevorshortnode(req, ctx) 521 symrev = webutil.symrevorshortnode(req, ctx)
522 else: 522 else:
523 ctx = web.repo['tip'] 523 ctx = web.repo['tip']
524 symrev = 'tip' 524 symrev = 'tip'
525 path = webutil.cleanpath(web.repo, req.req.qsparams.get('file', '')) 525 path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
526 mf = ctx.manifest() 526 mf = ctx.manifest()
527 node = ctx.node() 527 node = ctx.node()
528 528
529 files = {} 529 files = {}
530 dirs = {} 530 dirs = {}
804 fctx, ctx = None, None 804 fctx, ctx = None, None
805 try: 805 try:
806 fctx = webutil.filectx(web.repo, req) 806 fctx = webutil.filectx(web.repo, req)
807 except LookupError: 807 except LookupError:
808 ctx = webutil.changectx(web.repo, req) 808 ctx = webutil.changectx(web.repo, req)
809 path = webutil.cleanpath(web.repo, req.req.qsparams['file']) 809 path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
810 if path not in ctx.files(): 810 if path not in ctx.files():
811 raise 811 raise
812 812
813 if fctx is not None: 813 if fctx is not None:
814 path = fctx.path() 814 path = fctx.path()
815 ctx = fctx.changectx() 815 ctx = fctx.changectx()
816 basectx = ctx.p1() 816 basectx = ctx.p1()
817 817
818 style = web.config('web', 'style') 818 style = web.config('web', 'style')
819 if 'style' in req.req.qsparams: 819 if 'style' in web.req.qsparams:
820 style = req.req.qsparams['style'] 820 style = web.req.qsparams['style']
821 821
822 diffs = webutil.diffs(web, tmpl, ctx, basectx, [path], style) 822 diffs = webutil.diffs(web, tmpl, ctx, basectx, [path], style)
823 if fctx is not None: 823 if fctx is not None:
824 rename = webutil.renamelink(fctx) 824 rename = webutil.renamelink(fctx)
825 ctx = fctx 825 ctx = fctx
855 context in the diff. 855 context in the diff.
856 856
857 The ``filecomparison`` template is rendered. 857 The ``filecomparison`` template is rendered.
858 """ 858 """
859 ctx = webutil.changectx(web.repo, req) 859 ctx = webutil.changectx(web.repo, req)
860 if 'file' not in req.req.qsparams: 860 if 'file' not in web.req.qsparams:
861 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given') 861 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
862 path = webutil.cleanpath(web.repo, req.req.qsparams['file']) 862 path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
863 863
864 parsecontext = lambda v: v == 'full' and -1 or int(v) 864 parsecontext = lambda v: v == 'full' and -1 or int(v)
865 if 'context' in req.req.qsparams: 865 if 'context' in web.req.qsparams:
866 context = parsecontext(req.req.qsparams['context']) 866 context = parsecontext(web.req.qsparams['context'])
867 else: 867 else:
868 context = parsecontext(web.config('web', 'comparisoncontext', '5')) 868 context = parsecontext(web.config('web', 'comparisoncontext', '5'))
869 869
870 def filelines(f): 870 def filelines(f):
871 if f.isbinary(): 871 if f.isbinary():
1027 try: 1027 try:
1028 fctx = webutil.filectx(web.repo, req) 1028 fctx = webutil.filectx(web.repo, req)
1029 f = fctx.path() 1029 f = fctx.path()
1030 fl = fctx.filelog() 1030 fl = fctx.filelog()
1031 except error.LookupError: 1031 except error.LookupError:
1032 f = webutil.cleanpath(web.repo, req.req.qsparams['file']) 1032 f = webutil.cleanpath(web.repo, web.req.qsparams['file'])
1033 fl = web.repo.file(f) 1033 fl = web.repo.file(f)
1034 numrevs = len(fl) 1034 numrevs = len(fl)
1035 if not numrevs: # file doesn't exist at all 1035 if not numrevs: # file doesn't exist at all
1036 raise 1036 raise
1037 rev = webutil.changectx(web.repo, req).rev() 1037 rev = webutil.changectx(web.repo, req).rev()
1042 while fl.linkrev(frev) > rev: 1042 while fl.linkrev(frev) > rev:
1043 frev -= 1 1043 frev -= 1
1044 fctx = web.repo.filectx(f, fl.linkrev(frev)) 1044 fctx = web.repo.filectx(f, fl.linkrev(frev))
1045 1045
1046 revcount = web.maxshortchanges 1046 revcount = web.maxshortchanges
1047 if 'revcount' in req.req.qsparams: 1047 if 'revcount' in web.req.qsparams:
1048 try: 1048 try:
1049 revcount = int(req.req.qsparams.get('revcount', revcount)) 1049 revcount = int(web.req.qsparams.get('revcount', revcount))
1050 revcount = max(revcount, 1) 1050 revcount = max(revcount, 1)
1051 tmpl.defaults['sessionvars']['revcount'] = revcount 1051 tmpl.defaults['sessionvars']['revcount'] = revcount
1052 except ValueError: 1052 except ValueError:
1053 pass 1053 pass
1054 1054
1057 lessvars = copy.copy(tmpl.defaults['sessionvars']) 1057 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1058 lessvars['revcount'] = max(revcount // 2, 1) 1058 lessvars['revcount'] = max(revcount // 2, 1)
1059 morevars = copy.copy(tmpl.defaults['sessionvars']) 1059 morevars = copy.copy(tmpl.defaults['sessionvars'])
1060 morevars['revcount'] = revcount * 2 1060 morevars['revcount'] = revcount * 2
1061 1061
1062 patch = 'patch' in req.req.qsparams 1062 patch = 'patch' in web.req.qsparams
1063 if patch: 1063 if patch:
1064 lessvars['patch'] = morevars['patch'] = req.req.qsparams['patch'] 1064 lessvars['patch'] = morevars['patch'] = web.req.qsparams['patch']
1065 descend = 'descend' in req.req.qsparams 1065 descend = 'descend' in web.req.qsparams
1066 if descend: 1066 if descend:
1067 lessvars['descend'] = morevars['descend'] = req.req.qsparams['descend'] 1067 lessvars['descend'] = morevars['descend'] = web.req.qsparams['descend']
1068 1068
1069 count = fctx.filerev() + 1 1069 count = fctx.filerev() + 1
1070 start = max(0, count - revcount) # first rev on this page 1070 start = max(0, count - revcount) # first rev on this page
1071 end = min(count, start + revcount) # last rev on this page 1071 end = min(count, start + revcount) # last rev on this page
1072 parity = paritygen(web.stripecount, offset=start - end) 1072 parity = paritygen(web.stripecount, offset=start - end)
1074 repo = web.repo 1074 repo = web.repo
1075 revs = fctx.filelog().revs(start, end - 1) 1075 revs = fctx.filelog().revs(start, end - 1)
1076 entries = [] 1076 entries = []
1077 1077
1078 diffstyle = web.config('web', 'style') 1078 diffstyle = web.config('web', 'style')
1079 if 'style' in req.req.qsparams: 1079 if 'style' in web.req.qsparams:
1080 diffstyle = req.req.qsparams['style'] 1080 diffstyle = web.req.qsparams['style']
1081 1081
1082 def diff(fctx, linerange=None): 1082 def diff(fctx, linerange=None):
1083 ctx = fctx.changectx() 1083 ctx = fctx.changectx()
1084 basectx = ctx.p1() 1084 basectx = ctx.p1()
1085 path = fctx.path() 1085 path = fctx.path()
1169 directory will be included in the archive. 1169 directory will be included in the archive.
1170 1170
1171 No template is used for this handler. Raw, binary content is generated. 1171 No template is used for this handler. Raw, binary content is generated.
1172 """ 1172 """
1173 1173
1174 type_ = req.req.qsparams.get('type') 1174 type_ = web.req.qsparams.get('type')
1175 allowed = web.configlist("web", "allow_archive") 1175 allowed = web.configlist("web", "allow_archive")
1176 key = req.req.qsparams['node'] 1176 key = web.req.qsparams['node']
1177 1177
1178 if type_ not in web.archivespecs: 1178 if type_ not in web.archivespecs:
1179 msg = 'Unsupported archive type: %s' % type_ 1179 msg = 'Unsupported archive type: %s' % type_
1180 raise ErrorResponse(HTTP_NOT_FOUND, msg) 1180 raise ErrorResponse(HTTP_NOT_FOUND, msg)
1181 1181
1192 name = "%s-%s" % (reponame, arch_version) 1192 name = "%s-%s" % (reponame, arch_version)
1193 1193
1194 ctx = webutil.changectx(web.repo, req) 1194 ctx = webutil.changectx(web.repo, req)
1195 pats = [] 1195 pats = []
1196 match = scmutil.match(ctx, []) 1196 match = scmutil.match(ctx, [])
1197 file = req.req.qsparams.get('file') 1197 file = web.req.qsparams.get('file')
1198 if file: 1198 if file:
1199 pats = ['path:' + file] 1199 pats = ['path:' + file]
1200 match = scmutil.match(ctx, pats, default='path') 1200 match = scmutil.match(ctx, pats, default='path')
1201 if pats: 1201 if pats:
1202 files = [f for f in ctx.manifest().keys() if match(f)] 1202 files = [f for f in ctx.manifest().keys() if match(f)]
1224 1224
1225 return [] 1225 return []
1226 1226
1227 @webcommand('static') 1227 @webcommand('static')
1228 def static(web, req, tmpl): 1228 def static(web, req, tmpl):
1229 fname = req.req.qsparams['file'] 1229 fname = web.req.qsparams['file']
1230 # a repo owner may set web.static in .hg/hgrc to get any file 1230 # a repo owner may set web.static in .hg/hgrc to get any file
1231 # readable by the user running the CGI script 1231 # readable by the user running the CGI script
1232 static = web.config("web", "static", None, untrusted=False) 1232 static = web.config("web", "static", None, untrusted=False)
1233 if not static: 1233 if not static:
1234 tp = web.templatepath or templater.templatepaths() 1234 tp = web.templatepath or templater.templatepaths()
1261 JavaScript. By default it has the same value as ``revision``. 1261 JavaScript. By default it has the same value as ``revision``.
1262 1262
1263 This handler will render the ``graph`` template. 1263 This handler will render the ``graph`` template.
1264 """ 1264 """
1265 1265
1266 if 'node' in req.req.qsparams: 1266 if 'node' in web.req.qsparams:
1267 ctx = webutil.changectx(web.repo, req) 1267 ctx = webutil.changectx(web.repo, req)
1268 symrev = webutil.symrevorshortnode(req, ctx) 1268 symrev = webutil.symrevorshortnode(req, ctx)
1269 else: 1269 else:
1270 ctx = web.repo['tip'] 1270 ctx = web.repo['tip']
1271 symrev = 'tip' 1271 symrev = 'tip'
1272 rev = ctx.rev() 1272 rev = ctx.rev()
1273 1273
1274 bg_height = 39 1274 bg_height = 39
1275 revcount = web.maxshortchanges 1275 revcount = web.maxshortchanges
1276 if 'revcount' in req.req.qsparams: 1276 if 'revcount' in web.req.qsparams:
1277 try: 1277 try:
1278 revcount = int(req.req.qsparams.get('revcount', revcount)) 1278 revcount = int(web.req.qsparams.get('revcount', revcount))
1279 revcount = max(revcount, 1) 1279 revcount = max(revcount, 1)
1280 tmpl.defaults['sessionvars']['revcount'] = revcount 1280 tmpl.defaults['sessionvars']['revcount'] = revcount
1281 except ValueError: 1281 except ValueError:
1282 pass 1282 pass
1283 1283
1284 lessvars = copy.copy(tmpl.defaults['sessionvars']) 1284 lessvars = copy.copy(tmpl.defaults['sessionvars'])
1285 lessvars['revcount'] = max(revcount // 2, 1) 1285 lessvars['revcount'] = max(revcount // 2, 1)
1286 morevars = copy.copy(tmpl.defaults['sessionvars']) 1286 morevars = copy.copy(tmpl.defaults['sessionvars'])
1287 morevars['revcount'] = revcount * 2 1287 morevars['revcount'] = revcount * 2
1288 1288
1289 graphtop = req.req.qsparams.get('graphtop', ctx.hex()) 1289 graphtop = web.req.qsparams.get('graphtop', ctx.hex())
1290 graphvars = copy.copy(tmpl.defaults['sessionvars']) 1290 graphvars = copy.copy(tmpl.defaults['sessionvars'])
1291 graphvars['graphtop'] = graphtop 1291 graphvars['graphtop'] = graphtop
1292 1292
1293 count = len(web.repo) 1293 count = len(web.repo)
1294 pos = rev 1294 pos = rev
1423 The ``help`` template will be rendered when requesting help for a topic. 1423 The ``help`` template will be rendered when requesting help for a topic.
1424 ``helptopics`` will be rendered for the index of help topics. 1424 ``helptopics`` will be rendered for the index of help topics.
1425 """ 1425 """
1426 from .. import commands, help as helpmod # avoid cycle 1426 from .. import commands, help as helpmod # avoid cycle
1427 1427
1428 topicname = req.req.qsparams.get('node') 1428 topicname = web.req.qsparams.get('node')
1429 if not topicname: 1429 if not topicname:
1430 def topics(**map): 1430 def topics(**map):
1431 for entries, summary, _doc in helpmod.helptable: 1431 for entries, summary, _doc in helpmod.helptable:
1432 yield {'topic': entries[0], 'summary': summary} 1432 yield {'topic': entries[0], 'summary': summary}
1433 1433