aboutsummaryrefslogtreecommitdiff
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),