Blame tests/status/renames.c

Packit Service 20376f
#include "clar_libgit2.h"
Packit Service 20376f
#include "buffer.h"
Packit Service 20376f
#include "path.h"
Packit Service 20376f
#include "posix.h"
Packit Service 20376f
#include "status_helpers.h"
Packit Service 20376f
#include "util.h"
Packit Service 20376f
#include "status.h"
Packit Service 20376f
Packit Service 20376f
static git_repository *g_repo = NULL;
Packit Service 20376f
Packit Service 20376f
void test_status_renames__initialize(void)
Packit Service 20376f
{
Packit Service 20376f
	g_repo = cl_git_sandbox_init("renames");
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.autocrlf", false);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__cleanup(void)
Packit Service 20376f
{
Packit Service 20376f
	cl_git_sandbox_cleanup();
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
static void _rename_helper(
Packit Service 20376f
	git_repository *repo, const char *from, const char *to, const char *extra)
Packit Service 20376f
{
Packit Service 20376f
	git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(
Packit Service 20376f
		&oldpath, git_repository_workdir(repo), from));
Packit Service 20376f
	cl_git_pass(git_buf_joinpath(
Packit Service 20376f
		&newpath, git_repository_workdir(repo), to));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(p_rename(oldpath.ptr, newpath.ptr));
Packit Service 20376f
Packit Service 20376f
	if (extra)
Packit Service 20376f
		cl_git_append2file(newpath.ptr, extra);
Packit Service 20376f
Packit Service 20376f
	git_buf_free(&oldpath);
Packit Service 20376f
	git_buf_free(&newpath);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#define rename_file(R,O,N) _rename_helper((R), (O), (N), NULL)
Packit Service 20376f
#define rename_and_edit_file(R,O,N) \
Packit Service 20376f
	_rename_helper((R), (O), (N), "Added at the end to keep similarity!")
Packit Service 20376f
Packit Service 20376f
struct status_entry {
Packit Service 20376f
	git_status_t status;
Packit Service 20376f
	const char *oldname;
Packit Service 20376f
	const char *newname;
Packit Service 20376f
};
Packit Service 20376f
Packit Service 20376f
static void check_status(
Packit Service 20376f
	git_status_list *status_list,
Packit Service 20376f
	struct status_entry *expected_list,
Packit Service 20376f
	size_t expected_len)
Packit Service 20376f
{
Packit Service 20376f
	const git_status_entry *actual;
Packit Service 20376f
	const struct status_entry *expected;
Packit Service 20376f
	const char *oldname, *newname;
Packit Service 20376f
	size_t i, files_in_status = git_status_list_entrycount(status_list);
Packit Service 20376f
Packit Service 20376f
	cl_assert_equal_sz(expected_len, files_in_status);
Packit Service 20376f
Packit Service 20376f
	for (i = 0; i < expected_len; i++) {
Packit Service 20376f
		actual = git_status_byindex(status_list, i);
Packit Service 20376f
		expected = &expected_list[i];
Packit Service 20376f
Packit Service 20376f
		oldname = actual->head_to_index ? actual->head_to_index->old_file.path :
Packit Service 20376f
			actual->index_to_workdir ? actual->index_to_workdir->old_file.path : NULL;
Packit Service 20376f
Packit Service 20376f
		newname = actual->index_to_workdir ? actual->index_to_workdir->new_file.path :
Packit Service 20376f
			actual->head_to_index ? actual->head_to_index->new_file.path : NULL;
Packit Service 20376f
Packit Service 20376f
		cl_assert_equal_i_fmt(expected->status, actual->status, "%04x");
Packit Service 20376f
Packit Service 20376f
		if (expected->oldname) {
Packit Service 20376f
			cl_assert(oldname != NULL);
Packit Service 20376f
			cl_assert_equal_s(oldname, expected->oldname);
Packit Service 20376f
		} else {
Packit Service 20376f
			cl_assert(oldname == NULL);
Packit Service 20376f
		}
Packit Service 20376f
Packit Service 20376f
		if (actual->status & (GIT_STATUS_INDEX_RENAMED|GIT_STATUS_WT_RENAMED)) {
Packit Service 20376f
			if (expected->newname) {
Packit Service 20376f
				cl_assert(newname != NULL);
Packit Service 20376f
				cl_assert_equal_s(newname, expected->newname);
Packit Service 20376f
			} else {
Packit Service 20376f
				cl_assert(newname == NULL);
Packit Service 20376f
			}
Packit Service 20376f
		}
Packit Service 20376f
	}
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__head2index_one(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "newname.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "newname.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "newname.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 1);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__head2index_two(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED,
Packit Service 20376f
		  "sixserving.txt", "aaa.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED,
Packit Service 20376f
		  "untimely.txt", "bbb.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "songof7cities.txt", "ccc.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "ddd.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "ddd.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt");
Packit Service 20376f
	rename_file(g_repo, "songof7cities.txt", "ccc.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "untimely.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ddd.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "aaa.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ccc.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "bbb.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 4);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__head2index_no_rename_from_rewrite(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_MODIFIED, "sixserving.txt", "sixserving.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "_temp_.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "_temp_.txt", "sixserving.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 2);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__head2index_rename_from_rewrite(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "sixserving.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "sixserving.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "_temp_.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "_temp_.txt", "sixserving.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 2);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__index2workdir_one(void)
Packit Service 20376f
{
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "newname.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "newname.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 1);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__index2workdir_two(void)
Packit Service 20376f
{
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "sixserving.txt", "aaa.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "untimely.txt", "bbb.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "songof7cities.txt", "ccc.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "ddd.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "ddd.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt");
Packit Service 20376f
	rename_file(g_repo, "songof7cities.txt", "ccc.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 4);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__index2workdir_rename_from_rewrite(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "sixserving.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "sixserving.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "_temp_.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "_temp_.txt", "sixserving.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 2);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__both_one(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "ikeepsix.txt", "newname-workdir.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "newname-index.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "newname-index.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "newname-index.txt", "newname-workdir.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 1);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__both_two(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED |
Packit Service 20376f
		  GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "ikeepsix.txt", "ikeepsix-both.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED,
Packit Service 20376f
		  "sixserving.txt", "sixserving-index.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "songof7cities.txt", "songof7cities-workdir.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "untimely.txt", "untimely-both.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_and_edit_file(g_repo, "ikeepsix.txt", "ikeepsix-index.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "sixserving.txt", "sixserving-index.txt");
Packit Service 20376f
	rename_file(g_repo, "untimely.txt", "untimely-index.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "untimely.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ikeepsix-index.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "sixserving-index.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "untimely-index.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	rename_and_edit_file(g_repo, "ikeepsix-index.txt", "ikeepsix-both.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "songof7cities.txt", "songof7cities-workdir.txt");
Packit Service 20376f
	rename_file(g_repo, "untimely-index.txt", "untimely-both.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 4);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
Packit Service 20376f
void test_status_renames__both_rename_from_rewrite(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "songof7cities.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "ikeepsix.txt", "sixserving.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "sixserving.txt", "songof7cities.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "_temp_.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "songof7cities.txt", "sixserving.txt");
Packit Service 20376f
	rename_file(g_repo, "_temp_.txt", "songof7cities.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "songof7cities.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "songof7cities.txt", "_temp_.txt");
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "songof7cities.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "_temp_.txt", "sixserving.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 3);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__rewrites_only_for_renames(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_MODIFIED, "ikeepsix.txt", "ikeepsix.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
Packit Service 20376f
	cl_git_rewritefile("renames/ikeepsix.txt",
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n" \
Packit Service 20376f
		"This is enough content for the file to be rewritten.\n");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 1);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__both_casechange_one(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	int index_caps;
Packit Service 20376f
	struct status_entry expected_icase[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED,
Packit Service 20376f
		  "ikeepsix.txt", "IKeepSix.txt" },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected_case[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "ikeepsix.txt", "IKEEPSIX.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	index_caps = git_index_caps(index);
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", "IKeepSix.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	/* on a case-insensitive file system, this change won't matter.
Packit Service 20376f
	 * on a case-sensitive one, it will.
Packit Service 20376f
	 */
Packit Service 20376f
	rename_file(g_repo, "IKeepSix.txt", "IKEEPSIX.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
Packit Service 20376f
	check_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ?
Packit Service 20376f
		expected_icase : expected_case, 1);
Packit Service 20376f
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__both_casechange_two(void)
Packit Service 20376f
{
Packit Service 20376f
	git_index *index;
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	int index_caps;
Packit Service 20376f
	struct status_entry expected_icase[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED |
Packit Service 20376f
		  GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "ikeepsix.txt", "IKeepSix.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_MODIFIED,
Packit Service 20376f
		  "sixserving.txt", "sixserving.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "songof7cities.txt", "songof7.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "untimely.txt", "untimeliest.txt" }
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected_case[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED |
Packit Service 20376f
		  GIT_STATUS_WT_MODIFIED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "songof7cities.txt", "SONGOF7.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_MODIFIED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "sixserving.txt", "SixServing.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_INDEX_MODIFIED |
Packit Service 20376f
		  GIT_STATUS_WT_RENAMED | GIT_STATUS_WT_MODIFIED,
Packit Service 20376f
		  "ikeepsix.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED,
Packit Service 20376f
		  "untimely.txt", "untimeliest.txt" }
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
	index_caps = git_index_caps(index);
Packit Service 20376f
Packit Service 20376f
	rename_and_edit_file(g_repo, "ikeepsix.txt", "IKeepSix.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "sixserving.txt", "sixserving.txt");
Packit Service 20376f
	rename_file(g_repo, "songof7cities.txt", "songof7.txt");
Packit Service 20376f
	rename_file(g_repo, "untimely.txt", "untimelier.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt"));
Packit Service 20376f
	cl_git_pass(git_index_remove_bypath(index, "untimely.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "IKeepSix.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "sixserving.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "songof7.txt"));
Packit Service 20376f
	cl_git_pass(git_index_add_bypath(index, "untimelier.txt"));
Packit Service 20376f
	cl_git_pass(git_index_write(index));
Packit Service 20376f
Packit Service 20376f
	rename_and_edit_file(g_repo, "IKeepSix.txt", "ikeepsix.txt");
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", "SixServing.txt");
Packit Service 20376f
	rename_and_edit_file(g_repo, "songof7.txt", "SONGOF7.txt");
Packit Service 20376f
	rename_file(g_repo, "untimelier.txt", "untimeliest.txt");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
Packit Service 20376f
	check_status(statuslist, (index_caps & GIT_INDEXCAP_IGNORE_CASE) ?
Packit Service 20376f
		expected_icase : expected_case, 4);
Packit Service 20376f
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	git_index_free(index);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__zero_byte_file_does_not_fail(void)
Packit Service 20376f
{
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
Packit Service 20376f
	struct status_entry expected[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_DELETED, "ikeepsix.txt", "ikeepsix.txt" },
Packit Service 20376f
		{ GIT_STATUS_WT_NEW, "zerobyte.txt", "zerobyte.txt" },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_FROM_REWRITES |
Packit Service 20376f
		GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX |
Packit Service 20376f
		GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR |
Packit Service 20376f
		GIT_STATUS_OPT_INCLUDE_IGNORED |
Packit Service 20376f
		GIT_STATUS_OPT_INCLUDE_UNTRACKED |
Packit Service 20376f
		GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS |
Packit Service 20376f
		GIT_STATUS_SHOW_INDEX_AND_WORKDIR |
Packit Service 20376f
		GIT_STATUS_OPT_RECURSE_IGNORED_DIRS;
Packit Service 20376f
Packit Service 20376f
	p_unlink("renames/ikeepsix.txt");
Packit Service 20376f
	cl_git_mkfile("renames/zerobyte.txt", "");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected, 2);
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
#ifdef GIT_USE_ICONV
Packit Service 20376f
static char *nfc = "\xC3\x85\x73\x74\x72\xC3\xB6\x6D";
Packit Service 20376f
static char *nfd = "\x41\xCC\x8A\x73\x74\x72\x6F\xCC\x88\x6D";
Packit Service 20376f
#endif
Packit Service 20376f
Packit Service 20376f
void test_status_renames__precomposed_unicode_rename(void)
Packit Service 20376f
{
Packit Service 20376f
#ifdef GIT_USE_ICONV
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected0[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_NEW, nfd, NULL },
Packit Service 20376f
		{ GIT_STATUS_WT_DELETED, "sixserving.txt", NULL },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected1[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "sixserving.txt", nfd },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected2[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_DELETED, "sixserving.txt", NULL },
Packit Service 20376f
		{ GIT_STATUS_WT_NEW, nfc, NULL },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected3[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, "sixserving.txt", nfc },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	rename_file(g_repo, "sixserving.txt", nfc);
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.precomposeunicode", false);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected0, ARRAY_SIZE(expected0));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected1, ARRAY_SIZE(expected1));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.precomposeunicode", true);
Packit Service 20376f
Packit Service 20376f
	opts.flags &= ~GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected2, ARRAY_SIZE(expected2));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected3, ARRAY_SIZE(expected3));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
#endif
Packit Service 20376f
}
Packit Service 20376f
Packit Service 20376f
void test_status_renames__precomposed_unicode_toggle_is_rename(void)
Packit Service 20376f
{
Packit Service 20376f
#ifdef GIT_USE_ICONV
Packit Service 20376f
	git_status_list *statuslist;
Packit Service 20376f
	git_status_options opts = GIT_STATUS_OPTIONS_INIT;
Packit Service 20376f
	struct status_entry expected0[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", nfd },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected1[] = {
Packit Service 20376f
		{ GIT_STATUS_WT_RENAMED, nfd, nfc },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected2[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED, nfd, nfc },
Packit Service 20376f
	};
Packit Service 20376f
	struct status_entry expected3[] = {
Packit Service 20376f
		{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, nfd, nfd },
Packit Service 20376f
	};
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.precomposeunicode", false);
Packit Service 20376f
	rename_file(g_repo, "ikeepsix.txt", nfd);
Packit Service 20376f
Packit Service 20376f
	{
Packit Service 20376f
		git_index *index;
Packit Service 20376f
		cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
		cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
Packit Service 20376f
		cl_git_pass(git_index_add_bypath(index, nfd));
Packit Service 20376f
		cl_git_pass(git_index_write(index));
Packit Service 20376f
		git_index_free(index);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED |
Packit Service 20376f
		GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX |
Packit Service 20376f
		GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected0, ARRAY_SIZE(expected0));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	cl_repo_commit_from_index(NULL, g_repo, NULL, 0, "commit nfd");
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	cl_assert_equal_sz(0, git_status_list_entrycount(statuslist));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.precomposeunicode", true);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected1, ARRAY_SIZE(expected1));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	{
Packit Service 20376f
		git_index *index;
Packit Service 20376f
		cl_git_pass(git_repository_index(&index, g_repo));
Packit Service 20376f
		cl_git_pass(git_index_remove_bypath(index, nfd));
Packit Service 20376f
		cl_git_pass(git_index_add_bypath(index, nfc));
Packit Service 20376f
		cl_git_pass(git_index_write(index));
Packit Service 20376f
		git_index_free(index);
Packit Service 20376f
	}
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected2, ARRAY_SIZE(expected2));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
Packit Service 20376f
	cl_repo_set_bool(g_repo, "core.precomposeunicode", false);
Packit Service 20376f
Packit Service 20376f
	cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
Packit Service 20376f
	check_status(statuslist, expected3, ARRAY_SIZE(expected3));
Packit Service 20376f
	git_status_list_free(statuslist);
Packit Service 20376f
#endif
Packit Service 20376f
}
Packit Service 20376f