#include #include #include #include static int must(const char* msg, int err); int main() { git_libgit2_init(); git_repository* repo = NULL; must("open repository", git_repository_open_ext(&repo, NULL, GIT_REPOSITORY_OPEN_FROM_ENV, NULL)); git_revwalk* walker = NULL; must("walk revisions", git_revwalk_new(&walker, repo)); must("find HEAD", git_revwalk_push_head(walker)); git_oid oid; char prev[37]; prev[0] = 0; char date[37]; int count = 0; while (0 == git_revwalk_next(&oid, walker)) { git_commit* commit; must("find commit", git_commit_lookup(&commit, repo, &oid)); const git_time_t gt = git_commit_time(commit); const struct tm* const tm = gmtime(>); if (NULL == tm) { perror("read time"); exit(1); } snprintf( date, 37, "%d%02d%02d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday); if (0 != prev[0]) { if (0 == strncmp(prev, date, 37)) count++; else break; // Last commit is not deallocated! } strcpy(prev, date); git_commit_free(commit); } printf("%s.%d\n", date, count + 1); } /// If [[err]] is considered erroneuos, print [[msg]] and the last libgit2 error to standard error and then terminate. int must(const char* msg, const int err) { if (0 > err) { const git_error* const e = git_error_last(); if (NULL != msg) dprintf(2, "%s: ", msg); dprintf(2, "%s\n", e->message); exit(1); } return err; }