aboutsummaryrefslogtreecommitdiffstats
path: root/ui-tree.c
diff options
context:
space:
mode:
authorJune McEnroe <june@causal.agency>2019-12-19 21:55:05 +0000
committerJason A. Donenfeld <Jason@zx2c4.com>2022-12-19 15:22:52 +0100
commitbcffc523669e00abd949778d4defce37532a3855 (patch)
tree3fae9c77d2b3c93da3ef325889106b1d14685735 /ui-tree.c
parentui-tree,ui-blame: bail from blame if blob is binary (diff)
downloadcgit-bcffc523669e00abd949778d4defce37532a3855.tar.xz
cgit-bcffc523669e00abd949778d4defce37532a3855.zip
ui-tree: show symlink targets in tree listing
Add links to symbolic link targets in tree listings, formatted like "ls -l". Path normalization collapses any ".." components of the link. Also fix up memory link on error path. Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui-tree.c')
-rw-r--r--ui-tree.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/ui-tree.c b/ui-tree.c
index 034c4c8..98ce1ca 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -204,9 +204,11 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
struct walk_tree_context *walk_tree_ctx = cbdata;
char *name;
struct strbuf fullpath = STRBUF_INIT;
+ struct strbuf linkpath = STRBUF_INIT;
struct strbuf class = STRBUF_INIT;
enum object_type type;
unsigned long size = 0;
+ char *buf;
name = xstrdup(pathname);
strbuf_addf(&fullpath, "%s%s%s", ctx.qry.path ? ctx.qry.path : "",
@@ -218,8 +220,7 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
name,
oid_to_hex(oid));
- free(name);
- return 0;
+ goto cleanup;
}
}
@@ -239,6 +240,21 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
cgit_tree_link(name, NULL, class.buf, ctx.qry.head,
walk_tree_ctx->curr_rev, fullpath.buf);
}
+ if (S_ISLNK(mode)) {
+ html(" -> ");
+ buf = read_object_file(oid, &type, &size);
+ if (!buf) {
+ htmlf("Error reading object: %s", oid_to_hex(oid));
+ goto cleanup;
+ }
+ strbuf_addbuf(&linkpath, &fullpath);
+ strbuf_addf(&linkpath, "/../%s", buf);
+ strbuf_normalize_path(&linkpath);
+ cgit_tree_link(buf, NULL, class.buf, ctx.qry.head,
+ walk_tree_ctx->curr_rev, linkpath.buf);
+ free(buf);
+ strbuf_release(&linkpath);
+ }
htmlf("</td><td class='ls-size'>%li</td>", size);
html("<td>");
@@ -255,6 +271,8 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
cgit_blame_link("blame", NULL, "button", ctx.qry.head,
walk_tree_ctx->curr_rev, fullpath.buf);
html("</td></tr>\n");
+
+cleanup:
free(name);
strbuf_release(&fullpath);
strbuf_release(&class);