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

void
apply(class, repo, index, ...)
	SV *class
	Repository repo
	size_t index

	PREINIT:
		int rc;

		git_stash_apply_options stash_apply_opts = GIT_STASH_APPLY_OPTIONS_INIT;

	CODE:
		if (items >= 4) {
			HV *opts = git_ensure_hv(ST(3), "stash_apply_opts");
			git_hv_to_stash_apply_opts(opts, &stash_apply_opts);
		}

		rc = git_stash_apply(
			repo -> repository,
			index,
			&stash_apply_opts
		);
		git_check_error(rc);

void
pop(class, repo, index, ...)
	SV *class
	Repository repo
	size_t index

	PREINIT:
		int rc;

		git_stash_apply_options stash_apply_opts = GIT_STASH_APPLY_OPTIONS_INIT;

	CODE:
		if (items >= 4) {
			HV *opts = git_ensure_hv(ST(3), "stash_apply_opts");
			git_hv_to_stash_apply_opts(opts, &stash_apply_opts);
		}

		rc = git_stash_pop(
			repo -> repository,
			index,
			&stash_apply_opts
		);
		git_check_error(rc);

SV *
save(class, repo, stasher, msg, ...)
	SV *class
	SV *repo
	Signature stasher
	SV *msg

	PROTOTYPE: $$$$;$

	PREINIT:
		int rc;

		Repository repo_ptr;

		git_oid oid;
		unsigned int stash_flags = GIT_STASH_DEFAULT;

	CODE:
		repo_ptr = GIT_SV_TO_PTR(Repository, repo);

		if (items == 5) {
			AV *flags;
			SV **flag;
			size_t i = 0, count = 0;

			flags = git_ensure_av(ST(4), "opts");

			while ((flag = av_fetch(flags, i++, 0))) {
				const char *opt = NULL;
				if (!SvPOK(*flag))
					continue;

				opt = git_ensure_pv(*flag, "flag");

				if (strcmp(opt, "keep_index") == 0)
					stash_flags |= GIT_STASH_KEEP_INDEX;
				else if (strcmp(opt, "include_untracked") == 0)
					stash_flags |= GIT_STASH_INCLUDE_UNTRACKED;
				else if (strcmp(opt, "include_ignored") == 0)
					stash_flags |= GIT_STASH_INCLUDE_IGNORED;
				else
					croak_usage("Unknown value for flag '%s', expected "
						"'keep_index', 'include_untracked' or 'include_ignored'",
						opt);

				++count;
			}
		}

		rc = git_stash_save(&oid, repo_ptr -> repository,
			stasher,
			git_ensure_pv(msg, "msg"),
			stash_flags
		);

		RETVAL = &PL_sv_undef;
		if (rc != GIT_ENOTFOUND) {
			Commit commit;
			git_check_error(rc);

			rc = git_commit_lookup(&commit,
				repo_ptr -> repository, &oid
			);
			git_check_error(rc);

			GIT_NEW_OBJ_WITH_MAGIC(
				RETVAL, "Git::Raw::Commit", commit, SvRV(repo)
			);
		}

	OUTPUT: RETVAL

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

	PREINIT:
		int rc;

	CODE:
		git_foreach_payload payload = {
			GIT_SV_TO_PTR(Repository, repo),
			repo,
			git_ensure_cv(cb, "callback")
		};

		rc = git_stash_foreach(
			payload.repo_ptr -> repository, git_stash_foreach_cb, &payload
		);
		if (rc != GIT_EUSER)
			git_check_error(rc);

void
drop(class, repo, index)
	SV *class
	Repository repo
	size_t index

	PREINIT:
		int rc;

	CODE:
		rc = git_stash_drop(repo -> repository, index);
		git_check_error(rc);