From c16fdac4cedd308911885604a7b3a785388674d9 Mon Sep 17 00:00:00 2001 From: Bryce Kwon Date: Mon, 21 Sep 2026 05:39:34 -1000 Subject: Name the tagged object under its full id --- source/ui-refs.c | 4 ++-- source/ui-shared.c | 14 +++++++++----- source/ui-shared.h | 3 ++- source/ui-tag.c | 53 +++++++++++++++++++++++++++-------------------------- tests/t0113-tag.sh | 28 +++++++++++++++------------- 5 files changed, 55 insertions(+), 47 deletions(-) diff --git a/source/ui-refs.c b/source/ui-refs.c index 42a3cfb..c375137 100644 --- a/source/ui-refs.c +++ b/source/ui-refs.c @@ -108,7 +108,7 @@ static int print_branch(struct refinfo *ref) } else { // The object link sits in the message column, and the empty // tail cells keep the row as wide as the header. - cgit_object_link(ref->object); + cgit_object_link(ref->object, 0); html(""); } html("\n"); @@ -153,7 +153,7 @@ static int print_tag(struct refinfo *ref) if (ctx.repo->snapshots && (obj->type == OBJ_COMMIT)) cgit_print_snapshot_links(ctx.repo, name, " "); else - cgit_object_link(obj); + cgit_object_link(obj, 0); html(""); if (info) { if (info->tagger) { diff --git a/source/ui-shared.c b/source/ui-shared.c index 2f0843c..bb786a6 100644 --- a/source/ui-shared.c +++ b/source/ui-shared.c @@ -1020,16 +1020,21 @@ void cgit_stats_link(const char *name, const char *title, const char *class, reporevlink("stats", name, title, class, head, NULL, path); } -void cgit_object_link(struct object *obj) +void cgit_object_link(struct object *obj, int full) { const char *page; char *shortrev, *fullrev, *name; fullrev = oid_to_hex(&obj->oid); - shortrev = xstrdup(fullrev); - shortrev[SHORT_HASH_LEN] = '\0'; + if (full) { + name = cgit_fmt("%s %s", type_name(obj->type), fullrev); + } else { + shortrev = xstrdup(fullrev); + shortrev[SHORT_HASH_LEN] = '\0'; + name = cgit_fmt("%s %s...", type_name(obj->type), shortrev); + } if (obj->type == OBJ_COMMIT) { - cgit_commit_link(cgit_fmt("commit %s...", shortrev), NULL, NULL, ctx.qry.head, fullrev, NULL); + cgit_commit_link(name, NULL, NULL, ctx.qry.head, fullrev, NULL); return; } else if (obj->type == OBJ_TREE) page = "tree"; @@ -1037,7 +1042,6 @@ void cgit_object_link(struct object *obj) page = "tag"; else page = "blob"; - name = cgit_fmt("%s %s...", type_name(obj->type), shortrev); reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } diff --git a/source/ui-shared.h b/source/ui-shared.h index 8a1a2b8..e2d2db9 100644 --- a/source/ui-shared.h +++ b/source/ui-shared.h @@ -60,7 +60,8 @@ extern void cgit_diff_link(const char *name, const char *title, const char *clas const char *head, const char *new_rev, const char *old_rev, const char *path); extern void cgit_stats_link(const char *name, const char *title, const char *class, const char *head, const char *path); -extern void cgit_object_link(struct object *obj); +// Names the object by type and id, abbreviated unless full is set. +extern void cgit_object_link(struct object *obj, int full); extern void cgit_submodule_link(const char *class, char *path, const char *rev); diff --git a/source/ui-tag.c b/source/ui-tag.c index 02fbfc7..56862bb 100644 --- a/source/ui-tag.c +++ b/source/ui-tag.c @@ -17,34 +17,27 @@ #include "ui-shared.h" #include "ui-tag.h" -// The rows share the commit page's three column layout, so a single value -// spans the name and date columns of the tagger row. -static void print_tag_row(const char *revname, const struct object_id *oid) +static void print_name_row(const char *revname, const struct object_id *oid) { - html("tag"); + html("tag name"); html_txt(revname); if (oid) htmlf(" (%s)", oid_to_hex(oid)); html("\n"); } -static void print_object_row(struct object *obj) -{ - html("object"); - cgit_object_link(obj); - html("\n"); -} - -static void print_download_row(const char *revname) +static void print_date_row(struct taginfo *info) { - html("download"); - cgit_print_snapshot_links(ctx.repo, revname, "
"); - html("\n"); + html("tag date\n"); } static void print_tagger_row(struct taginfo *info) { - html("tagger"); + html("tagged by"); // A tag can carry a tagger with no address, and a filter must not be // handed a NULL argument. cgit_open_filter(ctx.repo->email_filter, info->tagger_email ? info->tagger_email : "", "tag"); @@ -54,14 +47,20 @@ static void print_tagger_row(struct taginfo *info) html_txt(info->tagger_email); } cgit_close_filter(ctx.repo->email_filter); - html(""); - if (info->tagger_date > 0) { - html(""); - } + html("\n"); +} + +static void print_object_row(struct object *obj) +{ + html("tagged object"); + cgit_object_link(obj, 1); + html("\n"); +} + +static void print_download_row(const char *revname) +{ + html("download"); + cgit_print_snapshot_links(ctx.repo, revname, "
"); html("\n"); } @@ -106,9 +105,11 @@ static void print_annotated_tag(const char *revname, const struct object_id *oid cgit_print_layout_start(); html("\n"); + print_name_row(revname, oid); + if (info->tagger_date > 0) + print_date_row(info); if (info->tagger) print_tagger_row(info); - print_tag_row(revname, oid); print_object_row(tag->tagged); if (ctx.repo->snapshots) print_download_row(revname); @@ -122,7 +123,7 @@ static void print_lightweight_tag(const char *revname, struct object *obj) { cgit_print_layout_start(); html("
\n"); - print_tag_row(revname, NULL); + print_name_row(revname, NULL); print_object_row(obj); if (ctx.repo->snapshots) print_download_row(revname); diff --git a/tests/t0113-tag.sh b/tests/t0113-tag.sh index 12ad1b4..90763bd 100755 --- a/tests/t0113-tag.sh +++ b/tests/t0113-tag.sh @@ -1,9 +1,9 @@ #!/bin/sh -# The tag page. An annotated tag gets the same three column table as the -# commit page, with the tagger and date on one row and the tag, object and -# download rows spanning the rest, and its message follows with no blank -# line between subject and body. A lightweight tag gets the shorter table. +# The tag page. An annotated tag gets a table of its name, date, tagger, the +# object it points at under its full id, and the downloads, and its message +# follows with no blank line between subject and body. A lightweight tag gets +# the shorter table. test_description='Check content on tag page' . ./setup.sh @@ -21,14 +21,16 @@ two lines." v1.0 && test_expect_success 'generate foo/tag/?h=v1.0' 'cgit_url "foo/tag/&h=v1.0" >tmp' -test_expect_success 'find the tagger row with its date' ' - grep "" tmp && + grep "" tmp ' -test_expect_success 'find the tag, object and download rows' ' - grep "" tmp && - grep "" tmp && + grep "" tmp && - grep "" tmp && + grep "
taggerC O Mitter <committer@example.com>tag namev1.0 ([0-9a-f]*)
tag datetagged byC O Mitter <committer@example.com>
tagv1.0 ([0-9a-f]*)
objectdownload" tmp +test_expect_success 'the object row names the full commit id' ' + commit=$(git -C repos/foo rev-parse v1.0^{commit}) && + grep "
tagged objectcommit $commit
download" tmp ' test_expect_success 'the message follows with no blank line before the body' ' @@ -38,9 +40,9 @@ test_expect_success 'the message follows with no blank line before the body' ' test_expect_success 'a lightweight tag gets the shorter table' ' cgit_url "foo/tag/&h=light" >tmp && - grep "
taglight
objecttagger" tmp + grep "
tag namelight
tagged objecttagged by" tmp ' test_done -- cgit v2.8.0