diff --git a/tests/test-hgweb-annotate-whitespace.t b/tests/test-hgweb-annotate-whitespace.t new file mode 100644 --- /dev/null +++ b/tests/test-hgweb-annotate-whitespace.t @@ -0,0 +1,788 @@ +#require serve + +Create a repo with whitespace only changes + + $ hg init repo-with-whitespace + $ cd repo-with-whitespace + $ cat > foo << EOF + > line 0 + > line 1 + > line 2 + > line 3 + > EOF + $ hg -q commit -A -m 'commit 0' + $ cat > foo << EOF + > line 0 + > line 1 modified by 1 + > line 2 + > line 3 + > EOF + $ hg commit -m 'commit 1' + $ cat > foo << EOF + > line 0 + > line 1 modified by 1 + > line 2 + > line 3 + > EOF + $ hg commit -m 'commit 2 (leading whitespace on line 2)' + $ cat > foo << EOF + > line 0 + > line 1 modified by 1 + > line 2 + > EOF +Need to use printf to avoid check-code complaining about trailing whitespace. + $ printf 'line 3 \n' >> foo + $ hg commit -m 'commit 3 (trailing whitespace on line 3)' + $ cat > foo << EOF + > line 0 + > line 1 modified by 1 + > line 2 + > EOF + $ printf 'line 3 \n' >> foo + $ hg commit -m 'commit 4 (intra whitespace on line 0)' + $ cat > foo << EOF + > line 0 + > + > line 1 modified by 1 + > line 2 + > EOF + $ printf 'line 3 \n' >> foo + $ hg commit -m 'commit 5 (add blank line between line 0 and 1)' + $ cat > foo << EOF + > line 0 + > + > + > line 1 modified by 1 + > line 2 + > EOF + $ printf 'line 3 \n' >> foo + $ hg commit -m 'commit 6 (add another blank line between line 0 and 1)' + + $ hg log -G -T '{rev}:{node|short} {desc}' + @ 6:9d1b2c7db017 commit 6 (add another blank line between line 0 and 1) + | + o 5:400ef1d40470 commit 5 (add blank line between line 0 and 1) + | + o 4:08adbe269f24 commit 4 (intra whitespace on line 0) + | + o 3:dcb62cfbfc9b commit 3 (trailing whitespace on line 3) + | + o 2:6bdb694e7b8c commit 2 (leading whitespace on line 2) + | + o 1:23e1e37387dc commit 1 + | + o 0:b9c578134d72 commit 0 + + + $ hg serve -p $HGPORT -d --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ hg --config annotate.ignorews=true serve -p $HGPORT1 -d --pid-file hg.pid + $ cat hg.pid >> $DAEMON_PIDS + $ cd .. + +Annotate works + + $ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo' + 200 Script output follows + + { + "abspath": "foo", + "annotate": [ + { + "abspath": "foo", + "author": "test", + "desc": "commit 4 (intra whitespace on line 0)", + "line": "line 0\n", + "lineno": 1, + "node": "08adbe269f24cf22d975eadeec16790c5b22f558", + "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 3 (trailing whitespace on line 3)", + "line": "line 3 \n", + "lineno": 6, + "node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865", + "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": "" + } + +annotate.ignorews=1 config option is honored + + $ get-with-headers.py --json $LOCALIP:$HGPORT1 'json-annotate/9d1b2c7db017/foo' + 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": "" + } + +ignorews=1 query string argument enables whitespace skipping (not implemented) + + $ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorews=1' + 200 Script output follows + + { + "abspath": "foo", + "annotate": [ + { + "abspath": "foo", + "author": "test", + "desc": "commit 4 (intra whitespace on line 0)", + "line": "line 0\n", + "lineno": 1, + "node": "08adbe269f24cf22d975eadeec16790c5b22f558", + "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 3 (trailing whitespace on line 3)", + "line": "line 3 \n", + "lineno": 6, + "node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865", + "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": "" + } + +ignorews=0 query string argument disables when config defaults to enabled (not implemented) + + $ 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": [ + { + "abspath": "foo", + "author": "test", + "desc": "commit 4 (intra whitespace on line 0)", + "line": "line 0\n", + "lineno": 1, + "node": "08adbe269f24cf22d975eadeec16790c5b22f558", + "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 3 (trailing whitespace on line 3)", + "line": "line 3 \n", + "lineno": 6, + "node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865", + "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 (not implemented) + + $ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignorewseol=1' + 200 Script output follows + + { + "abspath": "foo", + "annotate": [ + { + "abspath": "foo", + "author": "test", + "desc": "commit 4 (intra whitespace on line 0)", + "line": "line 0\n", + "lineno": 1, + "node": "08adbe269f24cf22d975eadeec16790c5b22f558", + "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 3 (trailing whitespace on line 3)", + "line": "line 3 \n", + "lineno": 6, + "node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865", + "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": "" + } + +ignoreblanklines=1 query string enables whitespace blank line skipping (not implemented) + + $ get-with-headers.py --json $LOCALIP:$HGPORT 'json-annotate/9d1b2c7db017/foo?ignoreblanklines=1' + 200 Script output follows + + { + "abspath": "foo", + "annotate": [ + { + "abspath": "foo", + "author": "test", + "desc": "commit 4 (intra whitespace on line 0)", + "line": "line 0\n", + "lineno": 1, + "node": "08adbe269f24cf22d975eadeec16790c5b22f558", + "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 3 (trailing whitespace on line 3)", + "line": "line 3 \n", + "lineno": 6, + "node": "dcb62cfbfc9b3ab995a5cbbaff6e1971c3e4f865", + "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": "" + }