diff options
| -rw-r--r-- | Makefile | 44 | ||||
| -rw-r--r-- | cache.c | 4 | ||||
| -rw-r--r-- | cgit.c | 46 | ||||
| -rw-r--r-- | cgit.css | 40 | ||||
| -rw-r--r-- | cgit.h | 9 | ||||
| -rw-r--r-- | cgitrc.5.txt | 4 | ||||
| -rw-r--r-- | cmd.c | 3 | ||||
| m--------- | git | 0 | ||||
| -rw-r--r-- | parsing.c | 4 | ||||
| -rw-r--r-- | shared.c | 5 | ||||
| -rwxr-xr-x | tests/setup.sh | 8 | ||||
| -rwxr-xr-x | tests/t0010-validate-html.sh | 9 | ||||
| -rwxr-xr-x | tests/t0104-tree.sh | 2 | ||||
| -rwxr-xr-x | tests/t0107-snapshot.sh | 22 | ||||
| -rw-r--r-- | ui-log.c | 88 | ||||
| -rw-r--r-- | ui-patch.c | 4 | ||||
| -rw-r--r-- | ui-plain.c | 2 | ||||
| -rw-r--r-- | ui-refs.c | 42 | ||||
| -rw-r--r-- | ui-repolist.c | 144 | ||||
| -rw-r--r-- | ui-shared.c | 36 | ||||
| -rw-r--r-- | ui-shared.h | 2 | ||||
| -rw-r--r-- | ui-snapshot.c | 100 | ||||
| -rw-r--r-- | ui-snapshot.h | 3 | ||||
| -rw-r--r-- | ui-tag.c | 16 | ||||
| -rw-r--r-- | ui-tree.c | 8 |
25 files changed, 485 insertions, 160 deletions
| @@ -1,11 +1,33 @@ | |||
| 1 | CGIT_VERSION = v0.8.1 | 1 | CGIT_VERSION = v0.8.1 |
| 2 | CGIT_SCRIPT_NAME = cgit.cgi | 2 | CGIT_SCRIPT_NAME = cgit.cgi |
| 3 | CGIT_SCRIPT_PATH = /var/www/htdocs/cgit | 3 | CGIT_SCRIPT_PATH = /var/www/htdocs/cgit |
| 4 | CGIT_DATA_PATH = $(CGIT_SCRIPT_PATH) | ||
| 4 | CGIT_CONFIG = /etc/cgitrc | 5 | CGIT_CONFIG = /etc/cgitrc |
| 5 | CACHE_ROOT = /var/cache/cgit | 6 | CACHE_ROOT = /var/cache/cgit |
| 6 | SHA1_HEADER = <openssl/sha.h> | 7 | SHA1_HEADER = <openssl/sha.h> |
| 7 | GIT_VER = 1.6.0.2 | 8 | GIT_VER = 1.6.1 |
| 8 | GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 | 9 | GIT_URL = http://www.kernel.org/pub/software/scm/git/git-$(GIT_VER).tar.bz2 |
| 10 | INSTALL = install | ||
| 11 | |||
| 12 | # Define NO_STRCASESTR if you don't have strcasestr. | ||
| 13 | # | ||
| 14 | # Define NEEDS_LIBICONV if linking with libc is not enough (eg. Darwin). | ||
| 15 | # | ||
| 16 | |||
| 17 | #-include config.mak | ||
| 18 | |||
| 19 | # | ||
| 20 | # Platform specific tweaks | ||
| 21 | # | ||
| 22 | |||
| 23 | uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo not') | ||
| 24 | uname_O := $(shell sh -c 'uname -o 2>/dev/null || echo not') | ||
| 25 | uname_R := $(shell sh -c 'uname -r 2>/dev/null || echo not') | ||
| 26 | |||
| 27 | ifeq ($(uname_O),Cygwin) | ||
| 28 | NO_STRCASESTR = YesPlease | ||
| 29 | NEEDS_LIBICONV = YesPlease | ||
| 30 | endif | ||
| 9 | 31 | ||
| 10 | # | 32 | # |
| 11 | # Let the user override the above settings. | 33 | # Let the user override the above settings. |
| @@ -97,6 +119,9 @@ CFLAGS += -DCGIT_CACHE_ROOT='"$(CACHE_ROOT)"' | |||
| 97 | ifdef NO_ICONV | 119 | ifdef NO_ICONV |
| 98 | CFLAGS += -DNO_ICONV | 120 | CFLAGS += -DNO_ICONV |
| 99 | endif | 121 | endif |
| 122 | ifdef NO_STRCASESTR | ||
| 123 | CFLAGS += -DNO_STRCASESTR | ||
| 124 | endif | ||
| 100 | 125 | ||
| 101 | cgit: $(OBJECTS) libgit | 126 | cgit: $(OBJECTS) libgit |
| 102 | $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS) | 127 | $(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o cgit $(OBJECTS) $(EXTLIBS) |
| @@ -106,22 +131,23 @@ cgit.o: VERSION | |||
| 106 | -include $(OBJECTS:.o=.d) | 131 | -include $(OBJECTS:.o=.d) |
| 107 | 132 | ||
| 108 | libgit: | 133 | libgit: |
| 109 | $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) libgit.a | 134 | $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) NO_CURL=1 libgit.a |
| 110 | $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) xdiff/lib.a | 135 | $(QUIET_SUBDIR0)git $(QUIET_SUBDIR1) NO_CURL=1 xdiff/lib.a |
| 111 | 136 | ||
| 112 | test: all | 137 | test: all |
| 113 | $(QUIET_SUBDIR0)tests $(QUIET_SUBDIR1) all | 138 | $(QUIET_SUBDIR0)tests $(QUIET_SUBDIR1) all |
| 114 | 139 | ||
| 115 | install: all | 140 | install: all |
| 116 | mkdir -p $(DESTDIR)$(CGIT_SCRIPT_PATH) | 141 | $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_SCRIPT_PATH) |
| 117 | install cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) | 142 | $(INSTALL) -m 0755 cgit $(DESTDIR)$(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) |
| 118 | install cgit.css $(DESTDIR)$(CGIT_SCRIPT_PATH)/cgit.css | 143 | $(INSTALL) -m 0755 -d $(DESTDIR)$(CGIT_DATA_PATH) |
| 119 | install cgit.png $(DESTDIR)$(CGIT_SCRIPT_PATH)/cgit.png | 144 | $(INSTALL) -m 0644 cgit.css $(DESTDIR)$(CGIT_DATA_PATH)/cgit.css |
| 145 | $(INSTALL) -m 0644 cgit.png $(DESTDIR)$(CGIT_DATA_PATH)/cgit.png | ||
| 120 | 146 | ||
| 121 | uninstall: | 147 | uninstall: |
| 122 | rm -f $(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) | 148 | rm -f $(CGIT_SCRIPT_PATH)/$(CGIT_SCRIPT_NAME) |
| 123 | rm -f $(CGIT_SCRIPT_PATH)/cgit.css | 149 | rm -f $(CGIT_DATA_PATH)/cgit.css |
| 124 | rm -f $(CGIT_SCRIPT_PATH)/cgit.png | 150 | rm -f $(CGIT_DATA_PATH)/cgit.png |
| 125 | 151 | ||
| 126 | clean: | 152 | clean: |
| 127 | rm -f cgit VERSION *.o *.d | 153 | rm -f cgit VERSION *.o *.d |
| @@ -416,11 +416,11 @@ int cache_ls(const char *path) | |||
| 416 | fullname, strerror(err), err); | 416 | fullname, strerror(err), err); |
| 417 | continue; | 417 | continue; |
| 418 | } | 418 | } |
| 419 | printf("%s %s %10zd %s\n", | 419 | printf("%s %s %10"PRIuMAX" %s\n", |
| 420 | name, | 420 | name, |
| 421 | sprintftime("%Y-%m-%d %H:%M:%S", | 421 | sprintftime("%Y-%m-%d %H:%M:%S", |
| 422 | slot.cache_st.st_mtime), | 422 | slot.cache_st.st_mtime), |
| 423 | slot.cache_st.st_size, | 423 | (uintmax_t)slot.cache_st.st_size, |
| 424 | slot.buf); | 424 | slot.buf); |
| 425 | close_slot(&slot); | 425 | close_slot(&slot); |
| 426 | } | 426 | } |
| @@ -159,6 +159,10 @@ static void querystring_cb(const char *name, const char *value) | |||
| 159 | ctx.qry.name = xstrdup(value); | 159 | ctx.qry.name = xstrdup(value); |
| 160 | } else if (!strcmp(name, "mimetype")) { | 160 | } else if (!strcmp(name, "mimetype")) { |
| 161 | ctx.qry.mimetype = xstrdup(value); | 161 | ctx.qry.mimetype = xstrdup(value); |
| 162 | } else if (!strcmp(name, "s")){ | ||
| 163 | ctx.qry.sort = xstrdup(value); | ||
| 164 | } else if (!strcmp(name, "showmsg")) { | ||
| 165 | ctx.qry.showmsg = atoi(value); | ||
| 162 | } else if (!strcmp(name, "period")) { | 166 | } else if (!strcmp(name, "period")) { |
| 163 | ctx.qry.period = xstrdup(value); | 167 | ctx.qry.period = xstrdup(value); |
| 164 | } | 168 | } |
| @@ -297,7 +301,6 @@ static void process_request(void *cbdata) | |||
| 297 | cmd = cgit_get_cmd(ctx); | 301 | cmd = cgit_get_cmd(ctx); |
| 298 | if (!cmd) { | 302 | if (!cmd) { |
| 299 | ctx->page.title = "cgit error"; | 303 | ctx->page.title = "cgit error"; |
| 300 | ctx->repo = NULL; | ||
| 301 | cgit_print_http_headers(ctx); | 304 | cgit_print_http_headers(ctx); |
| 302 | cgit_print_docstart(ctx); | 305 | cgit_print_docstart(ctx); |
| 303 | cgit_print_pageheader(ctx); | 306 | cgit_print_pageheader(ctx); |
| @@ -443,28 +446,29 @@ int main(int argc, const char **argv) | |||
| 443 | ctx.repo = NULL; | 446 | ctx.repo = NULL; |
| 444 | http_parse_querystring(ctx.qry.raw, querystring_cb); | 447 | http_parse_querystring(ctx.qry.raw, querystring_cb); |
| 445 | 448 | ||
| 446 | /* If virtual-root isn't specified in cgitrc and no url | 449 | /* If virtual-root isn't specified in cgitrc, lets pretend |
| 447 | * parameter is specified on the querystring, lets pretend | 450 | * that virtual-root equals SCRIPT_NAME. |
| 448 | * that virtualroot equals SCRIPT_NAME and use PATH_INFO as | ||
| 449 | * url. This allows cgit to work with virtual urls without | ||
| 450 | * the need for rewriterules in the webserver (as long as | ||
| 451 | * PATH_INFO is included in the cache lookup key). | ||
| 452 | */ | 451 | */ |
| 453 | if (!ctx.cfg.virtual_root && !ctx.qry.url) { | 452 | if (!ctx.cfg.virtual_root) |
| 454 | ctx.cfg.virtual_root = ctx.cfg.script_name; | 453 | ctx.cfg.virtual_root = ctx.cfg.script_name; |
| 455 | path = getenv("PATH_INFO"); | 454 | |
| 456 | if (path) { | 455 | /* If no url parameter is specified on the querystring, lets |
| 457 | if (path[0] == '/') | 456 | * use PATH_INFO as url. This allows cgit to work with virtual |
| 458 | path++; | 457 | * urls without the need for rewriterules in the webserver (as |
| 459 | ctx.qry.url = xstrdup(path); | 458 | * long as PATH_INFO is included in the cache lookup key). |
| 460 | if (ctx.qry.raw) { | 459 | */ |
| 461 | qry = ctx.qry.raw; | 460 | path = getenv("PATH_INFO"); |
| 462 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); | 461 | if (!ctx.qry.url && path) { |
| 463 | free(qry); | 462 | if (path[0] == '/') |
| 464 | } else | 463 | path++; |
| 465 | ctx.qry.raw = ctx.qry.url; | 464 | ctx.qry.url = xstrdup(path); |
| 466 | cgit_parse_url(ctx.qry.url); | 465 | if (ctx.qry.raw) { |
| 467 | } | 466 | qry = ctx.qry.raw; |
| 467 | ctx.qry.raw = xstrdup(fmt("%s?%s", path, qry)); | ||
| 468 | free(qry); | ||
| 469 | } else | ||
| 470 | ctx.qry.raw = ctx.qry.url; | ||
| 471 | cgit_parse_url(ctx.qry.url); | ||
| 468 | } | 472 | } |
| 469 | 473 | ||
| 470 | ttl = calc_ttl(); | 474 | ttl = calc_ttl(); |
| @@ -120,6 +120,10 @@ table.list tr { | |||
| 120 | background: white; | 120 | background: white; |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | table.list tr.logheader { | ||
| 124 | background: #eee; | ||
| 125 | } | ||
| 126 | |||
| 123 | table.list tr:hover { | 127 | table.list tr:hover { |
| 124 | background: #eee; | 128 | background: #eee; |
| 125 | } | 129 | } |
| @@ -143,6 +147,17 @@ table.list td { | |||
| 143 | padding: 0.1em 0.5em 0.1em 0.5em; | 147 | padding: 0.1em 0.5em 0.1em 0.5em; |
| 144 | } | 148 | } |
| 145 | 149 | ||
| 150 | table.list td.logsubject { | ||
| 151 | font-family: monospace; | ||
| 152 | font-weight: bold; | ||
| 153 | } | ||
| 154 | |||
| 155 | table.list td.logmsg { | ||
| 156 | font-family: monospace; | ||
| 157 | white-space: pre; | ||
| 158 | padding: 1em 0em 2em 0em; | ||
| 159 | } | ||
| 160 | |||
| 146 | table.list td a { | 161 | table.list td a { |
| 147 | color: black; | 162 | color: black; |
| 148 | } | 163 | } |
| @@ -456,6 +471,30 @@ div.footer { | |||
| 456 | font-size: 80%; | 471 | font-size: 80%; |
| 457 | color: #ccc; | 472 | color: #ccc; |
| 458 | } | 473 | } |
| 474 | a.branch-deco { | ||
| 475 | margin: 0px 0.5em; | ||
| 476 | padding: 0px 0.25em; | ||
| 477 | background-color: #88ff88; | ||
| 478 | border: solid 1px #007700; | ||
| 479 | } | ||
| 480 | a.tag-deco { | ||
| 481 | margin: 0px 0.5em; | ||
| 482 | padding: 0px 0.25em; | ||
| 483 | background-color: #ffff88; | ||
| 484 | border: solid 1px #777700; | ||
| 485 | } | ||
| 486 | a.remote-deco { | ||
| 487 | margin: 0px 0.5em; | ||
| 488 | padding: 0px 0.25em; | ||
| 489 | background-color: #ccccff; | ||
| 490 | border: solid 1px #000077; | ||
| 491 | } | ||
| 492 | a.deco { | ||
| 493 | margin: 0px 0.5em; | ||
| 494 | padding: 0px 0.25em; | ||
| 495 | background-color: #ff8888; | ||
| 496 | border: solid 1px #770000; | ||
| 497 | } | ||
| 459 | table.stats { | 498 | table.stats { |
| 460 | border: solid 1px black; | 499 | border: solid 1px black; |
| 461 | border-collapse: collapse; | 500 | border-collapse: collapse; |
| @@ -532,4 +571,3 @@ table.hgraph div.bar { | |||
| 532 | background-color: #eee; | 571 | background-color: #eee; |
| 533 | height: 1em; | 572 | height: 1em; |
| 534 | } | 573 | } |
| 535 | |||
| @@ -62,6 +62,7 @@ struct cgit_repo { | |||
| 62 | int enable_log_filecount; | 62 | int enable_log_filecount; |
| 63 | int enable_log_linecount; | 63 | int enable_log_linecount; |
| 64 | int max_stats; | 64 | int max_stats; |
| 65 | time_t mtime; | ||
| 65 | }; | 66 | }; |
| 66 | 67 | ||
| 67 | struct cgit_repolist { | 68 | struct cgit_repolist { |
| @@ -123,6 +124,8 @@ struct cgit_query { | |||
| 123 | char *period; | 124 | char *period; |
| 124 | int ofs; | 125 | int ofs; |
| 125 | int nohead; | 126 | int nohead; |
| 127 | char *sort; | ||
| 128 | int showmsg; | ||
| 126 | }; | 129 | }; |
| 127 | 130 | ||
| 128 | struct cgit_config { | 131 | struct cgit_config { |
| @@ -236,11 +239,5 @@ extern const char *cgit_repobasename(const char *reponame); | |||
| 236 | 239 | ||
| 237 | extern int cgit_parse_snapshots_mask(const char *str); | 240 | extern int cgit_parse_snapshots_mask(const char *str); |
| 238 | 241 | ||
| 239 | /* libgit.a either links against or compiles its own implementation of | ||
| 240 | * strcasestr(), and we'd like to reuse it. Simply re-declaring it | ||
| 241 | * seems to do the trick. | ||
| 242 | */ | ||
| 243 | extern char *strcasestr(const char *haystack, const char *needle); | ||
| 244 | |||
| 245 | 242 | ||
| 246 | #endif /* CGIT_H */ | 243 | #endif /* CGIT_H */ |
diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 0bbbea3..09f56a6 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt | |||
| @@ -302,8 +302,8 @@ root-desc=tracking the foobar development | |||
| 302 | root-readme=/var/www/htdocs/about.html | 302 | root-readme=/var/www/htdocs/about.html |
| 303 | 303 | ||
| 304 | 304 | ||
| 305 | # Allow download of tar.gz, tar.bz and zip-files | 305 | # Allow download of tar.gz, tar.bz2 and zip-files |
| 306 | snapshots=tar.gz tar.bz zip | 306 | snapshots=tar.gz tar.bz2 zip |
| 307 | 307 | ||
| 308 | 308 | ||
| 309 | ## | 309 | ## |
| @@ -105,8 +105,7 @@ static void refs_fn(struct cgit_context *ctx) | |||
| 105 | 105 | ||
| 106 | static void snapshot_fn(struct cgit_context *ctx) | 106 | static void snapshot_fn(struct cgit_context *ctx) |
| 107 | { | 107 | { |
| 108 | cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, | 108 | cgit_print_snapshot(ctx->qry.head, ctx->qry.sha1, ctx->qry.path, |
| 109 | cgit_repobasename(ctx->repo->url), ctx->qry.path, | ||
| 110 | ctx->repo->snapshots, ctx->qry.nohead); | 109 | ctx->repo->snapshots, ctx->qry.nohead); |
| 111 | } | 110 | } |
| 112 | 111 | ||
diff --git a/git b/git | |||
| Subproject 97a7a82f199f165f85fe39a3c318b18c621e633 | Subproject 8104ebfe8276657ee803cca7eb8665a78cf3ef8 | ||
| @@ -96,6 +96,9 @@ char *parse_user(char *t, char **name, char **email, unsigned long *date) | |||
| 96 | return p; | 96 | return p; |
| 97 | } | 97 | } |
| 98 | 98 | ||
| 99 | #ifdef NO_ICONV | ||
| 100 | #define reencode(a, b, c) | ||
| 101 | #else | ||
| 99 | const char *reencode(char **txt, const char *src_enc, const char *dst_enc) | 102 | const char *reencode(char **txt, const char *src_enc, const char *dst_enc) |
| 100 | { | 103 | { |
| 101 | char *tmp; | 104 | char *tmp; |
| @@ -110,6 +113,7 @@ const char *reencode(char **txt, const char *src_enc, const char *dst_enc) | |||
| 110 | } | 113 | } |
| 111 | return *txt; | 114 | return *txt; |
| 112 | } | 115 | } |
| 116 | #endif | ||
| 113 | 117 | ||
| 114 | struct commitinfo *cgit_parse_commit(struct commit *commit) | 118 | struct commitinfo *cgit_parse_commit(struct commit *commit) |
| 115 | { | 119 | { |
| @@ -61,6 +61,7 @@ struct cgit_repo *cgit_add_repo(const char *url) | |||
| 61 | ret->max_stats = ctx.cfg.max_stats; | 61 | ret->max_stats = ctx.cfg.max_stats; |
| 62 | ret->module_link = ctx.cfg.module_link; | 62 | ret->module_link = ctx.cfg.module_link; |
| 63 | ret->readme = NULL; | 63 | ret->readme = NULL; |
| 64 | ret->mtime = -1; | ||
| 64 | return ret; | 65 | return ret; |
| 65 | } | 66 | } |
| 66 | 67 | ||
| @@ -267,10 +268,12 @@ int cgit_diff_files(const unsigned char *old_sha1, | |||
| 267 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) | 268 | if (!load_mmfile(&file1, old_sha1) || !load_mmfile(&file2, new_sha1)) |
| 268 | return 1; | 269 | return 1; |
| 269 | 270 | ||
| 271 | memset(&diff_params, 0, sizeof(diff_params)); | ||
| 272 | memset(&emit_params, 0, sizeof(emit_params)); | ||
| 273 | memset(&emit_cb, 0, sizeof(emit_cb)); | ||
| 270 | diff_params.flags = XDF_NEED_MINIMAL; | 274 | diff_params.flags = XDF_NEED_MINIMAL; |
| 271 | emit_params.ctxlen = 3; | 275 | emit_params.ctxlen = 3; |
| 272 | emit_params.flags = XDL_EMIT_FUNCNAMES; | 276 | emit_params.flags = XDL_EMIT_FUNCNAMES; |
| 273 | emit_params.find_func = NULL; | ||
| 274 | emit_cb.outf = filediff_cb; | 277 | emit_cb.outf = filediff_cb; |
| 275 | emit_cb.priv = fn; | 278 | emit_cb.priv = fn; |
| 276 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); | 279 | xdl_diff(&file1, &file2, &diff_params, &emit_params, &emit_cb); |
diff --git a/tests/setup.sh b/tests/setup.sh index 1457dd5..30f90d5 100755 --- a/tests/setup.sh +++ b/tests/setup.sh | |||
| @@ -25,11 +25,13 @@ mkrepo() { | |||
| 25 | mkdir -p $name | 25 | mkdir -p $name |
| 26 | cd $name | 26 | cd $name |
| 27 | git init | 27 | git init |
| 28 | for ((n=1; n<=count; n++)) | 28 | n=1 |
| 29 | while test $n -le $count | ||
| 29 | do | 30 | do |
| 30 | echo $n >file-$n | 31 | echo $n >file-$n |
| 31 | git add file-$n | 32 | git add file-$n |
| 32 | git commit -m "commit $n" | 33 | git commit -m "commit $n" |
| 34 | n=$(expr $n + 1) | ||
| 33 | done | 35 | done |
| 34 | if test "$3" = "testplus" | 36 | if test "$3" = "testplus" |
| 35 | then | 37 | then |
| @@ -101,7 +103,7 @@ run_test() | |||
| 101 | { | 103 | { |
| 102 | desc=$1 | 104 | desc=$1 |
| 103 | script=$2 | 105 | script=$2 |
| 104 | ((test_count++)) | 106 | test_count=$(expr $test_count + 1) |
| 105 | printf "\ntest %d: name='%s'\n" $test_count "$desc" >>test-output.log | 107 | printf "\ntest %d: name='%s'\n" $test_count "$desc" >>test-output.log |
| 106 | printf "test %d: eval='%s'\n" $test_count "$2" >>test-output.log | 108 | printf "test %d: eval='%s'\n" $test_count "$2" >>test-output.log |
| 107 | eval "$2" >>test-output.log 2>>test-output.log | 109 | eval "$2" >>test-output.log 2>>test-output.log |
| @@ -111,7 +113,7 @@ run_test() | |||
| 111 | then | 113 | then |
| 112 | printf " %2d) %-60s [ok]\n" $test_count "$desc" | 114 | printf " %2d) %-60s [ok]\n" $test_count "$desc" |
| 113 | else | 115 | else |
| 114 | ((test_failed++)) | 116 | test_failed=$(expr $test_failed + 1) |
| 115 | printf " %2d) %-60s [failed]\n" $test_count "$desc" | 117 | printf " %2d) %-60s [failed]\n" $test_count "$desc" |
| 116 | fi | 118 | fi |
| 117 | } | 119 | } |
diff --git a/tests/t0010-validate-html.sh b/tests/t0010-validate-html.sh index 94aa52b..3fe4800 100755 --- a/tests/t0010-validate-html.sh +++ b/tests/t0010-validate-html.sh | |||
| @@ -9,7 +9,7 @@ test_url() | |||
| 9 | test -z "$NO_TIDY_WARNINGS" || tidy_opt+=" --show-warnings no" | 9 | test -z "$NO_TIDY_WARNINGS" || tidy_opt+=" --show-warnings no" |
| 10 | cgit_url "$1" >trash/tidy-$test_count || return | 10 | cgit_url "$1" >trash/tidy-$test_count || return |
| 11 | sed -ie "1,4d" trash/tidy-$test_count || return | 11 | sed -ie "1,4d" trash/tidy-$test_count || return |
| 12 | tidy $tidy_opt trash/tidy-$test_count | 12 | "$tidy" $tidy_opt trash/tidy-$test_count |
| 13 | rc=$? | 13 | rc=$? |
| 14 | 14 | ||
| 15 | # tidy returns with exitcode 1 on warnings, 2 on error | 15 | # tidy returns with exitcode 1 on warnings, 2 on error |
| @@ -23,6 +23,13 @@ test_url() | |||
| 23 | 23 | ||
| 24 | prepare_tests 'Validate html with tidy' | 24 | prepare_tests 'Validate html with tidy' |
| 25 | 25 | ||
| 26 | tidy=`which tidy` | ||
| 27 | test -n "$tidy" || { | ||
| 28 | echo "Skipping tests: tidy not found" | ||
| 29 | tests_done | ||
| 30 | exit | ||
| 31 | } | ||
| 32 | |||
| 26 | run_test 'index page' 'test_url ""' | 33 | run_test 'index page' 'test_url ""' |
| 27 | run_test 'foo' 'test_url "foo"' | 34 | run_test 'foo' 'test_url "foo"' |
| 28 | run_test 'foo/log' 'test_url "foo/log"' | 35 | run_test 'foo/log' 'test_url "foo/log"' |
diff --git a/tests/t0104-tree.sh b/tests/t0104-tree.sh index 0d62cc8..33f4eb0 100755 --- a/tests/t0104-tree.sh +++ b/tests/t0104-tree.sh | |||
| @@ -15,7 +15,7 @@ run_test 'find line 1' ' | |||
| 15 | ' | 15 | ' |
| 16 | 16 | ||
| 17 | run_test 'no line 2' ' | 17 | run_test 'no line 2' ' |
| 18 | grep -e "<a id=.n2. name=.n2. href=.#n2.>2</a>" trash/tmp | 18 | ! grep -e "<a id=.n2. name=.n2. href=.#n2.>2</a>" trash/tmp |
| 19 | ' | 19 | ' |
| 20 | 20 | ||
| 21 | run_test 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >trash/tmp' | 21 | run_test 'generate foo+bar/tree' 'cgit_url "foo%2bbar/tree" >trash/tmp' |
diff --git a/tests/t0107-snapshot.sh b/tests/t0107-snapshot.sh index d97c465..8ab4912 100755 --- a/tests/t0107-snapshot.sh +++ b/tests/t0107-snapshot.sh | |||
| @@ -4,36 +4,36 @@ | |||
| 4 | 4 | ||
| 5 | prepare_tests "Verify snapshot" | 5 | prepare_tests "Verify snapshot" |
| 6 | 6 | ||
| 7 | run_test 'get foo/snapshot/test.tar.gz' ' | 7 | run_test 'get foo/snapshot/master.tar.gz' ' |
| 8 | cgit_url "foo/snapshot/test.tar.gz" >trash/tmp | 8 | cgit_url "foo/snapshot/master.tar.gz" >trash/tmp |
| 9 | ' | 9 | ' |
| 10 | 10 | ||
| 11 | run_test 'check html headers' ' | 11 | run_test 'check html headers' ' |
| 12 | head -n 1 trash/tmp | | 12 | head -n 1 trash/tmp | |
| 13 | grep -e "Content-Type: application/x-tar" && | 13 | grep -e "Content-Type: application/x-gzip" && |
| 14 | 14 | ||
| 15 | head -n 2 trash/tmp | | 15 | head -n 2 trash/tmp | |
| 16 | grep -e "Content-Disposition: inline; filename=.test.tar.gz." | 16 | grep -e "Content-Disposition: inline; filename=.master.tar.gz." |
| 17 | ' | 17 | ' |
| 18 | 18 | ||
| 19 | run_test 'strip off the header lines' ' | 19 | run_test 'strip off the header lines' ' |
| 20 | tail -n +6 trash/tmp > trash/test.tar.gz | 20 | tail -n +6 trash/tmp > trash/master.tar.gz |
| 21 | ' | 21 | ' |
| 22 | 22 | ||
| 23 | run_test 'verify gzip format' 'gunzip --test trash/test.tar.gz' | 23 | run_test 'verify gzip format' 'gunzip --test trash/master.tar.gz' |
| 24 | run_test 'untar' ' | 24 | run_test 'untar' ' |
| 25 | rm -rf trash/foo && | 25 | rm -rf trash/master && |
| 26 | tar -xf trash/test.tar.gz -C trash | 26 | tar -xf trash/master.tar.gz -C trash |
| 27 | ' | 27 | ' |
| 28 | 28 | ||
| 29 | run_test 'count files' ' | 29 | run_test 'count files' ' |
| 30 | c=$(ls -1 trash/foo/ | wc -l) && | 30 | c=$(ls -1 trash/master/ | wc -l) && |
| 31 | test $c = 5 | 31 | test $c = 5 |
| 32 | ' | 32 | ' |
| 33 | 33 | ||
| 34 | run_test 'verify untarred file-5' ' | 34 | run_test 'verify untarred file-5' ' |
| 35 | grep -e "^5$" trash/foo/file-5 && | 35 | grep -e "^5$" trash/master/file-5 && |
| 36 | test $(cat trash/foo/file-5 | wc -l) = 1 | 36 | test $(cat trash/master/file-5 | wc -l) = 1 |
| 37 | ' | 37 | ' |
| 38 | 38 | ||
| 39 | tests_done | 39 | tests_done |
| @@ -31,21 +31,57 @@ void inspect_files(struct diff_filepair *pair) | |||
| 31 | cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); | 31 | cgit_diff_files(pair->one->sha1, pair->two->sha1, count_lines); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | void show_commit_decorations(struct commit *commit) | ||
| 35 | { | ||
| 36 | struct name_decoration *deco; | ||
| 37 | static char buf[1024]; | ||
| 38 | |||
| 39 | buf[sizeof(buf) - 1] = 0; | ||
| 40 | deco = lookup_decoration(&name_decoration, &commit->object); | ||
| 41 | while (deco) { | ||
| 42 | if (!prefixcmp(deco->name, "refs/heads/")) { | ||
| 43 | strncpy(buf, deco->name + 11, sizeof(buf) - 1); | ||
| 44 | cgit_log_link(buf, NULL, "branch-deco", buf, NULL, NULL, | ||
| 45 | 0, NULL, NULL, ctx.qry.showmsg); | ||
| 46 | } | ||
| 47 | else if (!prefixcmp(deco->name, "tag: refs/tags/")) { | ||
| 48 | strncpy(buf, deco->name + 15, sizeof(buf) - 1); | ||
| 49 | cgit_tag_link(buf, NULL, "tag-deco", ctx.qry.head, buf); | ||
| 50 | } | ||
| 51 | else if (!prefixcmp(deco->name, "refs/remotes/")) { | ||
| 52 | strncpy(buf, deco->name + 13, sizeof(buf) - 1); | ||
| 53 | cgit_log_link(buf, NULL, "remote-deco", NULL, | ||
| 54 | sha1_to_hex(commit->object.sha1), NULL, | ||
| 55 | 0, NULL, NULL, ctx.qry.showmsg); | ||
| 56 | } | ||
| 57 | else { | ||
| 58 | strncpy(buf, deco->name, sizeof(buf) - 1); | ||
| 59 | cgit_commit_link(buf, NULL, "deco", ctx.qry.head, | ||
| 60 | sha1_to_hex(commit->object.sha1)); | ||
| 61 | } | ||
| 62 | deco = deco->next; | ||
| 63 | } | ||
| 64 | } | ||
| 65 | |||
| 34 | void print_commit(struct commit *commit) | 66 | void print_commit(struct commit *commit) |
| 35 | { | 67 | { |
| 36 | struct commitinfo *info; | 68 | struct commitinfo *info; |
| 37 | char *tmp; | 69 | char *tmp; |
| 70 | int cols = 2; | ||
| 38 | |||
