X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/c3f23d4571c06c979eddbd4c973163ba76c7e50f..084ca50972b4be120eba8d22ce585766ae315c36:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index 7d7fff0..5aa9119 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -319,7 +319,8 @@ void cgit_log_link(const char *name, const char *title, const char *class, } void cgit_commit_link(char *name, const char *title, const char *class, - const char *head, const char *rev, int toggle_ssdiff) + const char *head, const char *rev, const char *path, + int toggle_ssdiff) { if (strlen(name) > ctx.cfg.max_msg_len && ctx.cfg.max_msg_len >= 15) { name[ctx.cfg.max_msg_len] = '\0'; @@ -330,7 +331,7 @@ void cgit_commit_link(char *name, const char *title, const char *class, char *delim; - delim = repolink(title, class, "commit", head, NULL); + delim = repolink(title, class, "commit", head, path); if (rev && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); @@ -340,6 +341,18 @@ void cgit_commit_link(char *name, const char *title, const char *class, if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { html(delim); html("ss=1"); + delim = "&"; + } + if (ctx.qry.context > 0 && ctx.qry.context != 3) { + html(delim); + html("context="); + htmlf("%d", ctx.qry.context); + delim = "&"; + } + if (ctx.qry.ignorews) { + html(delim); + html("ignorews=1"); + delim = "&"; } html("'>"); html_txt(name); @@ -381,6 +394,18 @@ void cgit_diff_link(const char *name, const char *title, const char *class, if ((ctx.qry.ssdiff && !toggle_ssdiff) || (!ctx.qry.ssdiff && toggle_ssdiff)) { html(delim); html("ss=1"); + delim = "&"; + } + if (ctx.qry.context > 0 && ctx.qry.context != 3) { + html(delim); + html("context="); + htmlf("%d", ctx.qry.context); + delim = "&"; + } + if (ctx.qry.ignorews) { + html(delim); + html("ignorews=1"); + delim = "&"; } html("'>"); html_txt(name); @@ -388,9 +413,9 @@ void cgit_diff_link(const char *name, const char *title, const char *class, } void cgit_patch_link(const char *name, const char *title, const char *class, - const char *head, const char *rev) + const char *head, const char *rev, const char *path) { - reporevlink("patch", name, title, class, head, rev, NULL); + reporevlink("patch", name, title, class, head, rev, path); } void cgit_stats_link(const char *name, const char *title, const char *class, @@ -399,6 +424,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(">"); + html_txt(name); + html(""); +} + void cgit_object_link(struct object *obj) { char *page, *shortrev, *fullrev, *name; @@ -408,7 +491,7 @@ void cgit_object_link(struct object *obj) shortrev[10] = '\0'; if (obj->type == OBJ_COMMIT) { cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, - ctx.qry.head, fullrev, 0); + ctx.qry.head, fullrev, NULL, 0); return; } else if (obj->type == OBJ_TREE) page = "tree"; @@ -491,7 +574,7 @@ void cgit_print_http_headers(struct cgit_context *ctx) else if (ctx->page.mimetype) htmlf("Content-Type: %s\n", ctx->page.mimetype); if (ctx->page.size) - htmlf("Content-Length: %ld\n", ctx->page.size); + htmlf("Content-Length: %zd\n", ctx->page.size); if (ctx->page.filename) htmlf("Content-Disposition: inline; filename=\"%s\"\n", ctx->page.filename); @@ -534,7 +617,7 @@ void cgit_print_docstart(struct cgit_context *ctx) html("\n"); } @@ -621,8 +704,8 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, if (!ctx.cfg.virtual_root) { url = fmt("%s/%s", ctx.qry.repo, page); - if (ctx.qry.path) - url = fmt("%s/%s", url, ctx.qry.path); + if (ctx.qry.vpath) + url = fmt("%s/%s", url, ctx.qry.vpath); html_hidden("url", url); } @@ -645,26 +728,55 @@ void cgit_add_hidden_formfields(int incl_head, int incl_search, } } -const char *fallback_cmd = "repolist"; +static const char *hc(struct cgit_context *ctx, const char *page) +{ + return strcmp(ctx->qry.page, page) ? NULL : "active"; +} -char *hc(struct cgit_cmd *cmd, const char *page) +static void cgit_print_path_crumbs(struct cgit_context *ctx, char *path) { - return (strcmp(cmd ? cmd->name : fallback_cmd, page) ? NULL : "active"); + 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) { + char *logo = NULL, *logo_link = NULL; + html("\n"); html("\n"); - if (ctx->cfg.logo && ctx->cfg.logo[0] != 0) { + if (ctx->repo && ctx->repo->logo && *ctx->repo->logo) + logo = ctx->repo->logo; + else + logo = ctx->cfg.logo; + if (ctx->repo && ctx->repo->logo_link && *ctx->repo->logo_link) + logo_link = ctx->repo->logo_link; + else + logo_link = ctx->cfg.logo_link; + if (logo && *logo) { html("\n"); } @@ -701,47 +813,44 @@ static void print_header(struct cgit_context *ctx) void cgit_print_pageheader(struct cgit_context *ctx) { - struct cgit_cmd *cmd = cgit_get_cmd(ctx); - - if (!cmd && ctx->repo) - fallback_cmd = "summary"; - html("
"); if (!ctx->cfg.noheader) print_header(ctx); html("
\n"); if (ctx->repo) { - cgit_summary_link("summary", NULL, hc(cmd, "summary"), + cgit_summary_link("summary", NULL, hc(ctx, "summary"), ctx->qry.head); - cgit_refs_link("refs", NULL, hc(cmd, "refs"), ctx->qry.head, - ctx->qry.sha1, NULL); - cgit_log_link("log", NULL, hc(cmd, "log"), ctx->qry.head, - NULL, NULL, 0, NULL, NULL, ctx->qry.showmsg); - cgit_tree_link("tree", NULL, hc(cmd, "tree"), ctx->qry.head, + cgit_refs_link("refs", NULL, hc(ctx, "refs"), ctx->qry.head, ctx->qry.sha1, NULL); - cgit_commit_link("commit", NULL, hc(cmd, "commit"), - ctx->qry.head, ctx->qry.sha1, 0); - cgit_diff_link("diff", NULL, hc(cmd, "diff"), ctx->qry.head, - ctx->qry.sha1, ctx->qry.sha2, NULL, 0); + cgit_log_link("log", NULL, hc(ctx, "log"), ctx->qry.head, + NULL, ctx->qry.vpath, 0, NULL, NULL, + ctx->qry.showmsg); + cgit_tree_link("tree", NULL, hc(ctx, "tree"), ctx->qry.head, + ctx->qry.sha1, ctx->qry.vpath); + cgit_commit_link("commit", NULL, hc(ctx, "commit"), + ctx->qry.head, ctx->qry.sha1, ctx->qry.vpath, 0); + cgit_diff_link("diff", NULL, hc(ctx, "diff"), ctx->qry.head, + ctx->qry.sha1, ctx->qry.sha2, ctx->qry.vpath, 0); if (ctx->repo->max_stats) - cgit_stats_link("stats", NULL, hc(cmd, "stats"), - ctx->qry.head, NULL); + cgit_stats_link("stats", NULL, hc(ctx, "stats"), + ctx->qry.head, ctx->qry.vpath); if (ctx->repo->readme) reporevlink("about", "about", NULL, - hc(cmd, "about"), ctx->qry.head, NULL, + hc(ctx, "about"), ctx->qry.head, NULL, NULL); html(""); html("
\n"); cgit_add_hidden_formfields(1, 0, "log"); html("\n"); html("\n"); html("
\n"); } else { - site_link(NULL, "index", NULL, hc(cmd, "repolist"), NULL, 0); + site_link(NULL, "index", NULL, hc(ctx, "repolist"), NULL, 0); if (ctx->cfg.root_readme) - site_link("about", "about", NULL, hc(cmd, "about"), + site_link("about", "about", NULL, hc(ctx, "about"), NULL, 0); html("
"); html("
"); + html("path: "); + cgit_print_path_crumbs(ctx, ctx->qry.vpath); + html(""); + } html("
"); }