[PATCH 2/5] get_commit_date() obtains newest commit date

Julius Plenz plenz at cis.fu-berlin.de
Thu Mar 10 17:03:21 CET 2011


Previously, CGit used to stat() the branch file under $GIT_DIR/refs/heads,
which is error-prone due to the fact that

 i) the file's modification time is not always the commit time of the
    commit pointed at and
ii) the ref can be packed, in which case the upstream modification time
    would be unavailable

Signed-off-by: Julius Plenz <plenz at cis.fu-berlin.de>
---
 ui-repolist.c |   32 ++++++++++++++++++++++++++------
 1 files changed, 26 insertions(+), 6 deletions(-)

diff --git a/ui-repolist.c b/ui-repolist.c
index 2c98668..06fe6c0 100644
--- a/ui-repolist.c
+++ b/ui-repolist.c
@@ -28,6 +28,30 @@ time_t read_agefile(char *path)
 	return result;
 }
 
+static time_t get_commit_date(const char *repo_path, const char *ref)
+{
+	time_t *t;
+	unsigned char sha[20];
+	const char *retval;
+	struct commit *commit;
+	int flags;
+
+	t = xmalloc(sizeof(time_t));
+
+	set_git_dir(repo_path);
+	setup_git_directory_gently(NULL);
+
+	retval = resolve_ref(ref, sha, 1, &flags);
+	if(!retval)
+		return (time_t)NULL;
+
+	commit = lookup_commit_reference_gently(sha, 1);
+	if(commit)
+		return (time_t) commit->date;
+
+	return (time_t)NULL;
+}
+
 static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
 {
 	char *path;
@@ -45,13 +69,9 @@ static int get_repo_modtime(const struct cgit_repo *repo, time_t *mtime)
 		return 1;
 	}
 
-	path = fmt("%s/refs/heads/%s", repo->path, repo->defbranch);
-	if (stat(path, &s) == 0)
-		*mtime = s.st_mtime;
-	else
-		*mtime = 0;
-
+	*mtime = get_commit_date(repo->path, fmt("refs/heads/%s", repo->defbranch));
 	r->mtime = *mtime;
+
 	return (r->mtime != 0);
 }
 
-- 
1.7.3.1





More information about the CGit mailing list