List for cgit developers and users
 help / color / mirror / Atom feed
From: fparent at baylibre.com (Fabien Parent)
Subject: [PATCH v2] ui-repolist: use latest branch modtime as Idle
Date: Thu, 29 Aug 2013 16:11:00 +0200	[thread overview]
Message-ID: <1377785460-14941-1-git-send-email-fparent@baylibre.com> (raw)
In-Reply-To: <20130822191922.GY2337@serenity.lan>

Instead of using the modtime of the master branch cgit now uses the modtime
of the latest updated branch. This option is disabled by default to avoid
performance hit on repository with many branches.
---
 cgit.c        |  3 +++
 cgit.h        |  1 +
 ui-repolist.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++-----------
 3 files changed, 65 insertions(+), 14 deletions(-)

diff --git a/cgit.c b/cgit.c
index 861352a..9d49f88 100644
--- a/cgit.c
+++ b/cgit.c
@@ -291,6 +291,8 @@ static void config_cb(const char *name, const char *value)
 		add_mimetype(name + 9, value);
 	else if (!strcmp(name, "include"))
 		parse_configfile(expand_macros(value), config_cb);
+	else if (!strcmp(name, "enable-branch-mod-time"))
+		ctx.cfg.enable_branch_mod_time = atoi(value);
 }
 
 static void querystring_cb(const char *name, const char *value)
@@ -351,6 +353,7 @@ static void prepare_context(struct cgit_context *ctx)
 {
 	memset(ctx, 0, sizeof(*ctx));
 	ctx->cfg.agefile = "info/web/last-modified";
+	ctx->cfg.enable_branch_mod_time = 0;
 	ctx->cfg.nocache = 0;
 	ctx->cfg.cache_size = 0;
 	ctx->cfg.cache_max_create_time = 5;
diff --git a/cgit.h b/cgit.h
index a474d77..ec12aad 100644
--- a/cgit.h
+++ b/cgit.h
@@ -238,6 +238,7 @@ struct cgit_config {
 	int ssdiff;
 	int branch_sort;
 	int commit_sort;
+	int enable_branch_mod_time;
 	struct string_list mimetypes;
 	struct cgit_filter *about_filter;
 	struct cgit_filter *commit_filter;
diff --git a/ui-repolist.c b/ui-repolist.c
index 2ab6e9e..78c1f45 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -13,6 +13,11 @@
 #include "ui-shared.h"
 #include <strings.h>
 
+struct branch_mod_time {
+	const struct cgit_repo *repo;
+	time_t mod_time;
+};
+
 static time_t read_agefile(char *path)
 {
 	time_t result;
@@ -31,11 +36,44 @@ static time_t read_agefile(char *path)
 	return result;
 }
 
+static int get_file_modtime(const char *const path, time_t *mtime)
+{
+	struct stat s;
+
+	if (stat(path, &s) == 0) {
+		*mtime = s.st_mtime;
+		return 1;
+	}
+
+	return 0;
+}
+
+static int get_branch_mod_time(const char *refname, const unsigned char *sha1,
+			       int flags, void *cb_data)
+{
+	time_t t;
+	struct branch_mod_time *rmt = (struct branch_mod_time*) cb_data;
+
+	if (get_file_modtime(sha1_file_name(sha1), &t)) {
+		rmt->mod_time = t > rmt->mod_time ? t : rmt->mod_time;
+		goto end;
+	}
+
+	if (get_file_modtime(sha1_pack_name(sha1), &t)) {
+		rmt->mod_time = t > rmt->mod_time ? t : rmt->mod_time;
+		goto end;
+	}
+
+end:
+	return 0;
+}
+
 static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
 {
 	struct strbuf path = STRBUF_INIT;
 	struct stat s;
 	struct cgit_repo *r = (struct cgit_repo *)repo;
+	struct branch_mod_time rmt = { .repo = repo };
 
 	if (repo->mtime != -1) {
 		*mtime = repo->mtime;
@@ -50,21 +88,30 @@ static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
 		}
 	}
 
-	strbuf_reset(&path);
-	strbuf_addf(&path, "%s/refs/heads/%s", repo->path,
-		    repo->defbranch ? repo->defbranch : "master");
-	if (stat(path.buf, &s) == 0) {
-		*mtime = s.st_mtime;
-		r->mtime = *mtime;
-		goto end;
-	}
+	if (ctx.cfg.enable_branch_mod_time) {
+		/* Get the time of the most recent update to the repo */
+		setenv("GIT_DIR", repo->path, 1);
+		for_each_branch_ref(get_branch_mod_time, &rmt);
+		if (rmt.mod_time) {
+			*mtime = rmt.mod_time;
+			r->mtime = *mtime;
+			goto end;
+		}
+	} else {
+		strbuf_reset(&path);
+		strbuf_addf(&path, "%s/refs/heads/%s", repo->path,
+			    repo->defbranch ? repo->defbranch : "master");
+		if (get_file_modtime(path.buf, mtime)) {
+			r->mtime = *mtime;
+			goto end;
+		}
 
-	strbuf_reset(&path);
-	strbuf_addf(&path, "%s/%s", repo->path, "packed-refs");
-	if (stat(path.buf, &s) == 0) {
-		*mtime = s.st_mtime;
-		r->mtime = *mtime;
-		goto end;
+		strbuf_reset(&path);
+		strbuf_addf(&path, "%s/%s", repo->path, "packed-refs");
+		if (get_file_modtime(path.buf, mtime)) {
+			r->mtime = *mtime;
+			goto end;
+		}
 	}
 
 	*mtime = 0;
-- 
1.8.4.rc3



      reply	other threads:[~2013-08-29 14:11 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-22 19:05 [PATCH] Display the most recent modtime for the repolist fparent
2013-08-22 19:09 ` mailings
2013-08-22 19:19 ` john
2013-08-29 14:11   ` fparent [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1377785460-14941-1-git-send-email-fparent@baylibre.com \
    --to=cgit@lists.zx2c4.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).