summaryrefslogtreecommitdiff
path: root/datever.c
blob: a8c63df19314030f041f26dbdd61c49aeb3915f2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
}