reflog_helpers.c 3.72 KB
Newer Older
1 2 3 4
#include "clar_libgit2.h"

#include "repository.h"
#include "reflog.h"
5
#include "reflog_helpers.h"
6

7
int reflog_entry_tostr(git_str *out, const git_reflog_entry *entry)
8 9 10 11 12 13 14 15
{
	char old_oid[GIT_OID_HEXSZ], new_oid[GIT_OID_HEXSZ];

	assert(out && entry);

	git_oid_tostr((char *)&old_oid, GIT_OID_HEXSZ, git_reflog_entry_id_old(entry));
	git_oid_tostr((char *)&new_oid, GIT_OID_HEXSZ, git_reflog_entry_id_new(entry));

16
	return git_str_printf(out, "%s %s %s %s", old_oid, new_oid, "somesig", git_reflog_entry_message(entry));
17 18
}

19 20 21 22 23 24 25 26 27 28 29 30
size_t reflog_entrycount(git_repository *repo, const char *name)
{
	git_reflog *log;
	size_t ret;

	cl_git_pass(git_reflog_read(&log, repo, name));
	ret = git_reflog_entrycount(log);
	git_reflog_free(log);

	return ret;
}

31
void cl_reflog_check_entry_(git_repository *repo, const char *reflog, size_t idx,
32
	const char *old_spec, const char *new_spec,
33 34
	const char *email, const char *message,
	const char *file, const char *func, int line)
35 36 37
{
	git_reflog *log;
	const git_reflog_entry *entry;
38
	git_str result = GIT_STR_INIT;
39 40 41

	cl_git_pass(git_reflog_read(&log, repo, reflog));
	entry = git_reflog_entry_byindex(log, idx);
42
	if (entry == NULL)
43
		clar__fail(file, func, line, "Reflog has no such entry", NULL, 1);
44 45 46 47

	if (old_spec) {
		git_object *obj = NULL;
		if (git_revparse_single(&obj, repo, old_spec) == GIT_OK) {
48 49 50
			if (git_oid_cmp(git_object_id(obj), git_reflog_entry_id_old(entry)) != 0) {
				git_oid__writebuf(&result, "\tOld OID: \"", git_object_id(obj));
				git_oid__writebuf(&result, "\" != \"", git_reflog_entry_id_old(entry));
51
				git_str_puts(&result, "\"\n");
52
			}
53 54 55 56
			git_object_free(obj);
		} else {
			git_oid *oid = git__calloc(1, sizeof(*oid));
			git_oid_fromstr(oid, old_spec);
57 58 59
			if (git_oid_cmp(oid, git_reflog_entry_id_old(entry)) != 0) {
				git_oid__writebuf(&result, "\tOld OID: \"", oid);
				git_oid__writebuf(&result, "\" != \"", git_reflog_entry_id_old(entry));
60
				git_str_puts(&result, "\"\n");
61
			}
62 63 64 65 66 67
			git__free(oid);
		}
	}
	if (new_spec) {
		git_object *obj = NULL;
		if (git_revparse_single(&obj, repo, new_spec) == GIT_OK) {
68 69 70
			if (git_oid_cmp(git_object_id(obj), git_reflog_entry_id_new(entry)) != 0) {
				git_oid__writebuf(&result, "\tNew OID: \"", git_object_id(obj));
				git_oid__writebuf(&result, "\" != \"", git_reflog_entry_id_new(entry));
71
				git_str_puts(&result, "\"\n");
72
			}
73 74 75 76
			git_object_free(obj);
		} else {
			git_oid *oid = git__calloc(1, sizeof(*oid));
			git_oid_fromstr(oid, new_spec);
77 78 79
			if (git_oid_cmp(oid, git_reflog_entry_id_new(entry)) != 0) {
				git_oid__writebuf(&result, "\tNew OID: \"", oid);
				git_oid__writebuf(&result, "\" != \"", git_reflog_entry_id_new(entry));
80
				git_str_puts(&result, "\"\n");
81
			}
82 83 84 85
			git__free(oid);
		}
	}

86
	if (email && strcmp(email, git_reflog_entry_committer(entry)->email) != 0)
87
		git_str_printf(&result, "\tEmail: \"%s\" != \"%s\"\n", email, git_reflog_entry_committer(entry)->email);
88

89
	if (message) {
90 91 92 93
		const char *entry_msg = git_reflog_entry_message(entry);
		if (entry_msg == NULL) entry_msg = "";

		if (entry_msg && strcmp(message, entry_msg) != 0)
94
			git_str_printf(&result, "\tMessage: \"%s\" != \"%s\"\n", message, entry_msg);
95
	}
96 97
	if (git_str_len(&result) != 0)
		clar__fail(file, func, line, "Reflog entry mismatch", git_str_cstr(&result), 1);
98

99
	git_str_dispose(&result);
100 101 102 103 104 105 106
	git_reflog_free(log);
}

void reflog_print(git_repository *repo, const char *reflog_name)
{
	git_reflog *reflog;
	size_t idx;
107
	git_str out = GIT_STR_INIT;
108 109 110 111 112

	git_reflog_read(&reflog, repo, reflog_name);

	for (idx = 0; idx < git_reflog_entrycount(reflog); idx++) {
		const git_reflog_entry *entry = git_reflog_entry_byindex(reflog, idx);
113
		reflog_entry_tostr(&out, entry);
114
		git_str_putc(&out, '\n');
115 116
	}

117 118
	fprintf(stderr, "%s", git_str_cstr(&out));
	git_str_dispose(&out);
119 120
	git_reflog_free(reflog);
}