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); |