X-Git-Url: https://git.cameronkatri.com/cgit.git/blobdiff_plain/51d9176e4bb5c619481355c6b895c6dec30c4f82..2f8648ff7f5c7119ab035c134504f04eefe068fb:/ui-repolist.c diff --git a/ui-repolist.c b/ui-repolist.c index ac1b3e3..af52f9b 100644 --- a/ui-repolist.c +++ b/ui-repolist.c @@ -15,11 +15,13 @@ static time_t read_agefile(char *path) { time_t result; size_t size; - char *buf; + char *buf = NULL; struct strbuf date_buf = STRBUF_INIT; - if (readfile(path, &buf, &size)) + if (readfile(path, &buf, &size)) { + free(buf); return -1; + } if (parse_date(buf, &date_buf) == 0) result = strtoul(date_buf.buf, NULL, 10); @@ -77,7 +79,7 @@ static void print_modtime(struct cgit_repo *repo) { time_t t; if (get_repo_modtime(repo, &t)) - cgit_print_age(t, -1, NULL); + cgit_print_age(t, 0, -1); } static int is_match(struct cgit_repo *repo) @@ -104,16 +106,38 @@ static int is_in_url(struct cgit_repo *repo) return 0; } +static int is_visible(struct cgit_repo *repo) +{ + if (repo->hide || repo->ignore) + return 0; + if (!(is_match(repo) && is_in_url(repo))) + return 0; + return 1; +} + +static int any_repos_visible(void) +{ + int i; + + for (i = 0; i < cgit_repolist.count; i++) { + if (is_visible(&cgit_repolist.repos[i])) + return 1; + } + return 0; +} + static void print_sort_header(const char *title, const char *sort) { + char *currenturl = cgit_currenturl(); html("%s", title); + free(currenturl); } static void print_header(void) @@ -160,27 +184,6 @@ static int cmp(const char *s1, const char *s2) return 0; } -static int sort_section(const void *a, const void *b) -{ - const struct cgit_repo *r1 = a; - const struct cgit_repo *r2 = b; - int result; - time_t t; - - result = cmp(r1->section, r2->section); - if (!result) { - if (!strcmp(ctx.cfg.repository_sort, "age")) { - // get_repo_modtime caches the value in r->mtime, so we don't - // have to worry about inefficiencies here. - if (get_repo_modtime(r1, &t) && get_repo_modtime(r2, &t)) - result = r2->mtime - r1->mtime; - } - if (!result) - result = cmp(r1->name, r2->name); - } - return result; -} - static int sort_name(const void *a, const void *b) { const struct cgit_repo *r1 = a; @@ -217,6 +220,22 @@ static int sort_idle(const void *a, const void *b) return t2 - t1; } +static int sort_section(const void *a, const void *b) +{ + const struct cgit_repo *r1 = a; + const struct cgit_repo *r2 = b; + int result; + + result = cmp(r1->section, r2->section); + if (!result) { + if (!strcmp(ctx.cfg.repository_sort, "age")) + result = sort_idle(r1, r2); + if (!result) + result = cmp(r1->name, r2->name); + } + return result; +} + struct sortcolumn { const char *name; int (*fn)(const void *a, const void *b); @@ -251,8 +270,14 @@ void cgit_print_repolist(void) int i, columns = 3, hits = 0, header = 0; char *last_section = NULL; char *section; + char *repourl; int sorted = 0; + if (!any_repos_visible()) { + cgit_print_error_page(404, "Not found", "No repositories found"); + return; + } + if (ctx.cfg.enable_index_links) ++columns; if (ctx.cfg.enable_index_owner) @@ -274,9 +299,7 @@ void cgit_print_repolist(void) html(""); for (i = 0; i < cgit_repolist.count; i++) { ctx.repo = &cgit_repolist.repos[i]; - if (ctx.repo->hide || ctx.repo->ignore) - continue; - if (!(is_match(ctx.repo) && is_in_url(ctx.repo))) + if (!is_visible(ctx.repo)) continue; hits++; if (hits <= ctx.qry.ofs) @@ -293,7 +316,7 @@ void cgit_print_repolist(void) (last_section != NULL && section == NULL) || (last_section != NULL && section != NULL && strcmp(section, last_section)))) { - htmlf(""); @@ -303,8 +326,11 @@ void cgit_print_repolist(void) !sorted && section ? "sublevel-repo" : "toplevel-repo"); cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL); html("\n"); } html("
", + htmlf("
", columns); html_txt(section); html("
"); - html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL); - html_ntxt(ctx.cfg.max_repodesc_len, ctx.repo->desc); + repourl = cgit_repourl(ctx.repo->url); + html_link_open(repourl, NULL, NULL); + free(repourl); + if (html_ntxt(ctx.repo->desc, ctx.cfg.max_repodesc_len) < 0) + html("..."); html_link_close(); html(""); if (ctx.cfg.enable_index_owner) { @@ -313,13 +339,15 @@ void cgit_print_repolist(void) html_txt(ctx.repo->owner); cgit_close_filter(ctx.repo->owner_filter); } else { + char *currenturl = cgit_currenturl(); html(""); html_txt(ctx.repo->owner); html(""); + free(currenturl); } html(""); } @@ -336,9 +364,7 @@ void cgit_print_repolist(void) html("
"); - if (!hits) - cgit_print_error("No repositories found"); - else if (hits > ctx.cfg.max_repo_count) + if (hits > ctx.cfg.max_repo_count) print_pager(hits, ctx.cfg.max_repo_count, ctx.qry.search, ctx.qry.sort); cgit_print_docend(); }