about summary refs log tree commit diff
diff options
context:
space:
mode:
-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),