X-Git-Url: https://git.cameronkatri.com/cgit.git/blobdiff_plain/5c5d189635287a3bfaa1a4aef133dc0c582a27c2..71926bfb342b75a6721441b1fe9b9db8b50775d5:/ui-shared.c diff --git a/ui-shared.c b/ui-shared.c index c398d7a..31224bc 100644 --- a/ui-shared.c +++ b/ui-shared.c @@ -23,7 +23,7 @@ static char *http_date(time_t t) "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; struct tm *tm = gmtime(&t); return fmt("%s, %02d %s %04d %02d:%02d:%02d GMT", day[tm->tm_wday], - tm->tm_mday, month[tm->tm_mon], 1900+tm->tm_year, + tm->tm_mday, month[tm->tm_mon], 1900 + tm->tm_year, tm->tm_hour, tm->tm_min, tm->tm_sec); } @@ -83,7 +83,7 @@ char *cgit_fileurl(const char *reponame, const char *pagename, } else { tmp = fmt("?url=%s/%s/%s", reponame, pagename, (filename ? filename : "")); - delim = "&"; + delim = "&"; } if (query) tmp = fmt("%s%s%s", tmp, delim, query); @@ -93,7 +93,7 @@ char *cgit_fileurl(const char *reponame, const char *pagename, char *cgit_pageurl(const char *reponame, const char *pagename, const char *query) { - return cgit_fileurl(reponame,pagename,0,query); + return cgit_fileurl(reponame, pagename, 0, query); } const char *cgit_repobasename(const char *reponame) @@ -102,38 +102,26 @@ const char *cgit_repobasename(const char *reponame) static char rvbuf[1024]; int p; const char *rv; - strncpy(rvbuf,reponame,sizeof(rvbuf)); - if(rvbuf[sizeof(rvbuf)-1]) + strncpy(rvbuf, reponame, sizeof(rvbuf)); + if (rvbuf[sizeof(rvbuf)-1]) die("cgit_repobasename: truncated repository name '%s'", reponame); p = strlen(rvbuf)-1; /* strip trailing slashes */ - while(p && rvbuf[p]=='/') rvbuf[p--]=0; + while (p && rvbuf[p] == '/') rvbuf[p--] = 0; /* strip trailing .git */ - if(p>=3 && !strncmp(&rvbuf[p-3],".git",4)) { + if (p >= 3 && !strncmp(&rvbuf[p-3], ".git", 4)) { p -= 3; rvbuf[p--] = 0; } /* strip more trailing slashes if any */ - while( p && rvbuf[p]=='/') rvbuf[p--]=0; + while ( p && rvbuf[p] == '/') rvbuf[p--] = 0; /* find last slash in the remaining string */ rv = strrchr(rvbuf,'/'); - if(rv) + if (rv) return ++rv; return rvbuf; } -char *cgit_currurl() -{ - if (!ctx.cfg.virtual_root) - return ctx.cfg.script_name; - else if (ctx.qry.page) - return fmt("%s/%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo, ctx.qry.page); - else if (ctx.qry.repo) - return fmt("%s/%s/", ctx.cfg.virtual_root, ctx.qry.repo); - else - return fmt("%s/", ctx.cfg.virtual_root); -} - -static void site_url(const char *page, const char *search, int ofs) +static void site_url(const char *page, const char *search, const char *sort, int ofs) { char *delim = "?"; @@ -146,13 +134,19 @@ static void site_url(const char *page, const char *search, int ofs) if (page) { htmlf("?p=%s", page); - delim = "&"; + delim = "&"; } if (search) { html(delim); html("q="); html_attr(search); - delim = "&"; + delim = "&"; + } + if (sort) { + html(delim); + html("s="); + html_attr(sort); + delim = "&"; } if (ofs) { html(delim); @@ -161,7 +155,7 @@ static void site_url(const char *page, const char *search, int ofs) } static void site_link(const char *page, const char *name, const char *title, - const char *class, const char *search, int ofs) + const char *class, const char *search, const char *sort, int ofs) { html(""); html_txt(name); html(""); } void cgit_index_link(const char *name, const char *title, const char *class, - const char *pattern, int ofs) + const char *pattern, const char *sort, int ofs) { - site_link(NULL, name, title, class, pattern, ofs); + site_link(NULL, name, title, class, pattern, sort, ofs); } static char *repolink(const char *title, const char *class, const char *page, @@ -288,17 +282,17 @@ void cgit_log_link(const char *name, const char *title, const char *class, char *delim; delim = repolink(title, class, "log", head, path); - if (rev && strcmp(rev, ctx.qry.head)) { + if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_url_arg(rev); - delim = "&"; + delim = "&"; } if (grep && pattern) { html(delim); html("qt="); html_url_arg(grep); - delim = "&"; + delim = "&"; html(delim); html("q="); html_url_arg(pattern); @@ -307,7 +301,7 @@ void cgit_log_link(const char *name, const char *title, const char *class, html(delim); html("ofs="); htmlf("%d", ofs); - delim = "&"; + delim = "&"; } if (showmsg) { html(delim); @@ -332,7 +326,7 @@ void cgit_commit_link(char *name, const char *title, const char *class, char *delim; delim = repolink(title, class, "commit", head, path); - if (rev && strcmp(rev, ctx.qry.head)) { + if (rev && ctx.qry.head && strcmp(rev, ctx.qry.head)) { html(delim); html("id="); html_url_arg(rev); @@ -349,8 +343,16 @@ void cgit_commit_link(char *name, const char *title, const char *class, htmlf("%d", ctx.qry.context); delim = "&"; } + if (ctx.qry.ignorews) { + html(delim); + html("ignorews=1"); + delim = "&"; + } html("'>"); - html_txt(name); + if (name[0] != '\0') + html_txt(name); + else + html_txt("(no commit message)"); html(""); } @@ -397,6 +399,11 @@ void cgit_diff_link(const char *name, const char *title, const char *class, htmlf("%d", ctx.qry.context); delim = "&"; } + if (ctx.qry.ignorews) { + html(delim); + html("ignorews=1"); + delim = "&"; + } html("'>"); html_txt(name); html(""); @@ -414,11 +421,11 @@ 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) +static 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, + return cgit_index_link(name, title, class, ctx->qry.search, ctx->qry.sort, ctx->qry.ofs); else if (!strcmp(ctx->qry.page, "summary")) return cgit_summary_link(name, title, class, ctx->qry.head); @@ -480,7 +487,7 @@ void cgit_object_link(struct object *obj) shortrev = xstrdup(fullrev); shortrev[10] = '\0'; if (obj->type == OBJ_COMMIT) { - cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, + cgit_commit_link(fmt("commit %s...", shortrev), NULL, NULL, ctx.qry.head, fullrev, NULL, 0); return; } else if (obj->type == OBJ_TREE) @@ -493,6 +500,63 @@ void cgit_object_link(struct object *obj) reporevlink(page, name, NULL, NULL, ctx.qry.head, fullrev, NULL); } +static struct string_list_item *lookup_path(struct string_list *list, + const char *path) +{ + struct string_list_item *item; + + while (path && path[0]) { + if ((item = string_list_lookup(list, path))) + return item; + if (!(path = strchr(path, '/'))) + break; + path++; + } + return NULL; +} + +void cgit_submodule_link(const char *class, char *path, const char *rev) +{ + struct string_list *list; + struct string_list_item *item; + char tail, *dir; + size_t len; + + tail = 0; + list = &ctx.repo->submodules; + item = lookup_path(list, path); + if (!item) { + len = strlen(path); + tail = path[len - 1]; + if (tail == '/') { + path[len - 1] = 0; + item = lookup_path(list, path); + } + } + html("util, rev)); + } else if (ctx.repo->module_link) { + dir = strrchr(path, '/'); + if (dir) + dir++; + else + dir = path; + html_attr(fmt(ctx.repo->module_link, dir, rev)); + } else { + html("#"); + } + html("'>"); + html_txt(path); + html(""); + html_txt(fmt(" @ %.7s", rev)); + if (item && tail) + path[len - 1] = tail; +} + void cgit_print_date(time_t secs, const char *format, int local_time) { char buf[64]; @@ -500,7 +564,7 @@ void cgit_print_date(time_t secs, const char *format, int local_time) if (!secs) return; - if(local_time) + if (local_time) time = localtime(&secs); else time = gmtime(&secs); @@ -564,7 +628,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); @@ -603,7 +667,7 @@ void cgit_print_docstart(struct cgit_context *ctx) html_attr(ctx->cfg.favicon); html("'/>\n"); } - if (host && ctx->repo) { + if (host && ctx->repo && ctx->qry.head) { html("\n"); html("