The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
MODULE = Git::Raw			PACKAGE = Git::Raw::Reflog

SV *
open(class, reference)
	SV *class
	SV *reference

	PREINIT:
		int rc;

		Reference ref;
		Reflog reflog;

	CODE:
		ref = GIT_SV_TO_PTR(Reference, reference);

		rc = git_reflog_read(
			&reflog,
			git_reference_owner(ref),
			git_reference_name(ref)
		);
		git_check_error(rc);

		GIT_NEW_OBJ_WITH_MAGIC(
			RETVAL, SvPVbyte_nolen(class), reflog, reference
		);

	OUTPUT: RETVAL

void
delete(self)
	SV *self

	PREINIT:
		int rc;

		Reference ref;
	
	CODE:
		ref = GIT_SV_TO_PTR(Reference, GIT_SV_TO_MAGIC(self));

		rc = git_reflog_delete(
			git_reference_owner(ref), git_reference_name(ref)
		);
		git_check_error(rc);

void
append(self, message, ...)
	SV *self
	const char *message

	PROTOTYPE: $$;$

	PREINIT:
		int rc;

		git_oid id;
		Signature sig;
		Reference ref;
		Repository ref_owner;

	CODE:
		ref = GIT_SV_TO_PTR(Reference, GIT_SV_TO_MAGIC(self));
		ref_owner = git_reference_owner(ref);

		rc = git_reference_name_to_id(
			&id, ref_owner, git_reference_name(ref)
		);
		git_check_error(rc);

		if (items == 3) {
			sig = GIT_SV_TO_PTR(Signature, ST(2));
		} else {
			rc = git_signature_default(&sig, ref_owner);
			git_check_error(rc);
		}

		rc = git_reflog_append(
			GIT_SV_TO_PTR(Reflog, self),
			&id, sig, message
		);

		if (items != 3)
			git_signature_free(sig);

		git_check_error(rc);

void
drop(self, index)
	Reflog self
	size_t index

	PREINIT:
		int rc;

	CODE:
		rc = git_reflog_drop(self, index, 1);
		git_check_error(rc);

void
write(self)
	Reflog self

	PREINIT:
		int rc;

	CODE:
		rc = git_reflog_write(self);
		git_check_error(rc);

void
entries(self)
	SV *self

	PREINIT:
		int rc;
		size_t i, entry_count;

		Reflog reflog;
		Signature sig;

	PPCODE:
		reflog = GIT_SV_TO_PTR(Reflog, self);

		entry_count = git_reflog_entrycount (reflog);
		for (i = 0; i < entry_count; ++i) {
			SV *committer;

			const git_reflog_entry *e =
				git_reflog_entry_byindex(reflog, i);

			HV *entry = newHV();

			rc = git_signature_dup(&sig, git_reflog_entry_committer(e));
			git_check_error(rc);

			GIT_NEW_OBJ(committer, "Git::Raw::Signature", sig);

			hv_stores(entry, "committer", committer);
			hv_stores(entry, "message", newSVpv(git_reflog_entry_message(e), 0));
			hv_stores(entry, "new_id", git_oid_to_sv(git_reflog_entry_id_new(e)));
			hv_stores(entry, "old_id", git_oid_to_sv(git_reflog_entry_id_old(e)));

			mXPUSHs(newRV_noinc((SV *) entry));
		}

		XSRETURN(entry_count);

void
DESTROY(self)
	SV *self

	CODE:
		git_reflog_free(GIT_SV_TO_PTR(Reflog, self));
		SvREFCNT_dec(GIT_SV_TO_MAGIC(self));