* (see COPYING for full license text)
*/
-/* This is needed for strcasestr to be defined by <string.h> */
-#define _GNU_SOURCE 1
-#include <string.h>
-
-#include <time.h>
-
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
if (readfile(path, &buf, &size))
return -1;
- if (parse_date(buf, buf2, sizeof(buf2)))
+ if (parse_date(buf, buf2, sizeof(buf2)) > 0)
result = strtoul(buf2, NULL, 10);
else
result = 0;
}
path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
- if (stat(path, &s) == 0)
+ if (stat(path, &s) == 0) {
*mtime = s.st_mtime;
- else
- *mtime = 0;
+ r->mtime = *mtime;
+ return 1;
+ }
+ path = fmt("%s/%s", repo->path, "packed-refs");
+ if (stat(path, &s) == 0) {
+ *mtime = s.st_mtime;
+ r->mtime = *mtime;
+ return 1;
+ }
+
+ *mtime = 0;
r->mtime = *mtime;
return (r->mtime != 0);
}
void print_sort_header(const char *title, const char *sort)
{
- htmlf("<th class='left'><a href='./?s=%s", sort);
+ htmlf("<th class='left'><a href='%s?s=%s", cgit_rooturl(), sort);
if (ctx.qry.search) {
html("&q=");
html_url_arg(ctx.qry.search);
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;
+
+ result = cmp(r1->section, r2->section);
+ 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;
};
struct sortcolumn sortcolumn[] = {
+ {"section", sort_section},
{"name", sort_name},
{"desc", sort_desc},
{"owner", sort_owner},
void cgit_print_repolist()
{
int i, columns = 4, hits = 0, header = 0;
- char *last_group = NULL;
+ char *last_section = NULL;
+ char *section;
int sorted = 0;
if (ctx.cfg.enable_index_links)
if(ctx.qry.sort)
sorted = sort_repolist(ctx.qry.sort);
+ else
+ sort_repolist("section");
html("<table summary='repository list' class='list nowrap'>");
for (i=0; i<cgit_repolist.count; i++) {
continue;
if (!header++)
print_header(columns);
+ section = ctx.repo->section;
+ if (section && !strcmp(section, ""))
+ section = NULL;
if (!sorted &&
- ((last_group == NULL && ctx.repo->group != NULL) ||
- (last_group != NULL && ctx.repo->group == NULL) ||
- (last_group != NULL && ctx.repo->group != NULL &&
- strcmp(ctx.repo->group, last_group)))) {
- htmlf("<tr class='nohover'><td colspan='%d' class='repogroup'>",
+ ((last_section == NULL && section != NULL) ||
+ (last_section != NULL && section == NULL) ||
+ (last_section != NULL && section != NULL &&
+ strcmp(section, last_section)))) {
+ htmlf("<tr class='nohover'><td colspan='%d' class='reposection'>",
columns);
- html_txt(ctx.repo->group);
+ html_txt(section);
html("</td></tr>");
- last_group = ctx.repo->group;
+ last_section = section;
}
htmlf("<tr><td class='%s'>",
- !sorted && ctx.repo->group ? "sublevel-repo" : "toplevel-repo");
+ !sorted && section ? "sublevel-repo" : "toplevel-repo");
cgit_summary_link(ctx.repo->name, ctx.repo->name, NULL, NULL);
html("</td><td>");
html_link_open(cgit_repourl(ctx.repo->url), NULL, NULL);