]> git.cameronkatri.com Git - cgit.git/commitdiff
Add page 'ls_cache'
authorLars Hjemli <hjemli@gmail.com>
Mon, 28 Apr 2008 10:10:13 +0000 (12:10 +0200)
committerLars Hjemli <hjemli@gmail.com>
Mon, 28 Apr 2008 10:10:13 +0000 (12:10 +0200)
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>
cache.c
cache.h
cmd.c

diff --git a/cache.c b/cache.c
index e590d7b52ad1ad5a3d23e92c90c6d425d52e8190..b701e13ded5a316c5ea432777ad33bd60fde653c 100644 (file)
--- 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 5f2178deec5f1a93b2a6b002c495dfd4f7ca478a..66cc41fee4b925e482bd62a937110b5a79d71b1f 100644 (file)
--- 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 e0eacbe584a5e26120d7dde526a9552071042d91..07f4707e07633f3df07820704ecd9bfa03a03b27 100644 (file)
--- 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),