Merge branch 'jh/path-limit' Conflicts: cgit.h ui-commit.c
@@ -433,6 +433,12 @@ cgit_print_docend();
return; } + /* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual" + * in-project path limit to be made available at ctx->qry.vpath. + * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL). + */ + ctx->qry.vpath = cmd->want_vpath ? ctx->qry.path : NULL; + if (cmd->want_repo && !ctx->repo) { cgit_print_http_headers(ctx); cgit_print_docstart(ctx);
@@ -64,7 +64,7 @@ padding-left: 10px;
} table.tabs { - /* border-bottom: solid 2px #ccc; */ + border-bottom: solid 3px #ccc; border-collapse: collapse; margin-top: 2em; margin-bottom: 0px;@@ -102,10 +102,16 @@ table.tabs td.form select {
font-size: 90%; } +div.path { + margin: 0px; + padding: 5px 2em 2px 2em; + color: #000; + background-color: #eee; +} + div.content { margin: 0px; padding: 2em; - border-top: solid 3px #ccc; border-bottom: solid 3px #ccc; }
@@ -444,7 +444,7 @@ ##
## List of common mimetypes ## -mimetype.git=image/git +mimetype.gif=image/gif mimetype.html=text/html mimetype.jpg=image/jpeg mimetype.jpeg=image/jpeg
@@ -51,7 +51,7 @@ }
static void commit_fn(struct cgit_context *ctx) { - cgit_print_commit(ctx->qry.sha1); + cgit_print_commit(ctx->qry.sha1, ctx->qry.path); } static void diff_fn(struct cgit_context *ctx)@@ -90,7 +90,7 @@ }
static void patch_fn(struct cgit_context *ctx) { - cgit_print_patch(ctx->qry.sha1); + cgit_print_patch(ctx->qry.sha1, ctx->qry.path); } static void plain_fn(struct cgit_context *ctx)@@ -129,31 +129,31 @@ {
cgit_print_tree(ctx->qry.sha1, ctx->qry.path); } -#define def_cmd(name, want_repo, want_layout) \ - {#name, name##_fn, want_repo, want_layout} +#define def_cmd(name, want_repo, want_layout, want_vpath) \ + {#name, name##_fn, want_repo, want_layout, want_vpath} struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) { static struct cgit_cmd cmds[] = { - def_cmd(HEAD, 1, 0), - def_cmd(atom, 1, 0), - def_cmd(about, 0, 1), - def_cmd(blob, 1, 0), - def_cmd(commit, 1, 1), - def_cmd(diff, 1, 1), - def_cmd(info, 1, 0), - def_cmd(log, 1, 1), - def_cmd(ls_cache, 0, 0), - def_cmd(objects, 1, 0), - def_cmd(patch, 1, 0), - def_cmd(plain, 1, 0), - def_cmd(refs, 1, 1), - def_cmd(repolist, 0, 0), - def_cmd(snapshot, 1, 0), - def_cmd(stats, 1, 1), - def_cmd(summary, 1, 1), - def_cmd(tag, 1, 1), - def_cmd(tree, 1, 1), + def_cmd(HEAD, 1, 0, 0), + def_cmd(atom, 1, 0, 0), + def_cmd(about, 0, 1, 0), + def_cmd(blob, 1, 0, 0), + def_cmd(commit, 1, 1, 1), + def_cmd(diff, 1, 1, 1), + def_cmd(info, 1, 0, 0), + def_cmd(log, 1, 1, 1), + def_cmd(ls_cache, 0, 0, 0), + def_cmd(objects, 1, 0, 0), + def_cmd(patch, 1, 0, 1), + def_cmd(plain, 1, 0, 0), + def_cmd(refs, 1, 1, 0), + def_cmd(repolist, 0, 0, 0), + def_cmd(snapshot, 1, 0, 0), + def_cmd(stats, 1, 1, 1), + def_cmd(summary, 1, 1, 0), + def_cmd(tag, 1, 1, 0), + def_cmd(tree, 1, 1, 1), }; int i;
@@ -12,7 +12,7 @@ #include "ui-shared.h"
#include "ui-diff.h" #include "ui-log.h" -void cgit_print_commit(char *hex) +void cgit_print_commit(char *hex, const char *prefix) { struct commit *commit, *parent; struct commitinfo *info, *parent_info;@@ -58,19 +58,23 @@ cgit_print_date(info->committer_date, FMT_LONGDATE, ctx.cfg.local_time);
html("</td></tr>\n"); html("<tr><th>commit</th><td colspan='2' class='sha1'>"); tmp = sha1_to_hex(commit->object.sha1); - cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp, 0); + cgit_commit_link(tmp, NULL, NULL, ctx.qry.head, tmp, prefix, 0); html(" ("); - cgit_patch_link("patch", NULL, NULL, NULL, tmp); + cgit_patch_link("patch", NULL, NULL, NULL, tmp, prefix); html(") ("); if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff)) - cgit_commit_link("unidiff", NULL, NULL, ctx.qry.head, tmp, 1); + cgit_commit_link("unidiff", NULL, NULL, ctx.qry.head, tmp, prefix, 1); else - cgit_commit_link("side-by-side diff", NULL, NULL, ctx.qry.head, tmp, 1); + cgit_commit_link("side-by-side diff", NULL, NULL, ctx.qry.head, tmp, prefix, 1); html(")</td></tr>\n"); html("<tr><th>tree</th><td colspan='2' class='sha1'>"); tmp = xstrdup(hex); cgit_tree_link(sha1_to_hex(commit->tree->object.sha1), NULL, NULL, ctx.qry.head, tmp, NULL); + if (prefix) { + html(" /"); + cgit_tree_link(prefix, NULL, NULL, ctx.qry.head, tmp, prefix); + } html("</td></tr>\n"); for (p = commit->parents; p ; p = p->next) { parent = lookup_commit_reference(p->item->object.sha1);@@ -87,10 +91,10 @@ if (ctx.repo->enable_subject_links) {
parent_info = cgit_parse_commit(parent); tmp2 = parent_info->subject; } - cgit_commit_link(tmp2, NULL, NULL, ctx.qry.head, tmp, 0); + cgit_commit_link(tmp2, NULL, NULL, ctx.qry.head, tmp, prefix, 0); html(" ("); cgit_diff_link("diff", NULL, NULL, ctx.qry.head, hex, - sha1_to_hex(p->item->object.sha1), NULL, 0); + sha1_to_hex(p->item->object.sha1), prefix, 0); html(")</td></tr>"); parents++; }@@ -121,7 +125,7 @@ if (parents)
tmp = sha1_to_hex(commit->parents->item->object.sha1); else tmp = NULL; - cgit_print_diff(ctx.qry.sha1, tmp, NULL); + cgit_print_diff(ctx.qry.sha1, tmp, prefix); } cgit_free_commitinfo(info); }
@@ -1,6 +1,6 @@
#ifndef UI_COMMIT_H #define UI_COMMIT_H -extern void cgit_print_commit(char *hex); +extern void cgit_print_commit(char *hex, const char *prefix); #endif /* UI_COMMIT_H */
@@ -154,17 +154,19 @@ total_rems += lines_removed;
} void cgit_print_diffstat(const unsigned char *old_sha1, - const unsigned char *new_sha1) + const unsigned char *new_sha1, const char *prefix) { int i; html("<div class='diffstat-header'>"); cgit_diff_link("Diffstat", NULL, NULL, ctx.qry.head, ctx.qry.sha1, ctx.qry.sha2, NULL, 0); + if (prefix) + htmlf(" (limited to '%s')", prefix); html("</div>"); html("<table summary='diffstat' class='diffstat'>"); max_changes = 0; - cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, NULL); + cgit_diff_tree(old_sha1, new_sha1, inspect_filepair, prefix); for(i = 0; i<files; i++) print_fileinfo(&items[i]); html("</table>");@@ -338,7 +340,7 @@ if ((ctx.qry.ssdiff && !ctx.cfg.ssdiff) || (!ctx.qry.ssdiff && ctx.cfg.ssdiff))
use_ssdiff = 1; print_ssdiff_link(); - cgit_print_diffstat(old_rev_sha1, new_rev_sha1); + cgit_print_diffstat(old_rev_sha1, new_rev_sha1, prefix); if (use_ssdiff) { html("<table summary='ssdiff' class='ssdiff'>");
@@ -46,8 +46,9 @@ deco = lookup_decoration(&name_decoration, &commit->object);
while (deco) { if (!prefixcmp(deco->name, "refs/heads/")) { strncpy(buf, deco->name + 11, sizeof(buf) - 1); - cgit_log_link(buf, NULL, "branch-deco", buf, NULL, NULL, - 0, NULL, NULL, ctx.qry.showmsg); + cgit_log_link(buf, NULL, "branch-deco", buf, NULL, + ctx.qry.vpath, 0, NULL, NULL, + ctx.qry.showmsg); } else if (!prefixcmp(deco->name, "tag: refs/tags/")) { strncpy(buf, deco->name + 15, sizeof(buf) - 1);@@ -60,13 +61,15 @@ }
else if (!prefixcmp(deco->name, "refs/remotes/")) { strncpy(buf, deco->name + 13, sizeof(buf) - 1); cgit_log_link(buf, NULL, "remote-deco", NULL, - sha1_to_hex(commit->object.sha1), NULL, - 0, NULL, NULL, ctx.qry.showmsg); + sha1_to_hex(commit->object.sha1), + ctx.qry.vpath, 0, NULL, NULL, + ctx.qry.showmsg); } else { strncpy(buf, deco->name, sizeof(buf) - 1); cgit_commit_link(buf, NULL, "deco", ctx.qry.head, - sha1_to_hex(commit->object.sha1), 0); + sha1_to_hex(commit->object.sha1), + ctx.qry.vpath, 0); } deco = deco->next; }@@ -82,14 +85,14 @@ info = cgit_parse_commit(commit);
htmlf("<tr%s><td>", ctx.qry.showmsg ? " class='logheader'" : ""); tmp = fmt("id=%s", sha1_to_hex(commit->object.sha1)); - tmp = cgit_pageurl(ctx.repo->url, "commit", tmp); + tmp = cgit_fileurl(ctx.repo->url, "commit", ctx.qry.vpath, tmp); html_link_open(tmp, NULL, NULL); cgit_print_age(commit->date, TM_WEEK * 2, FMT_SHORTDATE); html_link_close(); htmlf("</td><td%s>", ctx.qry.showmsg ? " class='logsubject'" : ""); cgit_commit_link(info->subject, NULL, NULL, ctx.qry.head, - sha1_to_hex(commit->object.sha1), 0); + sha1_to_hex(commit->object.sha1), ctx.qry.vpath, 0); show_commit_decorations(commit); html("</td><td>"); html_txt(info->author);@@ -176,7 +179,7 @@ if (pager) {
html(" ("); cgit_log_link(ctx.qry.showmsg ? "Collapse" : "Expand", NULL, NULL, ctx.qry.head, ctx.qry.sha1, - ctx.qry.path, ctx.qry.ofs, ctx.qry.grep, + ctx.qry.vpath, ctx.qry.ofs, ctx.qry.grep, ctx.qry.search, ctx.qry.showmsg ? 0 : 1); html(")"); }@@ -213,22 +216,22 @@ htmlf("</table><div class='pager'>",
columns); if (ofs > 0) { cgit_log_link("[prev]", NULL, NULL, ctx.qry.head, - ctx.qry.sha1, ctx.qry.path, + ctx.qry.sha1, ctx.qry.vpath, ofs - cnt, ctx.qry.grep, ctx.qry.search, ctx.qry.showmsg); html(" "); } if ((commit = get_revision(&rev)) != NULL) { cgit_log_link("[next]", NULL, NULL, ctx.qry.head, - ctx.qry.sha1, ctx.qry.path, + ctx.qry.sha1, ctx.qry.vpath, ofs + cnt, ctx.qry.grep, ctx.qry.search, ctx.qry.showmsg); } html("</div>"); } else if ((commit = get_revision(&rev)) != NULL) { html("<tr class='nohover'><td colspan='3'>"); - cgit_log_link("[...]", NULL, NULL, ctx.qry.head, NULL, NULL, 0, - NULL, NULL, ctx.qry.showmsg); + cgit_log_link("[...]", NULL, NULL, ctx.qry.head, NULL, + ctx.qry.vpath, 0, NULL, NULL, ctx.qry.showmsg); html("</td></tr>\n"); } }
@@ -77,7 +77,7 @@ if (binary)
html("Binary files differ\n"); } -void cgit_print_patch(char *hex) +void cgit_print_patch(char *hex, const char *prefix) { struct commit *commit; struct commitinfo *info;@@ -122,7 +122,9 @@ if (info->msg[strlen(info->msg) - 1] != '\n')
html("\n"); } html("---\n"); - cgit_diff_tree(old_sha1, sha1, filepair_cb, NULL); + if (prefix) + htmlf("(limited to '%s')\n\n", prefix); + cgit_diff_tree(old_sha1, sha1, filepair_cb, prefix); html("--\n"); htmlf("cgit %s\n", CGIT_VERSION); cgit_free_commitinfo(info);
@@ -1,6 +1,6 @@
#ifndef UI_PATCH_H #define UI_PATCH_H -extern void cgit_print_patch(char *hex); +extern void cgit_print_patch(char *hex, const char *prefix); #endif /* UI_PATCH_H */
@@ -74,7 +74,7 @@ ctx.qry.showmsg);
html("</td><td>"); if (ref->object->type == OBJ_COMMIT) { - cgit_commit_link(info->subject, NULL, NULL, name, NULL, 0); + cgit_commit_link(info->subject, NULL, NULL, name, NULL, NULL, 0); html("</td><td>"); html_txt(info->author); html("</td><td colspan='2'>");
@@ -102,10 +102,10 @@ sha1_to_hex(sha1)));
return; } - html(" ("); + htmlf("blob: %s (", sha1_to_hex(sha1)); cgit_plain_link("plain", NULL, NULL, ctx.qry.head, curr_rev, path); - htmlf(")<br/>blob: %s\n", sha1_to_hex(sha1)); + html(")\n"); if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) { htmlf("<div class='error'>blob size (%dKB) exceeds display size limit (%dKB).</div>",@@ -225,17 +225,10 @@ void *cbdata)
{ static int state; static char buffer[PATH_MAX]; - char *url; if (state == 0) { memcpy(buffer, base, baselen); strcpy(buffer+baselen, pathname); - url = cgit_pageurl(ctx.qry.repo, "tree", - fmt("h=%s&path=%s", curr_rev, buffer)); - html("/"); - cgit_tree_link(xstrdup(pathname), NULL, NULL, ctx.qry.head, - curr_rev, buffer); - if (strcmp(match_path, buffer)) return READ_TREE_RECURSIVE;@@ -277,10 +270,6 @@ if (!commit || parse_commit(commit)) {
cgit_print_error(fmt("Invalid commit reference: %s", rev)); return; } - - html("path: <a href='"); - html_attr(cgit_pageurl(ctx.qry.repo, "tree", fmt("h=%s", rev))); - html("'>root</a>"); if (path == NULL) { ls_tree(commit->tree->object.sha1, NULL);