aboutsummaryrefslogtreecommitdiff
path: root/ui-diff.c
diff options
from:
to:
context:
space:
mode:
authorGravatar Saya Andy <saya.andy@posteo.com> 2026-08-15 22:17:12 +0700
committerGravatar Saya Andy <saya.andy@posteo.com> 2026-08-15 22:17:12 +0700
commit61aa4378441859ed2851db01d5d1b01ed1aa2458 (patch)
tree9769811b616bcf8a5741cd89b3d46c361ba43f4d /ui-diff.c
parent3beb4785562b158fc4c4e67185ac488d5bfa5c60 (diff)
downloadcgitext-61aa4378441859ed2851db01d5d1b01ed1aa2458.tar.gz
cgitext-61aa4378441859ed2851db01d5d1b01ed1aa2458.zip
diff: pick refs from web uiHEADv1.3.1+13masterdevelop
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.
Diffstat (limited to 'ui-diff.c')
-rw-r--r--ui-diff.c66
1 files changed, 65 insertions, 1 deletions
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 <cgit@lists.zx2c4.com>
+ * Copyright (C) 2026 Saya Andy <saya.andy@posteo.com>
+ *
+ * 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("<select name='");
+ html_attr(name);
+ html("' onchange='this.form.submit();'>");
+ refs_for_each_branch_ref(get_main_ref_store(the_repository),
+ print_ref_option, (void *)&selected);
+ if (ctx.repo->enable_remote_branches)
+ refs_for_each_remote_ref(get_main_ref_store(the_repository),
+ print_ref_option, (void *)&selected);
+ refs_for_each_tag_ref(get_main_ref_store(the_repository),
+ print_ref_option, (void *)&selected);
+ html("</select>");
+}
+
void cgit_print_diff_ctrls(void)
{
int i, curr;
@@ -343,9 +373,43 @@ void cgit_print_diff_ctrls(void)
html("<div class='cgit-panel'>");
html("<b>diff options</b>");
html("<form method='get'>");
- 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("<table>");
html("<tr><td colspan='2'/></tr>");
+
+ /* 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("<tr>");
+ html("<td class='label'>from:</td>");
+ html("<td class='ctrl'>");
+ cgit_print_ref_select("id2", old_ref);
+ html("</td></tr><tr>");
+ html("<td class='label'>to:</td>");
+ html("<td class='ctrl'>");
+ cgit_print_ref_select("id", new_ref);
+ html("</td></tr>");
+ }
+
html("<tr>");
html("<td class='label'>context:</td>");
html("<td class='ctrl'>");