/*
 * Copyright (C) 2009-2012 the libgit2 contributors
 *
 * 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_merge_h__
#define INCLUDE_git_merge_h__

#include "git2/common.h"
#include "git2/types.h"
#include "git2/oid.h"
#include "git2/diff_tree.h"
#include "git2/checkout.h"

/**
 * @file git2/merge.h
 * @brief Git merge routines
 * @defgroup git_merge Git merge routines
 * @ingroup Git
 * @{
 */
GIT_BEGIN_DECL

/**
 * Option flags for `git_merge`.
 *
 * GIT_MERGE_NO_FASTFORWARD - Do not fast-forward.
 */
enum {
	GIT_MERGE_NO_FASTFORWARD      = (1 << 0),
};

/**
 * Resolver options for `git_merge_strategy_resolve`.
 */ 
enum {
	GIT_MERGE_RESOLVE_NO_REMOVED = (1 << 0),
	GIT_MERGE_RESOLVE_NO_AUTOMERGE = (1 << 1),
	GIT_MERGE_RESOLVE_FAVOR_OURS = (1 << 2),
	GIT_MERGE_RESOLVE_FAVOR_THEIRS = (1 << 3),
};

enum {
	GIT_MERGE_CONFLICT_NO_DIFF3 = (1 << 0),
};

#define GIT_MERGE_TREES_OPTS_INIT {0}

typedef struct {
	unsigned int diff_flags;
	unsigned int resolve_flags;
} git_merge_trees_opts;

#define GIT_MERGE_OPTS_INIT {0, GIT_MERGE_TREES_OPTS_INIT, 0, GIT_CHECKOUT_OPTS_INIT}

typedef struct {
	unsigned int merge_flags;
	git_merge_trees_opts merge_trees_opts;
	unsigned int conflict_flags;

	git_checkout_opts checkout_opts;
} git_merge_opts;

/**
 * Determines if a merge is in progress
 *
 * @param out true if there is a merge in progress
 * @param repo the repository where the merge may be in progress
 */
GIT_EXTERN(int) git_merge_inprogress(int *out, git_repository *repo);

/**
 * Find a merge base between two commits
 *
 * @param out the OID of a merge base between 'one' and 'two'
 * @param repo the repository where the commits exist
 * @param one one of the commits
 * @param two the other commit
 */
GIT_EXTERN(int) git_merge_base(git_oid *out, git_repository *repo, const git_oid *one, const git_oid *two);

/**
 * Find a merge base given a list of commits
 *
 * @param out the OID of a merge base considering all the commits
 * @param repo the repository where the commits exist
 * @param input_array oids of the commits
 * @param length The number of commits in the provided `input_array`
 */
GIT_EXTERN(int) git_merge_base_many(git_oid *out, git_repository *repo, const git_oid input_array[], size_t length);

typedef int (*git_merge_strategy)(int *success,
	git_repository *repo,
	const git_merge_head *ancestor_head,
	const git_merge_head *our_head,
	const git_merge_head *their_heads[],
	size_t their_heads_len,
	void *data);

/**
 * Merges the given commits into HEAD, producing a new commit.
 *
 * @param out the results of the merge
 * @param repo the repository to merge
 * @param merge_heads the heads to merge into
 * @param merge_heads_len the number of heads to merge
 * @param flags merge flags
 */
GIT_EXTERN(int) git_merge(
	git_merge_result **out,
	git_repository *repo,
	const git_merge_head **their_heads,
	size_t their_heads_len,
	const git_merge_opts *opts);

GIT_EXTERN(int) git_merge_trees(
	git_merge_result **out,
	git_repository *repo,
	git_index *index,
	const git_tree *ancestor_tree,
	const git_tree *our_tree,
	const git_tree *their_tree,
	const git_merge_trees_opts *opts);

/**
 * Returns true if a merge is up-to-date (we were asked to merge the target
 * into itself.)
 */
GIT_EXTERN(int) git_merge_result_is_uptodate(git_merge_result *merge_result);

/**
 * Returns true if a merge is eligible for fastforward
 */
GIT_EXTERN(int) git_merge_result_is_fastforward(git_merge_result *merge_result);

/**
 * Gets the fast-forward OID if the merge was a fastforward.
 *
 * @param out the OID of the fast-forward
 * @param merge_result the results of the merge
 */
GIT_EXTERN(int) git_merge_result_fastforward_oid(git_oid *out, git_merge_result *merge_result);

GIT_EXTERN(int) git_merge_result_delta_foreach(git_merge_result *merge_result,
	git_diff_tree_delta_cb delta_cb,
	void *payload);

GIT_EXTERN(int) git_merge_result_conflict_foreach(git_merge_result *merge_result,
	git_diff_tree_delta_cb conflict_cb,
	void *payload);

/**
 * Free a merge result.
 *
 * @param merge_result the merge result to free
 */
GIT_EXTERN(void) git_merge_result_free(git_merge_result *merge_result);

GIT_EXTERN(int) git_merge_head_from_ref(git_merge_head **out, git_repository *repo, git_reference *ref);
GIT_EXTERN(int) git_merge_head_from_oid(git_merge_head **out, git_repository *repo, const git_oid *oid);
GIT_EXTERN(void) git_merge_head_free(git_merge_head *head);


/** @} */
GIT_END_DECL
#endif
