blob: 98d419a9dc4367d2f54afdc3641e634280778884 [file] [log] [blame]
/*
* 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