aboutsummaryrefslogtreecommitdiff
diff refs
from: back
to: back
| flip
diff options
context:
space:
mode:
-rw-r--r--cgit.css13
-rwxr-xr-xtests/t0106-diff.sh26
-rw-r--r--ui-diff.c26
3 files changed, 60 insertions, 5 deletions
diff --git a/cgit.css b/cgit.css
index e52d424..8563462 100644
--- a/cgit.css
+++ b/cgit.css
@@ -478,6 +478,14 @@ div#cgit div.cgit-panel {
margin-top: 1.5em;
}
+div#cgit form.diff-ctrls div.cgit-panel {
+ float: none;
+}
+
+div#cgit form.diff-ctrls {
+ float: right;
+}
+
div#cgit div.cgit-panel table {
border-collapse: collapse;
border: solid 1px var(--border-mid);
@@ -666,6 +674,11 @@ div#cgit a.button {
padding: 0em 0.5em;
}
+div#cgit form.diff-ctrls div.cgit-panel a.button {
+ border: solid 1px var(--border-mid);
+ background-color: var(--bg-hl);
+}
+
div#cgit a.primary {
font-size: 100%;
}
diff --git a/tests/t0106-diff.sh b/tests/t0106-diff.sh
index 0c167d4..1100596 100755
--- a/tests/t0106-diff.sh
+++ b/tests/t0106-diff.sh
@@ -32,6 +32,11 @@ test_expect_success 'ref picker: to: label present' '
grep "to:" tmp
'
+test_expect_success 'ref pickers live in a separate refs panel' '
+ grep "<b>diff refs</b>" tmp &&
+ grep "<b>diff options</b>" tmp
+'
+
test_expect_success 'ref picker: master branch listed' '
grep "master" tmp
'
@@ -40,6 +45,15 @@ test_expect_success 'ref picker: auto-submit on change' '
grep "onchange=.this.form.submit()." tmp
'
+test_expect_success 'flip link present' '
+ grep "<a title=.swap from and to. class=.button. href=./foo/diff/?" tmp
+'
+
+test_expect_success 'flip link swaps the default refs' '
+ old=$(git --git-dir="$PWD/repos/foo/.git" rev-parse master~1) &&
+ grep "/foo/diff/?id=$old&amp;id2=master" tmp
+'
+
test_expect_success 'compare two refs: foo/diff?id=master&id2=HEAD' '
cgit_query "url=foo/diff&id=master&id2=HEAD" >tmp
'
@@ -72,4 +86,16 @@ test_expect_success 'diff with HEAD and root shows content' '
grep "diffstat" tmp
'
+test_expect_success 'flip link swaps explicit refs' '
+ cgit_query "url=foo/diff&id=master&id2=HEAD" >tmp &&
+ new=$(git --git-dir="$PWD/repos/foo/.git" rev-parse HEAD) &&
+ grep "/foo/diff/?id=$new&amp;id2=master" tmp
+'
+
+test_expect_success 'flip link omits id for a diff against a root commit' '
+ root=$(git --git-dir="$PWD/repos/foo/.git" rev-list --max-parents=0 HEAD) &&
+ cgit_query "url=foo/diff&id=$root" >tmp &&
+ grep "href=./foo/diff/?id2=$root." tmp
+'
+
test_done
diff --git a/ui-diff.c b/ui-diff.c
index ae4c9de..13c1e32 100644
--- a/ui-diff.c
+++ b/ui-diff.c
@@ -370,12 +370,11 @@ void cgit_print_diff_ctrls(void)
{
int i, curr;
- html("<div class='cgit-panel'>");
- html("<b>diff options</b>");
- html("<form method='get'>");
+ html("<form class='diff-ctrls' method='get'>");
/*
* Emit the same hidden fields as cgit_add_hidden_formfields(), except
- * id/id2, which are carried by the ref-picker selects below.
+ * id/id2, which are carried by the ref-picker selects below. One
+ * form wraps both panels so any submission carries all controls.
*/
if (!ctx.cfg.virtual_root) {
struct strbuf url = STRBUF_INIT;
@@ -391,6 +390,8 @@ void cgit_print_diff_ctrls(void)
if (ctx.qry.showmsg)
html_hidden("showmsg", "1");
+ html("<div class='cgit-panel'>");
+ html("<b>diff refs</b>");
html("<table>");
html("<tr><td colspan='2'/></tr>");
@@ -408,7 +409,22 @@ void cgit_print_diff_ctrls(void)
html("<td class='ctrl'>");
cgit_print_ref_select("id", new_ref);
html("</td></tr>");
+
+ html("<tr><td/><td class='ctrl'>");
+ cgit_diff_link("flip", "swap from and to", "button",
+ ctx.qry.head,
+ is_null_oid(old_rev_oid) ? NULL :
+ oid_to_hex(old_rev_oid),
+ new_ref, ctx.qry.path);
+ html("</td></tr>");
}
+ html("</table>");
+ html("</div>");
+
+ html("<div class='cgit-panel'>");
+ html("<b>diff options</b>");
+ html("<table>");
+ html("<tr><td colspan='2'/></tr>");
html("<tr>");
html("<td class='label'>context:</td>");
@@ -443,8 +459,8 @@ void cgit_print_diff_ctrls(void)
html("<tr><td/><td class='ctrl'>");
html("<noscript><input type='submit' value='reload'/></noscript>");
html("</td></tr></table>");
- html("</form>");
html("</div>");
+ html("</form>");
}
void cgit_print_diff(const char *new_rev, const char *old_rev,