aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Hjemli <hjemli@gmail.com>2008-04-28 12:10:13 +0200
committerLars Hjemli <hjemli@gmail.com>2008-04-28 12:10:13 +0200
commit9000bbf865cb3578ba5ed3810dc44253cb46ec7f (patch)
treea9917628c40301862d1b1d6f5ecaf803ecc0f714
parent939d32fda70ea66c9db51687beb3cea6da7b0599 (diff)
downloadcgit-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.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,
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, ...)
{
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,
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, ...);
diff --git a/cmd.c b/cmd.c
index e0eacbe..07f4707 100644
--- a/cmd.c
+++ b/cmd.c
@@ -8,6 +8,8 @@
#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"
@@ -35,17 +37,25 @@ 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);
@@ -88,6 +98,7 @@ struct cgit_cmd *cgit_get_cmd(struct cgit_context *ctx)
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),