ui-repolist: Case insensitive sorting and age sort

Add two options, one for doing the ordinary name sorts in a
case-insensitive manner, and another for choosing to sort repos in each
section by age instead of by name.
This commit is contained in:
Jason A. Donenfeld 2012-07-12 19:13:39 +02:00
parent fc9181ff3d
commit 184c5655b2
4 changed files with 37 additions and 5 deletions

6
cgit.c
View File

@ -199,6 +199,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.cache_static_ttl = atoi(value); ctx.cfg.cache_static_ttl = atoi(value);
else if (!strcmp(name, "cache-dynamic-ttl")) else if (!strcmp(name, "cache-dynamic-ttl"))
ctx.cfg.cache_dynamic_ttl = atoi(value); ctx.cfg.cache_dynamic_ttl = atoi(value);
else if (!strcmp(name, "case-sensitive-sort"))
ctx.cfg.case_sensitive_sort = atoi(value);
else if (!strcmp(name, "about-filter")) else if (!strcmp(name, "about-filter"))
ctx.cfg.about_filter = new_filter(value, ABOUT); ctx.cfg.about_filter = new_filter(value, ABOUT);
else if (!strcmp(name, "commit-filter")) else if (!strcmp(name, "commit-filter"))
@ -231,6 +233,8 @@ void config_cb(const char *name, const char *value)
ctx.cfg.scan_hidden_path = atoi(value); ctx.cfg.scan_hidden_path = atoi(value);
else if (!strcmp(name, "section-from-path")) else if (!strcmp(name, "section-from-path"))
ctx.cfg.section_from_path = atoi(value); ctx.cfg.section_from_path = atoi(value);
else if (!strcmp(name, "section-sort"))
ctx.cfg.section_sort = xstrdup(value);
else if (!strcmp(name, "source-filter")) else if (!strcmp(name, "source-filter"))
ctx.cfg.source_filter = new_filter(value, SOURCE); ctx.cfg.source_filter = new_filter(value, SOURCE);
else if (!strcmp(name, "summary-log")) else if (!strcmp(name, "summary-log"))
@ -335,6 +339,7 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.cache_root_ttl = 5; ctx->cfg.cache_root_ttl = 5;
ctx->cfg.cache_scanrc_ttl = 15; ctx->cfg.cache_scanrc_ttl = 15;
ctx->cfg.cache_static_ttl = -1; ctx->cfg.cache_static_ttl = -1;
ctx->cfg.case_sensitive_sort = 1;
ctx->cfg.css = "/cgit.css"; ctx->cfg.css = "/cgit.css";
ctx->cfg.logo = "/cgit.png"; ctx->cfg.logo = "/cgit.png";
ctx->cfg.local_time = 0; ctx->cfg.local_time = 0;
@ -359,6 +364,7 @@ static void prepare_context(struct cgit_context *ctx)
ctx->cfg.scan_hidden_path = 0; ctx->cfg.scan_hidden_path = 0;
ctx->cfg.script_name = CGIT_SCRIPT_NAME; ctx->cfg.script_name = CGIT_SCRIPT_NAME;
ctx->cfg.section = ""; ctx->cfg.section = "";
ctx->cfg.section_sort = "name";
ctx->cfg.summary_branches = 10; ctx->cfg.summary_branches = 10;
ctx->cfg.summary_log = 10; ctx->cfg.summary_log = 10;
ctx->cfg.summary_tags = 10; ctx->cfg.summary_tags = 10;

2
cgit.h
View File

@ -187,6 +187,7 @@ struct cgit_config {
char *root_readme; char *root_readme;
char *script_name; char *script_name;
char *section; char *section;
char *section_sort;
char *virtual_root; char *virtual_root;
char *strict_export; char *strict_export;
int cache_size; int cache_size;
@ -196,6 +197,7 @@ struct cgit_config {
int cache_root_ttl; int cache_root_ttl;
int cache_scanrc_ttl; int cache_scanrc_ttl;
int cache_static_ttl; int cache_static_ttl;
int case_sensitive_sort;
int embedded; int embedded;
int enable_filter_overrides; int enable_filter_overrides;
int enable_gitweb_owner; int enable_gitweb_owner;

View File

@ -70,6 +70,10 @@ cache-static-ttl::
version of repository pages accessed with a fixed SHA1. Default value: version of repository pages accessed with a fixed SHA1. Default value:
"5". "5".
case-sensitive-sort::
Sort items in the repo list case sensitively. Default value: "1".
See also: section-sort.
clone-prefix:: clone-prefix::
Space-separated list of common prefixes which, when combined with a Space-separated list of common prefixes which, when combined with a
repository url, generates valid clone urls for the repository. This repository url, generates valid clone urls for the repository. This
@ -333,11 +337,17 @@ section::
after this option will inherit the current section name. Default value: after this option will inherit the current section name. Default value:
none. none.
section-sort::
The way in which repositories in each section are sorted. Valid values
are "name" for sorting by the repo name or "age" for sorting by the
most recently updated repository. Default value: "name". See also:
section, case-sensitive-sort.
section-from-path:: section-from-path::
A number which, if specified before scan-path, specifies how many A number which, if specified before scan-path, specifies how many
path elements from each repo path to use as a default section name. path elements from each repo path to use as a default section name.
If negative, cgit will discard the specified number of path elements If negative, cgit will discard the specified number of path elements
above the repo directory. Default value: 0. above the repo directory. Default value: "0".
side-by-side-diffs:: side-by-side-diffs::
If set to "1" shows side-by-side diffs instead of unidiffs per If set to "1" shows side-by-side diffs instead of unidiffs per

View File

@ -9,6 +9,7 @@
#include "cgit.h" #include "cgit.h"
#include "html.h" #include "html.h"
#include "ui-shared.h" #include "ui-shared.h"
#include <strings.h>
time_t read_agefile(char *path) time_t read_agefile(char *path)
{ {
@ -131,8 +132,12 @@ void print_pager(int items, int pagelen, char *search, char *sort)
static int cmp(const char *s1, const char *s2) static int cmp(const char *s1, const char *s2)
{ {
if (s1 && s2) if (s1 && s2) {
return strcmp(s1, s2); if (ctx.cfg.case_sensitive_sort)
return strcmp(s1, s2);
else
return strcasecmp(s1, s2);
}
if (s1 && !s2) if (s1 && !s2)
return -1; return -1;
if (s2 && !s1) if (s2 && !s1)
@ -145,10 +150,19 @@ static int sort_section(const void *a, const void *b)
const struct cgit_repo *r1 = a; const struct cgit_repo *r1 = a;
const struct cgit_repo *r2 = b; const struct cgit_repo *r2 = b;
int result; int result;
time_t t;
result = cmp(r1->section, r2->section); result = cmp(r1->section, r2->section);
if (!result) if (!result) {
result = cmp(r1->name, r2->name); if (!strcmp(ctx.cfg.section_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; return result;
} }