author | Jason A. Donenfeld <Jason@zx2c4.com> | 2010-08-03 22:45:42 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2010-08-20 16:57:30 (UTC) |
commit | 379e80e3a83481d3639c5d312eeddcce57c486b2 (patch) (side-by-side diff) | |
tree | 474ac38e3812008532d4ebd0b095ac835b5478b5 | |
parent | aec9c245e7eaf444c7ae1851e3eda3b30748950f (diff) | |
download | cgit-379e80e3a83481d3639c5d312eeddcce57c486b2.zip cgit-379e80e3a83481d3639c5d312eeddcce57c486b2.tar.gz cgit-379e80e3a83481d3639c5d312eeddcce57c486b2.tar.bz2 |
Support refspecs in about-filter.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r-- | cgit.c | 4 | ||||
-rw-r--r-- | cgitrc.5.txt | 4 | ||||
-rw-r--r-- | ui-blob.c | 35 | ||||
-rw-r--r-- | ui-blob.h | 1 | ||||
-rw-r--r-- | ui-summary.c | 26 |
5 files changed, 63 insertions, 7 deletions
@@ -3,2 +3,3 @@ * Copyright (C) 2006 Lars Hjemli + * Copyright (C) 2010 Jason A. Donenfeld <Jason@zx2c4.com> * @@ -73,3 +74,4 @@ void repo_config(struct cgit_repo *repo, const char *name, const char *value) else if (!strcmp(name, "readme") && value != NULL) { - if (*value == '/') + char *colon; + if (*value == '/' || ((colon = strchr(value, ':')) != NULL && colon != value && *(colon + 1) != '\0')) repo->readme = xstrdup(value); diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 5d77973..c643fae 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -373,3 +373,5 @@ repo.readme:: A path (relative to <repo.path>) which specifies a file to include - verbatim as the "About" page for this repo. Default value: none. + verbatim as the "About" page for this repo. You may also specify a + git refspec by head or by hash by prepending the refspec followed by + a colon. For example, "master:docs/readme.mkd" Default value: none. @@ -3,2 +3,3 @@ * Copyright (C) 2008 Lars Hjemli + * Copyright (C) 2010 Jason A. Donenfeld <Jason@zx2c4.com> * @@ -14,2 +15,3 @@ static char *match_path; static unsigned char *matched_sha1; +static int found_path; @@ -21,2 +23,3 @@ static int walk_tree(const unsigned char *sha1, const char *base,int baselen, memmove(matched_sha1,sha1,20); + found_path = 1; return 0; @@ -24,5 +27,35 @@ static int walk_tree(const unsigned char *sha1, const char *base,int baselen, -void cgit_print_blob(const char *hex, char *path, const char *head) +int cgit_print_file(char *path, const char *head) { + unsigned char sha1[20]; + enum object_type type; + char *buf; + unsigned long size; + struct commit *commit; + const char *paths[] = {path, NULL}; + if (get_sha1(head, sha1)) + return -1; + type = sha1_object_info(sha1, &size); + if(type == OBJ_COMMIT && path) { + commit = lookup_commit_reference(sha1); + match_path = path; + matched_sha1 = sha1; + found_path = 0; + read_tree_recursive(commit->tree, "", 0, 0, paths, walk_tree, NULL); + if (!found_path) + return -1; + type = sha1_object_info(sha1, &size); + } + if (type == OBJ_BAD) + return -1; + buf = read_sha1_file(sha1, &type, &size); + if (!buf) + return -1; + buf[size] = '\0'; + write(htmlfd, buf, size); + return 0; +} +void cgit_print_blob(const char *hex, char *path, const char *head) +{ unsigned char sha1[20]; @@ -3,2 +3,3 @@ +extern int cgit_print_file(char *path, const char *head); extern void cgit_print_blob(const char *hex, char *path, const char *head); diff --git a/ui-summary.c b/ui-summary.c index a2c018e..02f191e 100644 --- a/ui-summary.c +++ b/ui-summary.c @@ -3,2 +3,3 @@ * Copyright (C) 2006 Lars Hjemli + * Copyright (C) 2010 Jason A. Donenfeld <Jason@zx2c4.com> * @@ -12,2 +13,3 @@ #include "ui-refs.h" +#include "ui-blob.h" @@ -70,3 +72,3 @@ void cgit_print_repo_readme(char *path) { - char *slash, *tmp; + char *slash, *tmp, *colon, *ref = 0; @@ -77,4 +79,7 @@ void cgit_print_repo_readme(char *path) slash = strrchr(ctx.repo->readme, '/'); - if (!slash) - return; + if (!slash) { + slash = strchr(ctx.repo->readme, ':'); + if (!slash) + return; + } tmp = xmalloc(slash - ctx.repo->readme + 1 + strlen(path) + 1); @@ -84,2 +89,12 @@ void cgit_print_repo_readme(char *path) tmp = ctx.repo->readme; + colon = strchr(tmp, ':'); + if (colon && strlen(colon) > 1) { + *colon = '\0'; + ref = tmp; + tmp = colon + 1; + while ((*tmp == '/' || *tmp == ':') && *tmp != '\0') + ++tmp; + if (!(*tmp)) + return; + } html("<div id='summary'>"); @@ -87,3 +102,6 @@ void cgit_print_repo_readme(char *path) cgit_open_filter(ctx.repo->about_filter); - html_include(tmp); + if (ref) + cgit_print_file(tmp, ref); + else + html_include(tmp); if (ctx.repo->about_filter) |