Patchwork D2796: hgweb: always return iterable from @webcommand functions (API)

login
register
mail settings
Submitter phabricator
Date March 12, 2018, 9:34 p.m.
Message ID <a2bfde5464b6a3f53022787d31ada06b@localhost.localdomain>
Download mbox | patch
Permalink /patch/29379/
State Not Applicable
Headers show

Comments

phabricator - March 12, 2018, 9:34 p.m.
This revision was automatically updated to reflect the committed changes.
Closed by commit rHG67fb0dca29bc: hgweb: always return iterable from @webcommand functions (API) (authored by indygreg, committed by ).

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D2796?vs=6857&id=6932

REVISION DETAIL
  https://phab.mercurial-scm.org/D2796

AFFECTED FILES
  hgext/highlight/__init__.py
  hgext/keyword.py
  mercurial/hgweb/hgweb_mod.py
  mercurial/hgweb/webcommands.py

CHANGE DETAILS




To: indygreg, #hg-reviewers, durin42
Cc: mercurial-devel

Patch

diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
--- a/mercurial/hgweb/webcommands.py
+++ b/mercurial/hgweb/webcommands.py
@@ -57,12 +57,9 @@ 
     The functions should populate the ``rctx.res`` object with details
     about the HTTP response.
 
-    The function can return the ``requestcontext.res`` instance to signal
-    that it wants to use this object to generate the response. If an iterable
-    is returned, the ``wsgirequest`` instance will be used and the returned
-    content will constitute the response body. ``True`` can be returned to
-    indicate that the function already sent output and the caller doesn't
-    need to do anything more to send the response.
+    The function returns a generator to be consumed by the WSGI application.
+    For most commands, this should be the result from
+    ``web.res.sendresponse()``.
 
     Usage:
 
@@ -135,7 +132,7 @@ 
                 .replace('\\', '\\\\').replace('"', '\\"'))
     web.res.headers['Content-Disposition'] = 'inline; filename="%s"' % filename
     web.res.setbodybytes(text)
-    return web.res
+    return web.res.sendresponse()
 
 def _filerevision(web, req, tmpl, fctx):
     f = fctx.path()
@@ -165,7 +162,7 @@ 
         ishead=int(ishead),
         **pycompat.strkwargs(webutil.commonentry(web.repo, fctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('file')
 def file(web, req, tmpl):
@@ -355,7 +352,7 @@ 
         showforcekw=showforcekw,
         showunforcekw=showunforcekw))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('changelog')
 def changelog(web, req, tmpl, shortlog=False):
@@ -455,7 +452,7 @@ 
         lessvars=lessvars,
         query=query))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('shortlog')
 def shortlog(web, req, tmpl):
@@ -490,7 +487,7 @@ 
     ctx = webutil.changectx(web.repo, req)
     web.res.setbodygen(tmpl('changeset',
                             **webutil.changesetentry(web, req, tmpl, ctx)))
-    return web.res
+    return web.res.sendresponse()
 
 rev = webcommand('rev')(changeset)
 
@@ -602,7 +599,7 @@ 
         archives=web.archivelist(hex(node)),
         **pycompat.strkwargs(webutil.commonentry(web.repo, ctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('tags')
 def tags(web, req, tmpl):
@@ -638,7 +635,7 @@ 
         entriesnotip=lambda **x: entries(True, False, **x),
         latestentry=lambda **x: entries(True, True, **x)))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('bookmarks')
 def bookmarks(web, req, tmpl):
@@ -679,7 +676,7 @@ 
         entries=lambda **x: entries(latestonly=False, **x),
         latestentry=lambda **x: entries(latestonly=True, **x)))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('branches')
 def branches(web, req, tmpl):
@@ -704,7 +701,7 @@ 
         entries=entries,
         latestentry=latestentry))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('summary')
 def summary(web, req, tmpl):
@@ -789,7 +786,7 @@ 
         archives=web.archivelist('tip'),
         labels=web.configlist('web', 'labels')))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('filediff')
 def filediff(web, req, tmpl):
@@ -838,7 +835,7 @@ 
         diff=diffs,
         **pycompat.strkwargs(webutil.commonentry(web.repo, ctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 diff = webcommand('diff')(filediff)
 
@@ -917,7 +914,7 @@ 
         comparison=comparison,
         **pycompat.strkwargs(webutil.commonentry(web.repo, ctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('annotate')
 def annotate(web, req, tmpl):
@@ -1011,7 +1008,7 @@ 
         diffopts=diffopts,
         **pycompat.strkwargs(webutil.commonentry(web.repo, fctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('filelog')
 def filelog(web, req, tmpl):
@@ -1151,7 +1148,7 @@ 
         lessvars=lessvars,
         **pycompat.strkwargs(webutil.commonentry(web.repo, fctx))))
 
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('archive')
 def archive(web, req, tmpl):
@@ -1225,7 +1222,7 @@ 
                      matchfn=match,
                      subrepos=web.configbool("web", "archivesubrepos"))
 
-    return True
+    return []
 
 @webcommand('static')
 def static(web, req, tmpl):
@@ -1240,7 +1237,7 @@ 
         static = [os.path.join(p, 'static') for p in tp]
 
     staticfile(static, fname, web.res)
-    return web.res
+    return web.res.sendresponse()
 
 @webcommand('graph')
 def graph(web, req, tmpl):
@@ -1401,7 +1398,7 @@ 
         node=ctx.hex(),
         changenav=changenav))
 
-    return web.res
+    return web.res.sendresponse()
 
 def _getdoc(e):
     doc = e[0].__doc__
@@ -1463,7 +1460,7 @@ 
             earlycommands=earlycommands,
             othercommands=othercommands,
             title='Index'))
-        return web.res
+        return web.res.sendresponse()
 
     # Render an index of sub-topics.
     if topicname in helpmod.subtopics:
@@ -1480,7 +1477,7 @@ 
             topics=topics,
             title=topicname,
             subindex=True))
-        return web.res
+        return web.res.sendresponse()
 
     u = webutil.wsgiui.load()
     u.verbose = True
@@ -1506,7 +1503,7 @@ 
         topic=topicname,
         doc=doc))
 
-    return web.res
+    return web.res.sendresponse()
 
 # tell hggettext to extract docstrings from these functions:
 i18nfunctions = commands.values()
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -14,7 +14,6 @@ 
 from .common import (
     ErrorResponse,
     HTTP_BAD_REQUEST,
-    HTTP_OK,
     cspvalues,
     permhooks,
     statusmessage,
@@ -405,15 +404,7 @@ 
                 # override easily enough.
                 res.status = '200 Script output follows'
                 res.headers['Content-Type'] = ctype
-                content = getattr(webcommands, cmd)(rctx, wsgireq, tmpl)
-
-                if content is res:
-                    return res.sendresponse()
-                elif content is True:
-                    return []
-                else:
-                    wsgireq.respond(HTTP_OK, ctype)
-                    return content
+                return getattr(webcommands, cmd)(rctx, wsgireq, tmpl)
 
         except (error.LookupError, error.RepoLookupError) as err:
             msg = pycompat.bytestr(err)
diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -621,13 +621,7 @@ 
         origmatch = kwt.match
         kwt.match = util.never
     try:
-        res = orig(web, req, tmpl)
-        if res is web.res:
-            res = res.sendresponse()
-        elif res is True:
-            return
-
-        for chunk in res:
+        for chunk in orig(web, req, tmpl):
             yield chunk
     finally:
         if kwt:
diff --git a/hgext/highlight/__init__.py b/hgext/highlight/__init__.py
--- a/hgext/highlight/__init__.py
+++ b/hgext/highlight/__init__.py
@@ -88,7 +88,7 @@ 
         '/* pygments_style = %s */\n\n' % pg_style,
         fmter.get_style_defs(''),
     ]))
-    return web.res
+    return web.res.sendresponse()
 
 def extsetup():
     # monkeypatch in the new version