/*
 * 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_reset_h__
#define INCLUDE_git_reset_h__

#include "common.h"
#include "types.h"
#include "strarray.h"
#include "checkout.h"

/**
 * @file git2/reset.h
 * @brief Git reset management routines
 * @ingroup Git
 * @{
 */
GIT_BEGIN_DECL

/**
 * Kinds of reset operation
 */
typedef enum {
	GIT_RESET_SOFT  = 1, /**< Move the head to the given commit */
	GIT_RESET_MIXED = 2, /**< SOFT plus reset index to the commit */
	GIT_RESET_HARD  = 3, /**< MIXED plus changes in working tree discarded */
} git_reset_t;

/**
 * Sets the current head to the specified commit oid and optionally
 * resets the index and working tree to match.
 *
 * SOFT reset means the Head will be moved to the commit.
 *
 * MIXED reset will trigger a SOFT reset, plus the index will be replaced
 * with the content of the commit tree.
 *
 * HARD reset will trigger a MIXED reset and the working directory will be
 * replaced with the content of the index.  (Untracked and ignored files
 * will be left alone, however.)
 *
 * TODO: Implement remaining kinds of resets.
 *
 * @param repo Repository where to perform the reset operation.
 *
 * @param target Committish to which the Head should be moved to. This object
 * must belong to the given `repo` and can either be a git_commit or a
 * git_tag. When a git_tag is being passed, it should be dereferencable
 * to a git_commit which oid will be used as the target of the branch.
 *
 * @param reset_type Kind of reset operation to perform.
 *
 * @param checkout_opts Optional checkout options to be used for a HARD reset.
 * The checkout_strategy field will be overridden (based on reset_type).
 * This parameter can be used to propagate notify and progress callbacks.
 *
 * @return 0 on success or an error code
 */
GIT_EXTERN(int) git_reset(
	git_repository *repo,
	git_object *target,
	git_reset_t reset_type,
	const git_checkout_options *checkout_opts);

/**
 * Sets the current head to the specified commit oid and optionally
 * resets the index and working tree to match.
 *
 * This behaves like `git_reset()` but takes an annotated commit,
 * which lets you specify which extended sha syntax string was
 * specified by a user, allowing for more exact reflog messages.
 *
 * See the documentation for `git_reset()`.
 *
 * @see git_reset
 */
GIT_EXTERN(int) git_reset_from_annotated(
	git_repository *repo,
	git_annotated_commit *commit,
	git_reset_t reset_type,
	const git_checkout_options *checkout_opts);

/**
 * Updates some entries in the index from the target commit tree.
 *
 * The scope of the updated entries is determined by the paths
 * being passed in the `pathspec` parameters.
 *
 * Passing a NULL `target` will result in removing
 * entries in the index matching the provided pathspecs.
 *
 * @param repo Repository where to perform the reset operation.
 *
 * @param target The committish which content will be used to reset the content
 * of the index.
 *
 * @param pathspecs List of pathspecs to operate on.
 *
 * @return 0 on success or an error code < 0
 */
GIT_EXTERN(int) git_reset_default(
	git_repository *repo,
	git_object *target,
	git_strarray* pathspecs);

/** @} */
GIT_END_DECL
#endif
