aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Hjemli2008-04-28 12:10:13 +0200
committerLars Hjemli2008-04-28 12:10:13 +0200
commit9000bbf865cb3578ba5ed3810dc44253cb46ec7f (patch)
treea9917628c40301862d1b1d6f5ecaf803ecc0f714
parent939d32fda70ea66c9db51687beb3cea6da7b0599 (diff)
downloadcgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.tar.gz
cgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.tar.bz2
cgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.zip
Add page 'ls_cache'
This new page will list all entries found in the current cache, which is useful when reviewing the new cache implementation. There are no links to the new page, but it's reachable by adding 'p=ls_cache' to any cgit url. Signed-off-by: Lars Hjemli <hjemli@gmail.com>
-rw-r--r--cache.c68
-rw-r--r--cache.h3
-rw-r--r--cmd.c21
3 files changed, 87 insertions, 5 deletions
diff --git a/cache.c b/cache.c
index e590d7b..b701e13 100644
--- a/cache.c
+++ b/cache.c
@@ -332,6 +332,74 @@ int cache_process(int size, const char *path, const char *key, int ttl,
332 return process_slot(&slot); 332 return process_slot(&slot);
333} 333}
334 334
335/* Return a strftime formatted date/time
336 * NB: the result from this function is to shared memory
337 */
338char *sprintftime(const char *format, time_t time)
339{
340 static char buf[64];
341 struct tm *tm;
342
343 if (!time)
344 return NULL;
345 tm = gmtime(&time);
346 strftime(buf, sizeof(buf)-1, format, tm);
347 return buf;
348}
349
350int cache_ls(const char *path)
351{
352 DIR *dir;
353 struct dirent *ent;
354 int err = 0;
355 struct cache_slot slot;
356 char fullname[1024];
357 char *name;
358
359 if (!path) {
360 cache_log("[cgit] cache path not specified\n");
361 return -1;
362 }
363 if (strlen(path) > 1024 - 10) {
364 cache_log("[cgit] cache path too long: %s\n",
365 path);
366 return -1;
367 }
368 dir = opendir(path);
369 if (!dir) {
370 err = errno;
371 cache_log("[cgit] unable to open path %s: %s (%d)\n",
372 path, strerror(err), err);
373 return err;
374 }
375 strcpy(fullname, path);
376 name = fullname + strlen(path);
377 if (*(name - 1) != '/') {
378 *name++ = '/';
379 *name = '\0';
380 }
381 slot.cache_name = fullname;
382 while((ent = readdir(dir)) != NULL) {
383 if (strlen(ent->d_name) != 8)
384 continue;
385 strcpy(name, ent->d_name);
386 if ((err = open_slot(&slot)) != 0) {
387 cache_log("[cgit] unable to open path %s: %s (%d)\n",
388 fullname, strerror(err), err);
389 continue;
390 }
391 printf("%s %s %10lld %s\n",
392 name,
393 sprintftime("%Y-%m-%d %H:%M:%S",
394 slot.cache_st.st_mtime),
395 slot.cache_st.st_size,
396 slot.buf);
397 close_slot(&slot);
398 }
399 closedir(dir);
400 return 0;
401}
402
335/* Print a message to stdout */ 403/* Print a message to stdout */
336void cache_log(const char *format, ...) 404void cache_log(const char *format, ...)
337{ 405{
diff --git a/cache.h b/cache.h
index 5f2178d..66cc41f 100644
--- a/cache.h
+++ b/cache.h
@@ -26,6 +26,9 @@ extern int cache_process(int size, const char *path, const char *key, int ttl,
26 cache_fill_fn fn, void *cbdata); 26 cache_fill_fn fn, void *cbdata);
27 27
28 28
29/* List info about all cache entries on stdout */
30extern int cache_ls(const char *path);
31
29/* Print a message to stdout */ 32/* Print a message to stdout */
30extern void cache_log(const char *format, ...); 33extern void cache_log(const char *format, ...);
31 34
diff --git a/cmd.c b/cmd.c
index e0eacbe..07f4707 100644
--- a/cmd.c
+++ b/cmd.c
@@ -8,6 +8,8 @@
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "cmd.h" 10#include "cmd.h"
11#include "cache.h"
12#include "ui-shared.h"
11#include "ui-blob.h" 13#include "ui-blob.h"
12#include "ui-commit.h" 14#include "ui-commit.h"
13#include "ui-diff.h" 15#include "ui-diff.h"
@@ -35,17 +37,25 @@ static void diff_fn(struct cgit_context *ctx)
35 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); 37 cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path);
36} 38}
37 39
38static void repolist_fn(struct cgit_context *ctx)
39{
40 cgit_print_repolist();
41}
42
43static void log_fn(struct cgit_context *ctx) 40static void log_fn(struct cgit_context *ctx)
44{ 41{
45 cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, 42 cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count,
46 ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); 43 ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1);
47} 44}
48 45
46static void ls_cache_fn(struct cgit_context *ctx)
47{
48 ctx->page.mimetype = "text/plain";
49 ctx->page.filename = "ls-cache.txt";
50 cgit_print_http_headers(ctx);
51 cache_ls(ctx->cfg.cache_root);
52}
53
54static void repolist_fn(struct cgit_context *ctx)
55{
56 cgit_print_repolist();
57}
58
49static void patch_fn(struct cgit_context *ctx) 59static void patch_fn(struct cgit_context *ctx)
50{ 60{
51 cgit_print_patch(ctx->qry.sha1); 61 cgit_print_patch(ctx->qry.sha1);
@@ -88,6 +98,7 @@ struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
88 def_cmd(commit, 1, 1), 98 def_cmd(commit, 1, 1),
89 def_cmd(diff, 1, 1), 99 def_cmd(diff, 1, 1),
90 def_cmd(log, 1, 1), 100 def_cmd(log, 1, 1),
101 def_cmd(ls_cache, 0, 0),
91 def_cmd(patch, 1, 0), 102 def_cmd(patch, 1, 0),
92 def_cmd(refs, 1, 1), 103 def_cmd(refs, 1, 1),
93 def_cmd(repolist, 0, 0), 104 def_cmd(repolist, 0, 0),