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. --- ui-diff.c | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) (limited to 'ui-diff.c') 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