/*
 * Copyright (C) the libgit2 contributors. All rights reserved.
 *
 * This file is part of libgit2, distributed under the GNU GPL v2 with
 * a Linking Exception. For full terms see the included COPYING file.
 */
#ifndef INCLUDE_git_cherrypick_h__
#define INCLUDE_git_cherrypick_h__

#include "common.h"
#include "types.h"
#include "merge.h"

/**
 * @file git2/cherrypick.h
 * @brief Git cherry-pick routines
 * @defgroup git_cherrypick Git cherry-pick routines
 * @ingroup Git
 * @{
 */
GIT_BEGIN_DECL

/**
 * Cherry-pick options
 */
typedef struct {
	unsigned int version;

	/** For merge commits, the "mainline" is treated as the parent. */
	unsigned int mainline;

	git_merge_options merge_opts; /**< Options for the merging */
	git_checkout_options checkout_opts; /**< Options for the checkout */
} git_cherrypick_options;

#define GIT_CHERRYPICK_OPTIONS_VERSION 1
#define GIT_CHERRYPICK_OPTIONS_INIT {GIT_CHERRYPICK_OPTIONS_VERSION, 0, GIT_MERGE_OPTIONS_INIT, GIT_CHECKOUT_OPTIONS_INIT}

/**
 * Initializes a `git_cherrypick_options` with default values. Equivalent to
 * creating an instance with GIT_CHERRYPICK_OPTIONS_INIT.
 *
 * @param opts the `git_cherrypick_options` struct to initialize
 * @param version Version of struct; pass `GIT_CHERRYPICK_OPTIONS_VERSION`
 * @return Zero on success; -1 on failure.
 */
GIT_EXTERN(int) git_cherrypick_init_options(
	git_cherrypick_options *opts,
	unsigned int version);

/**
 * Cherry-picks the given commit against the given "our" commit, producing an
 * index that reflects the result of the cherry-pick.
 *
 * The returned index must be freed explicitly with `git_index_free`.
 *
 * @param out pointer to store the index result in
 * @param repo the repository that contains the given commits
 * @param cherrypick_commit the commit to cherry-pick
 * @param our_commit the commit to revert against (eg, HEAD)
 * @param mainline the parent of the revert commit, if it is a merge
 * @param merge_options the merge options (or null for defaults)
 * @return zero on success, -1 on failure.
 */
GIT_EXTERN(int) git_cherrypick_commit(
	git_index **out,
	git_repository *repo,
	git_commit *cherrypick_commit,
	git_commit *our_commit,
	unsigned int mainline,
	const git_merge_options *merge_options);

/**
 * Cherry-pick the given commit, producing changes in the index and working directory.
 *
 * @param repo the repository to cherry-pick
 * @param commit the commit to cherry-pick
 * @param cherrypick_options the cherry-pick options (or null for defaults)
 * @return zero on success, -1 on failure.
 */
GIT_EXTERN(int) git_cherrypick(
	git_repository *repo,
	git_commit *commit,
	const git_cherrypick_options *cherrypick_options);

/** @} */
GIT_END_DECL

#endif

