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::Tag

SV *
create(class, repo, name, msg, tagger, target)
	SV *class
	SV *repo
	SV *name
	SV *msg
	Signature tagger
	SV *target

	PREINIT:
		int rc;
		Tag tag;

		git_oid oid;
		git_object *obj;
		Repository repo_ptr;

	CODE:
		obj = git_sv_to_obj(target);

		if (obj == NULL)
			croak_usage("Invalid type for '%s', expected a commitish", "target");

		repo_ptr = GIT_SV_TO_PTR(Repository, repo);

		rc = git_tag_create(
			&oid, repo_ptr -> repository, git_ensure_pv(name, "name"),
			obj, tagger, git_ensure_pv(msg, "msg"), 0
		);
		git_check_error(rc);

		rc = git_tag_lookup(&tag, repo_ptr -> repository, &oid);
		git_check_error(rc);

		GIT_NEW_OBJ_WITH_MAGIC(
			RETVAL, SvPVbyte_nolen(class), tag, SvRV(repo)
		);

	OUTPUT: RETVAL

SV *
lookup(class, repo, id)
	SV *class
	SV *repo
	SV *id

	PREINIT:
		int rc;

		Tag tag;
		git_oid oid;
		Repository repo_ptr;

		STRLEN len;
		const char *id_str;

	CODE:
		id_str = git_ensure_pv_with_len(id, "id", &len);

		rc = git_oid_fromstrn(&oid, id_str, len);
		git_check_error(rc);

		repo_ptr = GIT_SV_TO_PTR(Repository, repo);
		rc = git_tag_lookup_prefix(&tag, repo_ptr -> repository, &oid, len);

		if (rc == GIT_ENOTFOUND) {
			RETVAL = &PL_sv_undef;
		} else {
			git_check_error(rc);

			GIT_NEW_OBJ_WITH_MAGIC(
				RETVAL, SvPVbyte_nolen(class), tag, SvRV(repo)
			);
		}

	OUTPUT: RETVAL

SV *
owner(self)
	SV *self

	PREINIT:
		SV *repo;

	CODE:
		repo = GIT_SV_TO_MAGIC(self);
		RETVAL = newRV_inc(repo);

	OUTPUT: RETVAL

void
foreach(class, repo, cb, ...)
	SV *class
	SV *repo
	SV *cb

	PROTOTYPE: $$$;$
	PREINIT:
		int rc;

	CODE:
		git_foreach_payload payload = {
			GIT_SV_TO_PTR(Repository, repo),
			repo,
			cb,
			1,
			1
		};

		if (items == 4 && SvOK(ST(3))) {
			const char *type = git_ensure_pv(ST(3), "type");

			if (strcmp(type, "lightweight") == 0)
				payload.annotated = 0;
			else if (strcmp(type, "annotated") == 0)
				payload.lightweight = 0;
			else {
				if (strcmp(type, "all") != 0)
					croak_usage("Invalid value for 'type', expected "
						"'all', 'lightweight' or 'annotated'");
			}
		}

		rc = git_tag_foreach(
			payload.repo_ptr -> repository,
			git_tag_foreach_cbb,
			&payload
		);

		if (rc != GIT_EUSER)
			git_check_error(rc);

void
delete(self)
	SV *self

	PREINIT:
		int rc;

		Tag tag_ptr;
		Repository repo;

	CODE:
		tag_ptr = GIT_SV_TO_PTR(Tag, self);

		repo = INT2PTR(
			Repository, SvIV((SV *) GIT_SV_TO_MAGIC(self))
		);

		rc = git_tag_delete(repo -> repository, git_tag_name(tag_ptr));
		git_check_error(rc);

		git_tag_free(tag_ptr);
		sv_setiv(SvRV(self), 0);

SV *
id(self)
	Tag self

	CODE:
		RETVAL = git_oid_to_sv(git_tag_id(self));

	OUTPUT: RETVAL

SV *
name(self)
	Tag self

	CODE:
		RETVAL = newSVpv(git_tag_name(self), 0);

	OUTPUT: RETVAL

SV *
message(self)
	Tag self

	CODE:
		RETVAL = newSVpv(git_tag_message(self), 0);

	OUTPUT: RETVAL

SV *
tagger(self)
	Tag self

	PREINIT:
		int rc;
		Signature tagger, result;

	CODE:
		RETVAL = &PL_sv_undef;

		if ((tagger = (Signature) git_tag_tagger(self)) != NULL) {
			rc = git_signature_dup(&result, tagger);
			git_check_error(rc);

			GIT_NEW_OBJ(
				RETVAL, "Git::Raw::Signature", result
			);
		}

	OUTPUT: RETVAL

SV *
target(self)
	SV *self

	PREINIT:
		int rc;
		git_object *obj;

	CODE:
		rc = git_tag_target(&obj, GIT_SV_TO_PTR(Tag, self));
		git_check_error(rc);

		RETVAL = git_obj_to_sv(obj, GIT_SV_TO_MAGIC(self));

	OUTPUT: RETVAL

void
DESTROY(self)
	SV *self

	CODE:
		git_tag_free(GIT_SV_TO_PTR(Tag, self));
		SvREFCNT_dec(GIT_SV_TO_MAGIC(self));