author | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 10:10:13 (UTC) |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2008-04-28 10:10:13 (UTC) |
commit | 9000bbf865cb3578ba5ed3810dc44253cb46ec7f (patch) (side-by-side diff) | |
tree | a9917628c40301862d1b1d6f5ecaf803ecc0f714 | |
parent | 939d32fda70ea66c9db51687beb3cea6da7b0599 (diff) | |
download | cgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.zip cgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.tar.gz cgit-9000bbf865cb3578ba5ed3810dc44253cb46ec7f.tar.bz2 |
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.c | 68 | ||||
-rw-r--r-- | cache.h | 3 | ||||
-rw-r--r-- | cmd.c | 21 |
3 files changed, 87 insertions, 5 deletions
@@ -323,21 +323,89 @@ int cache_process(int size, const char *path, const char *key, int ttl, strcpy(lockname, filename); strcpy(lockname + len, ".lock"); slot.fn = fn; slot.cbdata = cbdata; slot.ttl = ttl; slot.cache_name = filename; slot.lock_name = lockname; slot.key = key; slot.keylen = strlen(key); return process_slot(&slot); } +/* Return a strftime formatted date/time + * NB: the result from this function is to shared memory + */ +char *sprintftime(const char *format, time_t time) +{ + static char buf[64]; + struct tm *tm; + + if (!time) + return NULL; + tm = gmtime(&time); + strftime(buf, sizeof(buf)-1, format, tm); + return buf; +} + +int cache_ls(const char *path) +{ + DIR *dir; + struct dirent *ent; + int err = 0; + struct cache_slot slot; + char fullname[1024]; + char *name; + + if (!path) { + cache_log("[cgit] cache path not specified\n"); + return -1; + } + if (strlen(path) > 1024 - 10) { + cache_log("[cgit] cache path too long: %s\n", + path); + return -1; + } + dir = opendir(path); + if (!dir) { + err = errno; + cache_log("[cgit] unable to open path %s: %s (%d)\n", + path, strerror(err), err); + return err; + } + strcpy(fullname, path); + name = fullname + strlen(path); + if (*(name - 1) != '/') { + *name++ = '/'; + *name = '\0'; + } + slot.cache_name = fullname; + while((ent = readdir(dir)) != NULL) { + if (strlen(ent->d_name) != 8) + continue; + strcpy(name, ent->d_name); + if ((err = open_slot(&slot)) != 0) { + cache_log("[cgit] unable to open path %s: %s (%d)\n", + fullname, strerror(err), err); + continue; + } + printf("%s %s %10lld %s\n", + name, + sprintftime("%Y-%m-%d %H:%M:%S", + slot.cache_st.st_mtime), + slot.cache_st.st_size, + slot.buf); + close_slot(&slot); + } + closedir(dir); + return 0; +} + /* Print a message to stdout */ void cache_log(const char *format, ...) { va_list args; va_start(args, format); vfprintf(stderr, format, args); va_end(args); } @@ -17,16 +17,19 @@ typedef void (*cache_fill_fn)(void *cbdata); * key the key used to lookup cache files * ttl max cache time in seconds for this key * fn content generator function for this key * cbdata user-supplied data to the content generator function * * Return value * 0 indicates success, everyting else is an error */ extern int cache_process(int size, const char *path, const char *key, int ttl, cache_fill_fn fn, void *cbdata); +/* List info about all cache entries on stdout */ +extern int cache_ls(const char *path); + /* Print a message to stdout */ extern void cache_log(const char *format, ...); #endif /* CGIT_CACHE_H */ @@ -1,22 +1,24 @@ /* cmd.c: the cgit command dispatcher * * Copyright (C) 2008 Lars Hjemli * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include "cgit.h" #include "cmd.h" +#include "cache.h" +#include "ui-shared.h" #include "ui-blob.h" #include "ui-commit.h" #include "ui-diff.h" #include "ui-log.h" #include "ui-patch.h" #include "ui-refs.h" #include "ui-repolist.h" #include "ui-snapshot.h" #include "ui-summary.h" #include "ui-tag.h" #include "ui-tree.h" @@ -26,35 +28,43 @@ static void blob_fn(struct cgit_context *ctx) } static void commit_fn(struct cgit_context *ctx) { cgit_print_commit(ctx->qry.sha1); } static void diff_fn(struct cgit_context *ctx) { cgit_print_diff(ctx->qry.sha1, ctx->qry.sha2, ctx->qry.path); } -static void repolist_fn(struct cgit_context *ctx) -{ - cgit_print_repolist(); -} - static void log_fn(struct cgit_context *ctx) { cgit_print_log(ctx->qry.sha1, ctx->qry.ofs, ctx->cfg.max_commit_count, ctx->qry.grep, ctx->qry.search, ctx->qry.path, 1); } +static void ls_cache_fn(struct cgit_context *ctx) +{ + ctx->page.mimetype = "text/plain"; + ctx->page.filename = "ls-cache.txt"; + cgit_print_http_headers(ctx); + cache_ls(ctx->cfg.cache_root); +} + +static void repolist_fn(struct cgit_context *ctx) +{ + cgit_print_repolist(); +} + static void patch_fn(struct cgit_context *ctx) { cgit_print_patch(ctx->qry.sha1); } static void refs_fn(struct cgit_context *ctx) { cgit_print_refs(); } static void snapshot_fn(struct cgit_context *ctx) { @@ -79,24 +89,25 @@ static void tree_fn(struct cgit_context *ctx) } #define def_cmd(name, want_repo, want_layout) \ {#name, name##_fn, want_repo, want_layout} struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx) { static struct cgit_cmd cmds[] = { def_cmd(blob, 1, 0), def_cmd(commit, 1, 1), def_cmd(diff, 1, 1), def_cmd(log, 1, 1), + def_cmd(ls_cache, 0, 0), def_cmd(patch, 1, 0), def_cmd(refs, 1, 1), def_cmd(repolist, 0, 0), def_cmd(snapshot, 1, 0), def_cmd(summary, 1, 1), def_cmd(tag, 1, 1), def_cmd(tree, 1, 1), }; int i; if (ctx->qry.page == NULL) { if (ctx->repo) |