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>
This commit is contained in:
June McEnroe 2019-12-19 21:55:05 +00:00 committed by Jason A. Donenfeld
parent cc6d9cc7fc
commit bcffc52366

View File

@ -204,9 +204,11 @@ static int ls_item(const struct object_id *oid, struct strbuf *base,
struct walk_tree_context *walk_tree_ctx = cbdata; struct walk_tree_context *walk_tree_ctx = cbdata;
char *name; char *name;
struct strbuf fullpath = STRBUF_INIT; struct strbuf fullpath = STRBUF_INIT;
struct strbuf linkpath = STRBUF_INIT;
struct strbuf class = STRBUF_INIT; struct strbuf class = STRBUF_INIT;
enum object_type type; enum object_type type;
unsigned long size = 0; unsigned long size = 0;
char *buf;
name = xstrdup(pathname); name = xstrdup(pathname);
strbuf_addf(&fullpath, "%s%s%s", ctx.qry.path ? ctx.qry.path : "", 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>", htmlf("<tr><td colspan='3'>Bad object: %s %s</td></tr>",
name, name,
oid_to_hex(oid)); oid_to_hex(oid));
free(name); goto cleanup;
return 0;
} }
} }
@ -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, cgit_tree_link(name, NULL, class.buf, ctx.qry.head,
walk_tree_ctx->curr_rev, fullpath.buf); 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); htmlf("</td><td class='ls-size'>%li</td>", size);
html("<td>"); 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, cgit_blame_link("blame", NULL, "button", ctx.qry.head,
walk_tree_ctx->curr_rev, fullpath.buf); walk_tree_ctx->curr_rev, fullpath.buf);
html("</td></tr>\n"); html("</td></tr>\n");
cleanup:
free(name); free(name);
strbuf_release(&fullpath); strbuf_release(&fullpath);
strbuf_release(&class); strbuf_release(&class);