summaryrefslogtreecommitdiff
path: root/datever.c
diff options
context:
space:
mode:
authorAki <please@ignore.pl>2024-01-20 01:39:01 +0100
committerAki <please@ignore.pl>2024-01-20 01:40:04 +0100
commitba708d4d01e050cc8d160fe1e4a241af26dd4f16 (patch)
tree69bdcbd122ac22987c66a5bf6f7860d7e8a7e245 /datever.c
downloaddatever-ba708d4d01e050cc8d160fe1e4a241af26dd4f16.zip
datever-ba708d4d01e050cc8d160fe1e4a241af26dd4f16.tar.gz
datever-ba708d4d01e050cc8d160fe1e4a241af26dd4f16.tar.bz2
Implemented version based on number of commits on HEAD day
Diffstat (limited to 'datever.c')
-rw-r--r--datever.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/datever.c b/datever.c
new file mode 100644
index 0000000..a8c63df
--- /dev/null
+++ b/datever.c
@@ -0,0 +1,65 @@
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include <git2.h>
+
+
+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(&gt);
+ 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;
+}