analysis.c 4.5 KB
Newer Older
1 2 3
#include "clar_libgit2.h"
#include "git2/repository.h"
#include "git2/merge.h"
4
#include "git2/annotated_commit.h"
5 6 7 8
#include "git2/sys/index.h"
#include "merge.h"
#include "../merge_helpers.h"
#include "refs.h"
9
#include "posix.h"
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

static git_repository *repo;
static git_index *repo_index;

#define TEST_REPO_PATH "merge-resolve"
#define TEST_INDEX_PATH TEST_REPO_PATH "/.git/index"

#define UPTODATE_BRANCH			"master"
#define PREVIOUS_BRANCH			"previous"

#define FASTFORWARD_BRANCH		"ff_branch"
#define FASTFORWARD_ID			"fd89f8cffb663ac89095a0f9764902e93ceaca6a"

#define NOFASTFORWARD_BRANCH	"branch"
#define NOFASTFORWARD_ID		"7cb63eed597130ba4abb87b3e544b85021905520"


// Fixture setup and teardown
28
void test_merge_workdir_analysis__initialize(void)
29 30 31 32 33
{
	repo = cl_git_sandbox_init(TEST_REPO_PATH);
	git_repository_index(&repo_index, repo);
}

34
void test_merge_workdir_analysis__cleanup(void)
35 36 37 38 39
{
	git_index_free(repo_index);
	cl_git_sandbox_cleanup();
}

40 41
static void analysis_from_branch(
	git_merge_analysis_t *merge_analysis,
42
	git_merge_preference_t *merge_pref,
43
	const char *branchname)
44 45 46
{
	git_buf refname = GIT_BUF_INIT;
	git_reference *their_ref;
47
	git_annotated_commit *their_head;
48 49 50 51

	git_buf_printf(&refname, "%s%s", GIT_REFS_HEADS_DIR, branchname);

	cl_git_pass(git_reference_lookup(&their_ref, repo, git_buf_cstr(&refname)));
52
	cl_git_pass(git_annotated_commit_from_ref(&their_head, repo, their_ref));
53

54
	cl_git_pass(git_merge_analysis(merge_analysis, merge_pref, repo, (const git_annotated_commit **)&their_head, 1));
55 56

	git_buf_free(&refname);
57
	git_annotated_commit_free(their_head);
58 59 60
	git_reference_free(their_ref);
}

61
void test_merge_workdir_analysis__fastforward(void)
62
{
63
	git_merge_analysis_t merge_analysis;
64
	git_merge_preference_t merge_pref;
65

66
	analysis_from_branch(&merge_analysis, &merge_pref, FASTFORWARD_BRANCH);
67 68
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD));
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL));
69 70
}

71
void test_merge_workdir_analysis__no_fastforward(void)
72
{
73
	git_merge_analysis_t merge_analysis;
74
	git_merge_preference_t merge_pref;
75

76
	analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH);
77
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, merge_analysis);
78 79
}

80
void test_merge_workdir_analysis__uptodate(void)
81
{
82
	git_merge_analysis_t merge_analysis;
83
	git_merge_preference_t merge_pref;
84

85
	analysis_from_branch(&merge_analysis, &merge_pref, UPTODATE_BRANCH);
86
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_UP_TO_DATE, merge_analysis);
87 88
}

89
void test_merge_workdir_analysis__uptodate_merging_prev_commit(void)
90
{
91
	git_merge_analysis_t merge_analysis;
92
	git_merge_preference_t merge_pref;
93

94
	analysis_from_branch(&merge_analysis, &merge_pref, PREVIOUS_BRANCH);
95
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_UP_TO_DATE, merge_analysis);
96
}
97 98 99

void test_merge_workdir_analysis__unborn(void)
{
100
	git_merge_analysis_t merge_analysis;
101
	git_merge_preference_t merge_pref;
102 103 104 105 106
	git_buf master = GIT_BUF_INIT;

	git_buf_joinpath(&master, git_repository_path(repo), "refs/heads/master");
	p_unlink(git_buf_cstr(&master));

107
	analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH);
108 109
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD));
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_UNBORN, (merge_analysis & GIT_MERGE_ANALYSIS_UNBORN));
110 111 112 113

	git_buf_free(&master);
}

114 115 116
void test_merge_workdir_analysis__fastforward_with_config_noff(void)
{
	git_config *config;
117
	git_merge_analysis_t merge_analysis;
118
	git_merge_preference_t merge_pref;
119 120 121 122

	git_repository_config(&config, repo);
	git_config_set_string(config, "merge.ff", "false");

123
	analysis_from_branch(&merge_analysis, &merge_pref, FASTFORWARD_BRANCH);
124 125
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_FASTFORWARD, (merge_analysis & GIT_MERGE_ANALYSIS_FASTFORWARD));
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL));
126
	cl_assert_equal_i(GIT_MERGE_PREFERENCE_NO_FASTFORWARD, (merge_pref & GIT_MERGE_PREFERENCE_NO_FASTFORWARD));
127 128 129 130 131
}

void test_merge_workdir_analysis__no_fastforward_with_config_ffonly(void)
{
	git_config *config;
132
	git_merge_analysis_t merge_analysis;
133
	git_merge_preference_t merge_pref;
134 135 136 137

	git_repository_config(&config, repo);
	git_config_set_string(config, "merge.ff", "only");

138
	analysis_from_branch(&merge_analysis, &merge_pref, NOFASTFORWARD_BRANCH);
139
	cl_assert_equal_i(GIT_MERGE_ANALYSIS_NORMAL, (merge_analysis & GIT_MERGE_ANALYSIS_NORMAL));
140
	cl_assert_equal_i(GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY, (merge_pref & GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY));
141
}