[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