diff options
| -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
| @@ -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, ...)  { @@ -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, ...); @@ -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), | 
