diff options
| author | Jason A. Donenfeld | 2017-03-30 13:19:50 +0200 |
|---|---|---|
| committer | Jason A. Donenfeld | 2017-03-30 13:19:54 +0200 |
| commit | 87c47488d02fcace4da0d468cd9ddd1651b7949e (patch) | |
| tree | 845fb40484a1f98e8da1038febc9b975172cb7ee | |
| parent | be39d22328f841536b8e44e8aaeed80a74ebb353 (diff) | |
| download | cgit-87c47488d02fcace4da0d468cd9ddd1651b7949e.tar.gz cgit-87c47488d02fcace4da0d468cd9ddd1651b7949e.tar.bz2 cgit-87c47488d02fcace4da0d468cd9ddd1651b7949e.zip | |
ui-repolist: properly sort by age
When empty repos exist, comparing them against an existing repo with a
good mtime might, with particular qsort implementations, not sort
correctly, because of this brokenness:
if (get_repo_modtime(r1, &t) && get_repo_modtime(r2, &t))
However, sorting by the age column works as expected, so anyway, to tidy
things up, we simply reuse that function.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
| -rw-r--r-- | ui-repolist.c | 38 |
1 files changed, 17 insertions, 21 deletions
diff --git a/ui-repolist.c b/ui-repolist.c index b57ea60..20a4f56 100644 --- a/ui-repolist.c +++ b/ui-repolist.c | |||
| @@ -184,27 +184,6 @@ static int cmp(const char *s1, const char *s2) | |||
| 184 | return 0; | 184 | return 0; |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | static int sort_section(const void *a, const void *b) | ||
| 188 | { | ||
| 189 | const struct cgit_repo *r1 = a; | ||
| 190 | const struct cgit_repo *r2 = b; | ||
| 191 | int result; | ||
| 192 | time_t t; | ||
| 193 | |||
| 194 | result = cmp(r1->section, r2->section); | ||
| 195 | if (!result) { | ||
| 196 | if (!strcmp(ctx.cfg.repository_sort, "age")) { | ||
| 197 | // get_repo_modtime caches the value in r->mtime, so we don't | ||
| 198 | // have to worry about inefficiencies here. | ||
| 199 | if (get_repo_modtime(r1, &t) && get_repo_modtime(r2, &t)) | ||
| 200 | result = r2->mtime - r1->mtime; | ||
| 201 | } | ||
| 202 | if (!result) | ||
| 203 | result = cmp(r1->name, r2->name); | ||
| 204 | } | ||
| 205 | return result; | ||
| 206 | } | ||
| 207 | |||
| 208 | static int sort_name(const void *a, const void *b) | 187 | static int sort_name(const void *a, const void *b) |
| 209 | { | 188 | { |
| 210 | const struct cgit_repo *r1 = a; | 189 | const struct cgit_repo *r1 = a; |
| @@ -241,6 +220,23 @@ static int sort_idle(const void *a, const void *b) | |||
| 241 | return t2 - t1; | 220 | return t2 - t1; |
| 242 | } | 221 | } |
| 243 | 222 | ||
| 223 | static int sort_section(const void *a, const void *b) | ||
| 224 | { | ||
| 225 | const struct cgit_repo *r1 = a; | ||
| 226 | const struct cgit_repo *r2 = b; | ||
| 227 | int result; | ||
| 228 | time_t t; | ||
| 229 | |||
| 230 | result = cmp(r1->section, r2->section); | ||
| 231 | if (!result) { | ||
| 232 | if (!strcmp(ctx.cfg.repository_sort, "age")) | ||
| 233 | result = sort_idle(r1, r2); | ||
| 234 | if (!result) | ||
| 235 | result = cmp(r1->name, r2->name); | ||
| 236 | } | ||
| 237 | return result; | ||
| 238 | } | ||
| 239 | |||
| 244 | struct sortcolumn { | 240 | struct sortcolumn { |
| 245 | const char *name; | 241 | const char *name; |
| 246 | int (*fn)(const void *a, const void *b); | 242 | int (*fn)(const void *a, const void *b); |
