diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py --- a/mercurial/hgweb/webcommands.py +++ b/mercurial/hgweb/webcommands.py @@ -930,6 +930,9 @@ "linenumber": "% 6d" % (lineno + 1), "revdate": f.date()} + diffopts = webutil.difffeatureopts(req, web.repo.ui, 'annotate') + diffopts = {k: getattr(diffopts, k) for k in diffopts.defaults} + return tmpl("fileannotate", file=f, annotate=annotate, @@ -938,6 +941,7 @@ rename=webutil.renamelink(fctx), permissions=fctx.manifest().flags(f), ishead=int(ishead), + diffopts=diffopts, **webutil.commonentry(web.repo, fctx)) @webcommand('filelog') diff --git a/mercurial/templates/gitweb/fileannotate.tmpl b/mercurial/templates/gitweb/fileannotate.tmpl --- a/mercurial/templates/gitweb/fileannotate.tmpl +++ b/mercurial/templates/gitweb/fileannotate.tmpl @@ -62,6 +62,13 @@
{desc|strip|escape|websub|nonempty}
+ +{diffoptsform} + + +
' searchhint = 'Find changesets by keywords (author, files, the commit message), revision number or hash, or revset expression.' + +diffoptsform = ' + + Ignore whitespace changes - + Everywhere: + + Within whitespace: + + At end of lines: + + + ' diff --git a/mercurial/templates/paper/fileannotate.tmpl b/mercurial/templates/paper/fileannotate.tmpl --- a/mercurial/templates/paper/fileannotate.tmpl +++ b/mercurial/templates/paper/fileannotate.tmpl @@ -65,6 +65,12 @@
+{diffoptsform} + + +
diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map --- a/mercurial/templates/paper/map +++ b/mercurial/templates/paper/map @@ -251,3 +251,18 @@ ' searchhint = 'Find changesets by keywords (author, files, the commit message), revision number or hash, or revset expression.' + +diffoptsform = ' + + Ignore whitespace changes - + Everywhere: + + Within whitespace: + + At end of lines: + + ' diff --git a/mercurial/templates/static/mercurial.js b/mercurial/templates/static/mercurial.js --- a/mercurial/templates/static/mercurial.js +++ b/mercurial/templates/static/mercurial.js @@ -434,6 +434,56 @@ scrollHandler(); } +function renderDiffOptsForm() { + // We use URLSearchParams for query string manipulation. Old browsers don't + // support this API. + if (!("URLSearchParams" in window)) { + return; + } + + var form = document.getElementById("diffopts-form"); + + var KEYS = [ + "ignorews", + "ignorewsamount", + "ignorewseol", + "ignoreblanklines", + ]; + + var urlParams = new URLSearchParams(window.location.search); + + function updateAndRefresh(e) { + var checkbox = e.target; + var name = checkbox.id.substr(0, checkbox.id.indexOf("-")); + urlParams.set(name, checkbox.checked ? "1" : "0"); + window.location.search = urlParams.toString(); + } + + var allChecked = form.getAttribute("data-ignorews") == "1"; + + for (var i = 0; i < KEYS.length; i++) { + var key = KEYS[i]; + + var checkbox = document.getElementById(key + "-checkbox"); + if (!checkbox) { + continue; + } + + currentValue = form.getAttribute("data-" + key); + checkbox.checked = currentValue != "0"; + + // ignorews implies ignorewsamount and ignorewseol. + if (allChecked && (key == "ignorewsamount" || key == "ignorewseol")) { + checkbox.checked = true; + checkbox.disabled = true; + } + + checkbox.addEventListener("change", updateAndRefresh, false); + } + + form.style.display = 'block'; +} + document.addEventListener('DOMContentLoaded', function() { process_dates(); }, false); diff --git a/mercurial/templates/static/style-gitweb.css b/mercurial/templates/static/style-gitweb.css --- a/mercurial/templates/static/style-gitweb.css +++ b/mercurial/templates/static/style-gitweb.css @@ -97,6 +97,12 @@ } div.annotate-info a { color: #0000FF; text-decoration: underline; } td.annotate:hover div.annotate-info { display: inline; } + +#diffopts-form { + padding-left: 8px; + display: none; +} + .linenr { color:#999999; text-decoration:none } div.rss_logo { float: right; white-space: nowrap; } div.rss_logo a { diff --git a/mercurial/templates/static/style-paper.css b/mercurial/templates/static/style-paper.css --- a/mercurial/templates/static/style-paper.css +++ b/mercurial/templates/static/style-paper.css @@ -226,6 +226,13 @@ div.annotate-info a { color: #0000FF; } td.annotate:hover div.annotate-info { display: inline; } +#diffopts-form { + font-size: smaller; + color: #424242; + padding-bottom: 10px; + display: none; +} + .source, .sourcefirst { font-family: monospace; white-space: pre; diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t --- a/tests/test-hgweb.t +++ b/tests/test-hgweb.t @@ -340,7 +340,7 @@ $ get-with-headers.py --twice localhost:$HGPORT 'static/style-gitweb.css' - date etag server 200 Script output follows - content-length: 9007 + content-length: 9066 content-type: text/css body { font-family: sans-serif; font-size: 12px; border:solid #d9d8d1; border-width:1px; margin:10px; background: white; color: black; } @@ -442,6 +442,12 @@ } div.annotate-info a { color: #0000FF; text-decoration: underline; } td.annotate:hover div.annotate-info { display: inline; } + + #diffopts-form { + padding-left: 8px; + display: none; + } + .linenr { color:#999999; text-decoration:none } div.rss_logo { float: right; white-space: nowrap; } div.rss_logo a { diff --git a/tests/test-highlight.t b/tests/test-highlight.t --- a/tests/test-highlight.t +++ b/tests/test-highlight.t @@ -284,6 +284,25 @@
+ +
+ Ignore whitespace changes - + Everywhere: + + Within whitespace: + + At end of lines: + +
+ + +