aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ui-shared.c81
-rw-r--r--ui-shared.h2
2 files changed, 82 insertions, 1 deletions
diff --git a/ui-shared.c b/ui-shared.c
index bc14e70..4fa506f 100644
--- a/ui-shared.c
+++ b/ui-shared.c
@@ -399,6 +399,64 @@ void cgit_stats_link(const char *name, const char *title, const char *class,
reporevlink("stats", name, title, class, head, NULL, path);
}
+void cgit_self_link(char *name, const char *title, const char *class,
+ struct cgit_context *ctx)
+{
+ if (!strcmp(ctx->qry.page, "repolist"))
+ return cgit_index_link(name, title, class, ctx->qry.search,
+ ctx->qry.ofs);
+ else if (!strcmp(ctx->qry.page, "summary"))
+ return cgit_summary_link(name, title, class, ctx->qry.head);
+ else if (!strcmp(ctx->qry.page, "tag"))
+ return cgit_tag_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL);
+ else if (!strcmp(ctx->qry.page, "tree"))
+ return cgit_tree_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path);
+ else if (!strcmp(ctx->qry.page, "plain"))
+ return cgit_plain_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path);
+ else if (!strcmp(ctx->qry.page, "log"))
+ return cgit_log_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path, ctx->qry.ofs,
+ ctx->qry.grep, ctx->qry.search,
+ ctx->qry.showmsg);
+ else if (!strcmp(ctx->qry.page, "commit"))
+ return cgit_commit_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path, 0);
+ else if (!strcmp(ctx->qry.page, "patch"))
+ return cgit_patch_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path);
+ else if (!strcmp(ctx->qry.page, "refs"))
+ return cgit_refs_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path);
+ else if (!strcmp(ctx->qry.page, "snapshot"))
+ return cgit_snapshot_link(name, title, class, ctx->qry.head,
+ ctx->qry.has_sha1 ? ctx->qry.sha1 : NULL,
+ ctx->qry.path);
+ else if (!strcmp(ctx->qry.page, "diff"))
+ return cgit_diff_link(name, title, class, ctx->qry.head,
+ ctx->qry.sha1, ctx->qry.sha2,
+ ctx->qry.path, 0);
+ else if (!strcmp(ctx->qry.page, "stats"))
+ return cgit_stats_link(name, title, class, ctx->qry.head,
+ ctx->qry.path);
+
+ /* Don't known how to make link for this page */
+ repolink(title, class, ctx->qry.page, ctx->qry.head, ctx->qry.path);
+ html("><!-- cgit_self_link() doesn't know how to make link for page '");
+ html_txt(ctx->qry.page);
+ html("' -->");
+ html_txt(name);
+ html("</a>");
+}
+
void cgit_object_link(struct object *obj)
{
char *page, *shortrev, *fullrev, *name;
@@ -650,6 +708,27 @@ static const char *hc(struct cgit_context *ctx, const char *page)
return strcmp(ctx->qry.page, page) ? NULL : "active";
}
+static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path)
+{
+ char *old_path = ctx->qry.path;
+ char *p = path, *q, *end = path + strlen(path);
+
+ ctx->qry.path = NULL;
+ cgit_self_link("root", NULL, NULL, ctx);
+ ctx->qry.path = p = path;
+ while (p < end) {
+ if (!(q = strchr(p, '/')))
+ q = end;
+ *q = '\0';
+ html_txt("/");
+ cgit_self_link(p, NULL, NULL, ctx);
+ if (q < end)
+ *q = '/';
+ p = q + 1;
+ }
+ ctx->qry.path = old_path;
+}
+
static void print_header(struct cgit_context *ctx)
{
html("<table id='header'>\n");
@@ -760,7 +839,7 @@ void cgit_print_pageheader(struct cgit_context *ctx)
if (ctx->qry.vpath) {
html("<div class='path'>");
html("path: ");
- html_txt(ctx->qry.vpath);
+ cgit_print_path_crumbs(ctx, ctx->qry.vpath);
html("</div>");
}
html("<div class='content'>");
diff --git a/ui-shared.h b/ui-shared.h
index 308c982..3df5464 100644
--- a/ui-shared.h
+++ b/ui-shared.h
@@ -46,6 +46,8 @@ extern void cgit_diff_link(const char *name, const char *title,
extern void cgit_stats_link(const char *name, const char *title,
const char *class, const char *head,
const char *path);
+extern void cgit_self_link(char *name, const char *title,
+ const char *class, struct cgit_context *ctx);
extern void cgit_object_link(struct object *obj);
extern void cgit_print_error(const char *msg);