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);
else if (!strcmp(name, "cache-dynamic-ttl"))
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"))
ctx.cfg.about_filter = new_filter(value, ABOUT);
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);
else if (!strcmp(name, "section-from-path"))
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"))
ctx.cfg.source_filter = new_filter(value, SOURCE);
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_scanrc_ttl = 15;
ctx->cfg.cache_static_ttl = -1;
ctx->cfg.case_sensitive_sort = 1;
ctx->cfg.css = "/cgit.css";
ctx->cfg.logo = "/cgit.png";
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.script_name = CGIT_SCRIPT_NAME;
ctx->cfg.section = "";
ctx->cfg.section_sort = "name";
ctx->cfg.summary_branches = 10;
ctx->cfg.summary_log = 10;
ctx->cfg.summary_tags = 10;

2
cgit.h
View File

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

View File

@ -70,6 +70,10 @@ cache-static-ttl::
version of repository pages accessed with a fixed SHA1. Default value:
"5".
case-sensitive-sort::
Sort items in the repo list case sensitively. Default value: "1".
See also: section-sort.
clone-prefix::
Space-separated list of common prefixes which, when combined with a
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:
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::
A number which, if specified before scan-path, specifies how many
path elements from each repo path to use as a default section name.
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::
If set to "1" shows side-by-side diffs instead of unidiffs per

View File

@ -9,6 +9,7 @@
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
#include <strings.h>
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)
{
if (s1 && s2)
return strcmp(s1, s2);
if (s1 && s2) {
if (ctx.cfg.case_sensitive_sort)
return strcmp(s1, s2);
else
return strcasecmp(s1, s2);
}
if (s1 && !s2)
return -1;
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 *r2 = b;
int result;
time_t t;
result = cmp(r1->section, r2->section);
if (!result)
result = cmp(r1->name, r2->name);
if (!result) {
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;
}