aboutsummaryrefslogtreecommitdiffstats
path: root/ui-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'ui-tree.c')
-rw-r--r--ui-tree.c57
1 files changed, 37 insertions, 20 deletions
diff --git a/ui-tree.c b/ui-tree.c
index 1e4efb2..3d8a2eb 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -6,6 +6,8 @@
* (see COPYING for full license text)
*/
+ #define USE_THE_REPOSITORY_VARIABLE
+
#include "cgit.h"
#include "ui-tree.h"
#include "html.h"
@@ -89,6 +91,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
enum object_type type;
char *buf;
unsigned long size;
+ bool is_binary;
type = oid_object_info(the_repository, oid, &size);
if (type == OBJ_BAD) {
@@ -97,12 +100,13 @@ static void print_object(const struct object_id *oid, const char *path, const ch
return;
}
- buf = read_object_file(oid, &type, &size);
+ buf = repo_read_object_file(the_repository, oid, &type, &size);
if (!buf) {
cgit_print_error_page(500, "Internal server error",
"Error reading object %s", oid_to_hex(oid));
return;
}
+ is_binary = buffer_is_binary(buf, size);
cgit_set_title_from_path(path);
@@ -110,7 +114,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
htmlf("blob: %s (", oid_to_hex(oid));
cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
rev, path);
- if (ctx.repo->enable_blame) {
+ if (ctx.repo->enable_blame && !is_binary) {
html(") (");
cgit_blame_link("blame", NULL, NULL, ctx.qry.head,
rev, path);
@@ -123,7 +127,7 @@ static void print_object(const struct object_id *oid, const char *path, const ch
return;
}
- if (buffer_is_binary(buf, size))
+ if (is_binary)
print_binary_buffer(buf, size);
else
print_text_buffer(basename, buf, size);
@@ -139,8 +143,7 @@ struct single_tree_ctx {
};
static int single_tree_cb(const struct object_id *oid, struct strbuf *base,
- const char *pathname, unsigned mode, int stage,
- void *cbdata)
+ const char *pathname, unsigned mode, void *cbdata)
{
struct single_tree_ctx *ctx = cbdata;
@@ -185,8 +188,7 @@ static void write_tree_link(const struct object_id *oid, char *name,
tree_ctx.name = NULL;
tree_ctx.count = 0;
- read_tree_recursive(the_repository, tree, "", 0, 1,
- &paths, single_tree_cb, &tree_ctx);
+ read_tree(the_repository, tree, &paths, single_tree_cb, &tree_ctx);
if (tree_ctx.count != 1)
break;
@@ -199,14 +201,16 @@ static void write_tree_link(const struct object_id *oid, char *name,
}
static int ls_item(const struct object_id *oid, struct strbuf *base,
- const char *pathname, unsigned mode, int stage, void *cbdata)
+ const char *pathname, unsigned mode, void *cbdata)
{
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 +222,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 +242,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 = repo_read_object_file(the_repository, 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 +273,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);
@@ -294,14 +314,13 @@ static void ls_tree(const struct object_id *oid, const char *path, struct walk_t
}
ls_head();
- read_tree_recursive(the_repository, tree, "", 0, 1,
- &paths, ls_item, walk_tree_ctx);
+ read_tree(the_repository, tree, &paths, ls_item, walk_tree_ctx);
ls_tail();
}
static int walk_tree(const struct object_id *oid, struct strbuf *base,
- const char *pathname, unsigned mode, int stage, void *cbdata)
+ const char *pathname, unsigned mode, void *cbdata)
{
struct walk_tree_context *walk_tree_ctx = cbdata;
@@ -326,7 +345,7 @@ static int walk_tree(const struct object_id *oid, struct strbuf *base,
return 0;
}
}
- ls_item(oid, base, pathname, mode, stage, walk_tree_ctx);
+ ls_item(oid, base, pathname, mode, walk_tree_ctx);
return 0;
}
@@ -355,13 +374,13 @@ void cgit_print_tree(const char *rev, char *path)
if (!rev)
rev = ctx.qry.head;
- if (get_oid(rev, &oid)) {
+ if (repo_get_oid(the_repository, rev, &oid)) {
cgit_print_error_page(404, "Not found",
"Invalid revision name: %s", rev);
return;
}
commit = lookup_commit_reference(the_repository, &oid);
- if (!commit || parse_commit(commit)) {
+ if (!commit || repo_parse_commit(the_repository, commit)) {
cgit_print_error_page(404, "Not found",
"Invalid commit reference: %s", rev);
return;
@@ -374,10 +393,8 @@ void cgit_print_tree(const char *rev, char *path)
goto cleanup;
}
- read_tree_recursive(the_repository,
- repo_get_commit_tree(the_repository, commit),
- "", 0, 0,
- &paths, walk_tree, &walk_tree_ctx);
+ read_tree(the_repository, repo_get_commit_tree(the_repository, commit),
+ &paths, walk_tree, &walk_tree_ctx);
if (walk_tree_ctx.state == 1)
ls_tail();
else if (walk_tree_ctx.state == 2)