hgweb: query string arguments to control whitespace for annotate

This feature should hopefully be pretty straightforward. We simply
examine some query string arguments to feed into the diff options.

The function to obtain the diff options has been factored into its
own generic function to facilitate an upcoming change to the HTML
interface and to enable diff settings to be controlled via the same
query string arguments on other web commands.

The test output for "ignoreblanklines" didn't change. I'm not sure
why. Our test coverage for --ignore-blank-lines isn't great and I
can't figure out how to make this diff setting do anything meaningful.
On a very brief examination of the code, it is possible the setting
doesn't work because it is operating at the line level and blank lines
detection needs to examine multiple lines. But I'm not an expert in
this code, so I'm not sure.

Differential Revision: https://phab.mercurial-scm.org/D849
This commit is contained in:
Gregory Szorc 2017-09-30 09:08:01 +01:00
parent 354d865ae5
commit 0ed01b356d
3 changed files with 137 additions and 116 deletions

View File

@ -863,6 +863,12 @@ def annotate(web, req, tmpl):
Show changeset information for each line in a file.
The ``ignorews``, ``ignorewsamount``, ``ignorewseol``, and
``ignoreblanklines`` query string arguments have the same meaning as
their ``[annotate]`` config equivalents. A value of ``0`` sets the
whitespace option to false. All other values are true. If not defined,
the server default settings are used.
The ``fileannotate`` template is rendered.
"""
fctx = webutil.filectx(web.repo, req)
@ -895,7 +901,7 @@ def annotate(web, req, tmpl):
or 'application/octet-stream')
lines = [((fctx.filectx(fctx.filerev()), 1), '(binary:%s)' % mt)]
else:
lines = webutil.annotate(fctx, web.repo.ui)
lines = webutil.annotate(req, fctx, web.repo.ui)
previousrev = None
blockparitygen = paritygen(1)

View File

@ -170,9 +170,24 @@ class _siblings(object):
def __len__(self):
return len(self.siblings)
def annotate(fctx, ui):
def difffeatureopts(req, ui, section):
diffopts = patch.difffeatureopts(ui, untrusted=True,
section='annotate', whitespace=True)
section=section, whitespace=True)
for k in ('ignorews', 'ignorewsamount', 'ignorewseol', 'ignoreblanklines'):
v = req.form.get(k, [None])[0]
if v is not None:
try:
v = bool(int(v))
except ValueError:
v = True
setattr(diffopts, k, v)
return diffopts
def annotate(req, fctx, ui):
diffopts = difffeatureopts(req, ui, 'annotate')
return fctx.annotate(follow=True, linenumber=True, diffopts=diffopts)
def parents(ctx, hide=None):

View File

@ -282,7 +282,7 @@ annotate.ignorews=1 config option is honored
"permissions": ""
}
ignorews=1 query string argument enables whitespace skipping (not implemented)
ignorews=1 query string argument enables whitespace skipping
$ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorews=1'
200 Script output follows
@ -293,10 +293,10 @@ ignorews=1 query string argument enables whitespace skipping (not implemented)
{
"abspath": "foo",
"author": "test",
"desc": "commit 4 (intra whitespace on line 0)",
"desc": "commit 0",
"line": "line 0\n",
"lineno": 1,
"node": "08adbe269f24cf22d975eadeec16790c5b22f558",
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
@ -345,10 +345,10 @@ ignorews=1 query string argument enables whitespace skipping (not implemented)
{
"abspath": "foo",
"author": "test",
"desc": "commit 2 (leading whitespace on line 2)",
"desc": "commit 0",
"line": " line 2\n",
"lineno": 5,
"node": "6bdb694e7b8cebb68d5b6b27b4bcc2a49d62c602",
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
@ -358,10 +358,10 @@ ignorews=1 query string argument enables whitespace skipping (not implemented)
{
"abspath": "foo",
"author": "test",
"desc": "commit 3 (trailing whitespace on line 3)",
"desc": "commit 0",
"line": "line 3 \n",
"lineno": 6,
"node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865",
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
@ -383,112 +383,11 @@ ignorews=1 query string argument enables whitespace skipping (not implemented)
"permissions": ""
}
ignorews=0 query string argument disables when config defaults to enabled (not implemented)
ignorews=0 query string argument disables when config defaults to enabled
$ get-with-headers.py --json $LOCALIP:$HGPORT1 'json-annotate/9d1b2c7db017/foo?ignorews=0'
200 Script output follows
{
"abspath": "foo",
"annotate": [
{
"abspath": "foo",
"author": "test",
"desc": "commit 0",
"line": "line 0\n",
"lineno": 1,
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
],
"targetline": 1
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 5 (add blank line between line 0 and 1)",
"line": "\n",
"lineno": 2,
"node": "400ef1d404706cfb48afd2b78ce6addf641ced25",
"revdate": [
0.0,
0
],
"targetline": 2
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 6 (add another blank line between line 0 and 1)",
"line": "\n",
"lineno": 3,
"node": "9d1b2c7db0175870a950f8c48c9c4ead1058f2c5",
"revdate": [
0.0,
0
],
"targetline": 3
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 1",
"line": "line 1 modified by 1\n",
"lineno": 4,
"node": "23e1e37387dcfca4c0ed0cc568d1e4b9bfed241a",
"revdate": [
0.0,
0
],
"targetline": 2
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 0",
"line": " line 2\n",
"lineno": 5,
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
],
"targetline": 3
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 0",
"line": "line 3 \n",
"lineno": 6,
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
],
"targetline": 4
}
],
"author": "test",
"children": [],
"date": [
0.0,
0
],
"desc": "commit 6 (add another blank line between line 0 and 1)",
"node": "9d1b2c7db0175870a950f8c48c9c4ead1058f2c5",
"parents": [
"400ef1d404706cfb48afd2b78ce6addf641ced25"
],
"permissions": ""
}
ignorewsamount=1 query string enables whitespace amount skipping (not implemented)
$ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorewsamount=1'
200 Script output follows
{
"abspath": "foo",
"annotate": [
@ -585,7 +484,108 @@ ignorewsamount=1 query string enables whitespace amount skipping (not implemente
"permissions": ""
}
ignorewseol=1 query string enables whitespace end of line skipping (not implemented)
ignorewsamount=1 query string enables whitespace amount skipping
$ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorewsamount=1'
200 Script output follows
{
"abspath": "foo",
"annotate": [
{
"abspath": "foo",
"author": "test",
"desc": "commit 0",
"line": "line 0\n",
"lineno": 1,
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
],
"targetline": 1
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 5 (add blank line between line 0 and 1)",
"line": "\n",
"lineno": 2,
"node": "400ef1d404706cfb48afd2b78ce6addf641ced25",
"revdate": [
0.0,
0
],
"targetline": 2
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 6 (add another blank line between line 0 and 1)",
"line": "\n",
"lineno": 3,
"node": "9d1b2c7db0175870a950f8c48c9c4ead1058f2c5",
"revdate": [
0.0,
0
],
"targetline": 3
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 1",
"line": "line 1 modified by 1\n",
"lineno": 4,
"node": "23e1e37387dcfca4c0ed0cc568d1e4b9bfed241a",
"revdate": [
0.0,
0
],
"targetline": 2
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 2 (leading whitespace on line 2)",
"line": " line 2\n",
"lineno": 5,
"node": "6bdb694e7b8cebb68d5b6b27b4bcc2a49d62c602",
"revdate": [
0.0,
0
],
"targetline": 3
},
{
"abspath": "foo",
"author": "test",
"desc": "commit 0",
"line": "line 3 \n",
"lineno": 6,
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
],
"targetline": 4
}
],
"author": "test",
"children": [],
"date": [
0.0,
0
],
"desc": "commit 6 (add another blank line between line 0 and 1)",
"node": "9d1b2c7db0175870a950f8c48c9c4ead1058f2c5",
"parents": [
"400ef1d404706cfb48afd2b78ce6addf641ced25"
],
"permissions": ""
}
ignorewseol=1 query string enables whitespace end of line skipping
$ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorewseol=1'
200 Script output follows
@ -661,10 +661,10 @@ ignorewseol=1 query string enables whitespace end of line skipping (not implemen
{
"abspath": "foo",
"author": "test",
"desc": "commit 3 (trailing whitespace on line 3)",
"desc": "commit 0",
"line": "line 3 \n",
"lineno": 6,
"node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865",
"node": "b9c578134d72b3a9d26afde8ddd76c0a93c5adbc",
"revdate": [
0.0,
0
@ -686,7 +686,7 @@ ignorewseol=1 query string enables whitespace end of line skipping (not implemen
"permissions": ""
}
ignoreblanklines=1 query string enables whitespace blank line skipping (not implemented)
ignoreblanklines=1 query string enables whitespace blank line skipping
$ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignoreblanklines=1'
200 Script output follows