From 61aa4378441859ed2851db01d5d1b01ed1aa2458 Mon Sep 17 00:00:00 2001 From: Saya Andy Date: Sat, 15 Aug 2026 22:17:12 +0700 Subject: diff: pick refs from web ui Beforehand the choice between two refs in diff could not be changed from web ui (only via url query), and by default it was current and previous commit. Now it is doable with dropdown menus. --- README.md | 2 ++ tests/t0106-diff.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++ ui-diff.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 123 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 68db236..1e13a37 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,8 @@ This is a custom expansion to cgit. Its most prominent changes by now are: * Include optional solarized.css addon theme. +* Allow user to pick variable refs for diff in web ui. + The original cgit project is hosted at [git.zx2c4.com](https://git.zx2c4.com/cgit/about/) ## cgit – CGI for Git diff --git a/tests/t0106-diff.sh b/tests/t0106-diff.sh index 82b645e..0c167d4 100755 --- a/tests/t0106-diff.sh +++ b/tests/t0106-diff.sh @@ -16,4 +16,60 @@ test_expect_success 'find added line' ' grep "
+5
" tmp ' +test_expect_success 'ref picker: from: select present' ' + grep "tmp +' + +test_expect_success 'diff with HEAD and root shows content' ' + grep "diffstat" tmp +' + test_done diff --git a/ui-diff.c b/ui-diff.c index 6cfa697..ae4c9de 100644 --- a/ui-diff.c +++ b/ui-diff.c @@ -1,6 +1,10 @@ /* ui-diff.c: show diff between two blobs * * Copyright (C) 2006-2014 cgit Development Team + * Copyright (C) 2026 Saya Andy + * + * Modified 2026 by Saya Andy: + * Select variable refs from web ui for diff * * Licensed under GNU General Public License v2 * (see COPYING for full license text) @@ -336,6 +340,32 @@ static void filepair_cb(struct diff_filepair *pair) cgit_ssdiff_footer(); } +static int print_ref_option(const struct reference *ref, void *cb_data) +{ + const char **sel = (const char **)cb_data; + + html_option(ref->name, ref->name, sel[0]); + return 0; +} + +static void cgit_print_ref_select(const char *name, const char *selected) +{ + /* + * Offer every branch and tag so that any two refs can be compared. + */ + html(""); +} + void cgit_print_diff_ctrls(void) { int i, curr; @@ -343,9 +373,43 @@ void cgit_print_diff_ctrls(void) html("
"); html("diff options"); html("
"); - cgit_add_hidden_formfields(1, 0, ctx.qry.page); + /* + * Emit the same hidden fields as cgit_add_hidden_formfields(), except + * id/id2, which are carried by the ref-picker selects below. + */ + if (!ctx.cfg.virtual_root) { + struct strbuf url = STRBUF_INIT; + strbuf_addf(&url, "%s/%s", ctx.qry.repo, ctx.qry.page); + if (ctx.qry.vpath) + strbuf_addf(&url, "/%s", ctx.qry.vpath); + html_hidden("url", url.buf); + strbuf_release(&url); + } + if (ctx.qry.head && ctx.repo->defbranch && + strcmp(ctx.qry.head, ctx.repo->defbranch)) + html_hidden("h", ctx.qry.head); + if (ctx.qry.showmsg) + html_hidden("showmsg", "1"); + html(""); html(""); + + /* ref pickers: compare any two refs (branches/tags) */ + { + const char *new_ref = ctx.qry.oid ? ctx.qry.oid : ctx.qry.head; + const char *old_ref = ctx.qry.oid2; + + html(""); + html(""); + html(""); + html(""); + html(""); + } + html(""); html(""); html("
from:"); + cgit_print_ref_select("id2", old_ref); + html("
to:"); + cgit_print_ref_select("id", new_ref); + html("
context:"); -- cgit v1.3.1+13