mirror of
https://git.zx2c4.com/cgit
synced 2024-11-24 17:38:41 +00:00
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:
parent
cc6d9cc7fc
commit
bcffc52366
22
ui-tree.c
22
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;
|
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user