mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-22 17:13:26 +00:00
handle renames in status computation
This commit is contained in:
parent
1ee2ef87ec
commit
dfe8c8df37
@ -42,6 +42,7 @@ typedef enum {
|
||||
GIT_STATUS_WT_MODIFIED = (1u << 8),
|
||||
GIT_STATUS_WT_DELETED = (1u << 9),
|
||||
GIT_STATUS_WT_TYPECHANGE = (1u << 10),
|
||||
GIT_STATUS_WT_RENAMED = (1u << 11),
|
||||
|
||||
GIT_STATUS_IGNORED = (1u << 14),
|
||||
} git_status_t;
|
||||
@ -130,6 +131,10 @@ typedef enum {
|
||||
* - GIT_STATUS_OPT_RECURSE_IGNORED_DIRS indicates that the contents of
|
||||
* ignored directories should be included in the status. This is like
|
||||
* doing `git ls-files -o -i --exclude-standard` with core git.
|
||||
* - GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX indicates that items that are
|
||||
* renamed in the index will be reported as renames.
|
||||
* - GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR indicates that items that
|
||||
* are renamed in the working directory will be reported as renames.
|
||||
*
|
||||
* Calling `git_status_foreach()` is like calling the extended version
|
||||
* with: GIT_STATUS_OPT_INCLUDE_IGNORED, GIT_STATUS_OPT_INCLUDE_UNTRACKED,
|
||||
@ -137,13 +142,15 @@ typedef enum {
|
||||
* together as `GIT_STATUS_OPT_DEFAULTS` if you want them as a baseline.
|
||||
*/
|
||||
typedef enum {
|
||||
GIT_STATUS_OPT_INCLUDE_UNTRACKED = (1u << 0),
|
||||
GIT_STATUS_OPT_INCLUDE_IGNORED = (1u << 1),
|
||||
GIT_STATUS_OPT_INCLUDE_UNMODIFIED = (1u << 2),
|
||||
GIT_STATUS_OPT_EXCLUDE_SUBMODULES = (1u << 3),
|
||||
GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = (1u << 4),
|
||||
GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH = (1u << 5),
|
||||
GIT_STATUS_OPT_RECURSE_IGNORED_DIRS = (1u << 6),
|
||||
GIT_STATUS_OPT_INCLUDE_UNTRACKED = (1u << 0),
|
||||
GIT_STATUS_OPT_INCLUDE_IGNORED = (1u << 1),
|
||||
GIT_STATUS_OPT_INCLUDE_UNMODIFIED = (1u << 2),
|
||||
GIT_STATUS_OPT_EXCLUDE_SUBMODULES = (1u << 3),
|
||||
GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS = (1u << 4),
|
||||
GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH = (1u << 5),
|
||||
GIT_STATUS_OPT_RECURSE_IGNORED_DIRS = (1u << 6),
|
||||
GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX = (1u << 7),
|
||||
GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR = (1u << 8),
|
||||
} git_status_opt_t;
|
||||
|
||||
#define GIT_STATUS_OPT_DEFAULTS \
|
||||
|
108
src/status.c
108
src/status.c
@ -54,7 +54,6 @@ static unsigned int workdir_delta2status(git_delta_t workdir_status)
|
||||
|
||||
switch (workdir_status) {
|
||||
case GIT_DELTA_ADDED:
|
||||
case GIT_DELTA_RENAMED:
|
||||
case GIT_DELTA_COPIED:
|
||||
case GIT_DELTA_UNTRACKED:
|
||||
st = GIT_STATUS_WT_NEW;
|
||||
@ -68,6 +67,9 @@ static unsigned int workdir_delta2status(git_delta_t workdir_status)
|
||||
case GIT_DELTA_IGNORED:
|
||||
st = GIT_STATUS_IGNORED;
|
||||
break;
|
||||
case GIT_DELTA_RENAMED:
|
||||
st = GIT_STATUS_WT_RENAMED;
|
||||
break;
|
||||
case GIT_DELTA_TYPECHANGE:
|
||||
st = GIT_STATUS_WT_TYPECHANGE;
|
||||
break;
|
||||
@ -85,9 +87,9 @@ static bool status_is_included(
|
||||
{
|
||||
/* if excluding submodules and this is a submodule everywhere */
|
||||
if ((statuslist->opts.flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES) != 0) {
|
||||
bool in_tree = (head2idx && head2idx->status != GIT_DELTA_ADDED);
|
||||
bool in_tree = (head2idx && head2idx->status != GIT_DELTA_ADDED);
|
||||
bool in_index = (head2idx && head2idx->status != GIT_DELTA_DELETED);
|
||||
bool in_wd = (idx2wd && idx2wd->status != GIT_DELTA_DELETED);
|
||||
bool in_wd = (idx2wd && idx2wd->status != GIT_DELTA_DELETED);
|
||||
|
||||
if ((!in_tree || head2idx->old_file.mode == GIT_FILEMODE_COMMIT) &&
|
||||
(!in_index || head2idx->new_file.mode == GIT_FILEMODE_COMMIT) &&
|
||||
@ -136,24 +138,79 @@ static int status_collect(
|
||||
return 0;
|
||||
}
|
||||
|
||||
git_status_list *git_status_list_alloc(void)
|
||||
GIT_INLINE(int) status_entry_cmp_base(
|
||||
const void *a,
|
||||
const void *b,
|
||||
int (*strcomp)(const char *a, const char *b))
|
||||
{
|
||||
const git_status_entry *entry_a = a;
|
||||
const git_status_entry *entry_b = b;
|
||||
const git_diff_delta *delta_a, *delta_b;
|
||||
|
||||
delta_a = entry_a->index_to_workdir ? entry_a->index_to_workdir :
|
||||
entry_a->head_to_index;
|
||||
delta_b = entry_b->index_to_workdir ? entry_b->index_to_workdir :
|
||||
entry_b->head_to_index;
|
||||
|
||||
if (!delta_a && delta_b)
|
||||
return -1;
|
||||
if (delta_a && !delta_b)
|
||||
return 1;
|
||||
if (!delta_a && !delta_b)
|
||||
return 0;
|
||||
|
||||
return strcomp(delta_a->new_file.path, delta_b->new_file.path);
|
||||
}
|
||||
|
||||
static int status_entry_icmp(const void *a, const void *b)
|
||||
{
|
||||
return status_entry_cmp_base(a, b, git__strcasecmp);
|
||||
}
|
||||
|
||||
static int status_entry_cmp(const void *a, const void *b)
|
||||
{
|
||||
return status_entry_cmp_base(a, b, git__strcmp);
|
||||
}
|
||||
|
||||
static git_status_list *git_status_list_alloc(git_index *index)
|
||||
{
|
||||
git_status_list *statuslist = NULL;
|
||||
int (*entrycmp)(const void *a, const void *b);
|
||||
|
||||
entrycmp = index->ignore_case ? status_entry_icmp : status_entry_cmp;
|
||||
|
||||
if ((statuslist = git__calloc(1, sizeof(git_status_list))) == NULL ||
|
||||
git_vector_init(&statuslist->paired, 0, NULL) < 0)
|
||||
git_vector_init(&statuslist->paired, 0, entrycmp) < 0)
|
||||
return NULL;
|
||||
|
||||
return statuslist;
|
||||
}
|
||||
|
||||
static int newfile_cmp(const void *a, const void *b)
|
||||
{
|
||||
const git_diff_delta *delta_a = a;
|
||||
const git_diff_delta *delta_b = b;
|
||||
|
||||
return git__strcmp(delta_a->new_file.path, delta_b->new_file.path);
|
||||
}
|
||||
|
||||
static int newfile_casecmp(const void *a, const void *b)
|
||||
{
|
||||
const git_diff_delta *delta_a = a;
|
||||
const git_diff_delta *delta_b = b;
|
||||
|
||||
return git__strcasecmp(delta_a->new_file.path, delta_b->new_file.path);
|
||||
}
|
||||
|
||||
int git_status_list_new(
|
||||
git_status_list **out,
|
||||
git_repository *repo,
|
||||
const git_status_options *opts)
|
||||
{
|
||||
git_index *index = NULL;
|
||||
git_status_list *statuslist = NULL;
|
||||
git_diff_options diffopt = GIT_DIFF_OPTIONS_INIT;
|
||||
git_diff_find_options findopts_i2w = GIT_DIFF_FIND_OPTIONS_INIT;
|
||||
git_tree *head = NULL;
|
||||
git_status_show_t show =
|
||||
opts ? opts->show : GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
@ -165,7 +222,8 @@ int git_status_list_new(
|
||||
|
||||
GITERR_CHECK_VERSION(opts, GIT_STATUS_OPTIONS_VERSION, "git_status_options");
|
||||
|
||||
if ((error = git_repository__ensure_not_bare(repo, "status")) < 0)
|
||||
if ((error = git_repository__ensure_not_bare(repo, "status")) < 0 ||
|
||||
(error = git_repository_index(&index, repo)) < 0)
|
||||
return error;
|
||||
|
||||
/* if there is no HEAD, that's okay - we'll make an empty iterator */
|
||||
@ -173,7 +231,7 @@ int git_status_list_new(
|
||||
!(error == GIT_ENOTFOUND || error == GIT_EORPHANEDHEAD))
|
||||
return error;
|
||||
|
||||
statuslist = git_status_list_alloc();
|
||||
statuslist = git_status_list_alloc(index);
|
||||
GITERR_CHECK_ALLOC(statuslist);
|
||||
|
||||
memcpy(&statuslist->opts, opts, sizeof(git_status_options));
|
||||
@ -197,17 +255,23 @@ int git_status_list_new(
|
||||
if ((opts->flags & GIT_STATUS_OPT_EXCLUDE_SUBMODULES) != 0)
|
||||
diffopt.flags = diffopt.flags | GIT_DIFF_IGNORE_SUBMODULES;
|
||||
|
||||
if (show != GIT_STATUS_SHOW_WORKDIR_ONLY) {
|
||||
error = git_diff_tree_to_index(&statuslist->head2idx, repo, head, NULL, &diffopt);
|
||||
findopts_i2w.flags |= GIT_DIFF_FIND_FOR_UNTRACKED;
|
||||
|
||||
if (error < 0)
|
||||
if (show != GIT_STATUS_SHOW_WORKDIR_ONLY) {
|
||||
if ((error = git_diff_tree_to_index(&statuslist->head2idx, repo, head, NULL, &diffopt)) < 0)
|
||||
goto on_error;
|
||||
|
||||
if ((opts->flags & GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX) != 0 &&
|
||||
(error = git_diff_find_similar(statuslist->head2idx, NULL)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
if (show != GIT_STATUS_SHOW_INDEX_ONLY) {
|
||||
error = git_diff_index_to_workdir(&statuslist->idx2wd, repo, NULL, &diffopt);
|
||||
if ((error = git_diff_index_to_workdir(&statuslist->idx2wd, repo, NULL, &diffopt)) < 0)
|
||||
goto on_error;
|
||||
|
||||
if (error < 0)
|
||||
if ((opts->flags & GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR) != 0 &&
|
||||
(error = git_diff_find_similar(statuslist->idx2wd, &findopts_i2w)) < 0)
|
||||
goto on_error;
|
||||
}
|
||||
|
||||
@ -219,9 +283,22 @@ int git_status_list_new(
|
||||
statuslist->head2idx = NULL;
|
||||
}
|
||||
|
||||
if ((error = git_diff__paired_foreach(statuslist->head2idx, statuslist->idx2wd, status_collect, statuslist)) < 0)
|
||||
if ((opts->flags & GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX) != 0) {
|
||||
statuslist->head2idx->deltas._cmp =
|
||||
(statuslist->head2idx->opts.flags & GIT_DIFF_DELTAS_ARE_ICASE) != 0 ?
|
||||
newfile_casecmp : newfile_cmp;
|
||||
|
||||
git_vector_sort(&statuslist->head2idx->deltas);
|
||||
}
|
||||
|
||||
if ((error = git_diff__paired_foreach(statuslist->head2idx, statuslist->idx2wd,
|
||||
status_collect, statuslist)) < 0)
|
||||
goto on_error;
|
||||
|
||||
if ((opts->flags & GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX) != 0 ||
|
||||
(opts->flags & GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR) != 0)
|
||||
git_vector_sort(&statuslist->paired);
|
||||
|
||||
*out = statuslist;
|
||||
goto done;
|
||||
|
||||
@ -230,6 +307,7 @@ on_error:
|
||||
|
||||
done:
|
||||
git_tree_free(head);
|
||||
git_index_free(index);
|
||||
|
||||
return error;
|
||||
}
|
||||
@ -307,7 +385,7 @@ int git_status_foreach(
|
||||
{
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
|
||||
opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
opts.flags = GIT_STATUS_OPT_INCLUDE_IGNORED |
|
||||
GIT_STATUS_OPT_INCLUDE_UNTRACKED |
|
||||
GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS;
|
||||
@ -364,7 +442,7 @@ int git_status_file(
|
||||
if (index->ignore_case)
|
||||
sfi.fnm_flags = FNM_CASEFOLD;
|
||||
|
||||
opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
|
||||
opts.flags = GIT_STATUS_OPT_INCLUDE_IGNORED |
|
||||
GIT_STATUS_OPT_RECURSE_IGNORED_DIRS |
|
||||
GIT_STATUS_OPT_INCLUDE_UNTRACKED |
|
||||
|
265
tests-clar/status/renames.c
Normal file
265
tests-clar/status/renames.c
Normal file
@ -0,0 +1,265 @@
|
||||
#include "clar_libgit2.h"
|
||||
#include "buffer.h"
|
||||
#include "path.h"
|
||||
#include "posix.h"
|
||||
#include "status_helpers.h"
|
||||
#include "util.h"
|
||||
#include "status.h"
|
||||
|
||||
static git_repository *g_repo = NULL;
|
||||
|
||||
void test_status_renames__initialize(void)
|
||||
{
|
||||
g_repo = cl_git_sandbox_init("renames");
|
||||
}
|
||||
|
||||
void test_status_renames__cleanup(void)
|
||||
{
|
||||
cl_git_sandbox_cleanup();
|
||||
}
|
||||
|
||||
static void rename_file(git_repository *repo, const char *oldname, const char *newname)
|
||||
{
|
||||
git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT;
|
||||
|
||||
git_buf_joinpath(&oldpath, git_repository_workdir(repo), oldname);
|
||||
git_buf_joinpath(&newpath, git_repository_workdir(repo), newname);
|
||||
|
||||
cl_git_pass(p_rename(oldpath.ptr, newpath.ptr));
|
||||
|
||||
git_buf_free(&oldpath);
|
||||
git_buf_free(&newpath);
|
||||
}
|
||||
|
||||
static void rename_and_edit_file(git_repository *repo, const char *oldname, const char *newname)
|
||||
{
|
||||
git_buf oldpath = GIT_BUF_INIT, newpath = GIT_BUF_INIT;
|
||||
|
||||
git_buf_joinpath(&oldpath, git_repository_workdir(repo), oldname);
|
||||
git_buf_joinpath(&newpath, git_repository_workdir(repo), newname);
|
||||
|
||||
cl_git_pass(p_rename(oldpath.ptr, newpath.ptr));
|
||||
cl_git_append2file(newpath.ptr, "Added at the end to keep similarity!");
|
||||
|
||||
git_buf_free(&oldpath);
|
||||
git_buf_free(&newpath);
|
||||
}
|
||||
|
||||
struct status_entry {
|
||||
git_status_t status;
|
||||
const char *oldname;
|
||||
const char *newname;
|
||||
};
|
||||
|
||||
static void test_status(
|
||||
git_status_list *status_list,
|
||||
struct status_entry *expected_list,
|
||||
size_t expected_len)
|
||||
{
|
||||
const git_status_entry *actual;
|
||||
const struct status_entry *expected;
|
||||
const char *oldname, *newname;
|
||||
size_t i;
|
||||
|
||||
cl_assert(expected_len == git_status_list_entrycount(status_list));
|
||||
|
||||
for (i = 0; i < expected_len; i++) {
|
||||
actual = git_status_byindex(status_list, i);
|
||||
expected = &expected_list[i];
|
||||
|
||||
cl_assert(actual->status == expected->status);
|
||||
|
||||
oldname = actual->head_to_index ? actual->head_to_index->old_file.path :
|
||||
actual->index_to_workdir ? actual->index_to_workdir->old_file.path : NULL;
|
||||
|
||||
newname = actual->index_to_workdir ? actual->index_to_workdir->new_file.path :
|
||||
actual->head_to_index ? actual->head_to_index->new_file.path : NULL;
|
||||
|
||||
if (oldname)
|
||||
cl_assert(git__strcmp(oldname, expected->oldname) == 0);
|
||||
else
|
||||
cl_assert(expected->oldname == NULL);
|
||||
|
||||
if (newname)
|
||||
cl_assert(git__strcmp(newname, expected->newname) == 0);
|
||||
else
|
||||
cl_assert(expected->newname == NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void test_status_renames__head2index_one(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "newname.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
|
||||
rename_file(g_repo, "ikeepsix.txt", "newname.txt");
|
||||
|
||||
cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "newname.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 1);
|
||||
git_status_list_free(statuslist);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_status_renames__head2index_two(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_INDEX_RENAMED, "sixserving.txt", "aaa.txt" },
|
||||
{ GIT_STATUS_INDEX_RENAMED, "untimely.txt", "bbb.txt" },
|
||||
{ GIT_STATUS_INDEX_RENAMED, "songof7cities.txt", "ccc.txt" },
|
||||
{ GIT_STATUS_INDEX_RENAMED, "ikeepsix.txt", "ddd.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
|
||||
rename_file(g_repo, "ikeepsix.txt", "ddd.txt");
|
||||
rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt");
|
||||
rename_file(g_repo, "songof7cities.txt", "ccc.txt");
|
||||
rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt");
|
||||
|
||||
cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
|
||||
cl_git_pass(git_index_remove_bypath(index, "sixserving.txt"));
|
||||
cl_git_pass(git_index_remove_bypath(index, "songof7cities.txt"));
|
||||
cl_git_pass(git_index_remove_bypath(index, "untimely.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "ddd.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "aaa.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "ccc.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "bbb.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 4);
|
||||
git_status_list_free(statuslist);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_status_renames__index2workdir_one(void)
|
||||
{
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "newname.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
|
||||
|
||||
rename_file(g_repo, "ikeepsix.txt", "newname.txt");
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 1);
|
||||
git_status_list_free(statuslist);
|
||||
}
|
||||
|
||||
void test_status_renames__index2workdir_two(void)
|
||||
{
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_WT_RENAMED, "sixserving.txt", "aaa.txt" },
|
||||
{ GIT_STATUS_WT_RENAMED, "untimely.txt", "bbb.txt" },
|
||||
{ GIT_STATUS_WT_RENAMED, "songof7cities.txt", "ccc.txt" },
|
||||
{ GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "ddd.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
|
||||
|
||||
rename_file(g_repo, "ikeepsix.txt", "ddd.txt");
|
||||
rename_and_edit_file(g_repo, "sixserving.txt", "aaa.txt");
|
||||
rename_file(g_repo, "songof7cities.txt", "ccc.txt");
|
||||
rename_and_edit_file(g_repo, "untimely.txt", "bbb.txt");
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 4);
|
||||
git_status_list_free(statuslist);
|
||||
}
|
||||
|
||||
void test_status_renames__both_one(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "newname-workdir.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
|
||||
rename_file(g_repo, "ikeepsix.txt", "newname-index.txt");
|
||||
|
||||
cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "newname-index.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
rename_file(g_repo, "newname-index.txt", "newname-workdir.txt");
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 1);
|
||||
git_status_list_free(statuslist);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
||||
|
||||
void test_status_renames__both_two(void)
|
||||
{
|
||||
git_index *index;
|
||||
git_status_list *statuslist;
|
||||
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
|
||||
struct status_entry expected[] = {
|
||||
{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, "ikeepsix.txt", "ikeepsix-both.txt" },
|
||||
{ GIT_STATUS_INDEX_RENAMED, "sixserving.txt", "sixserving-index.txt" },
|
||||
{ GIT_STATUS_WT_RENAMED, "songof7cities.txt", "songof7cities-workdir.txt" },
|
||||
{ GIT_STATUS_INDEX_RENAMED | GIT_STATUS_WT_RENAMED, "untimely.txt", "untimely-both.txt" },
|
||||
};
|
||||
|
||||
opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_HEAD_TO_INDEX;
|
||||
opts.flags |= GIT_STATUS_OPT_RENAMES_INDEX_TO_WORKDIR;
|
||||
|
||||
cl_git_pass(git_repository_index(&index, g_repo));
|
||||
|
||||
rename_and_edit_file(g_repo, "ikeepsix.txt", "ikeepsix-index.txt");
|
||||
rename_and_edit_file(g_repo, "sixserving.txt", "sixserving-index.txt");
|
||||
rename_file(g_repo, "untimely.txt", "untimely-index.txt");
|
||||
|
||||
cl_git_pass(git_index_remove_bypath(index, "ikeepsix.txt"));
|
||||
cl_git_pass(git_index_remove_bypath(index, "sixserving.txt"));
|
||||
cl_git_pass(git_index_remove_bypath(index, "untimely.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "ikeepsix-index.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "sixserving-index.txt"));
|
||||
cl_git_pass(git_index_add_bypath(index, "untimely-index.txt"));
|
||||
cl_git_pass(git_index_write(index));
|
||||
|
||||
rename_and_edit_file(g_repo, "ikeepsix-index.txt", "ikeepsix-both.txt");
|
||||
rename_and_edit_file(g_repo, "songof7cities.txt", "songof7cities-workdir.txt");
|
||||
rename_file(g_repo, "untimely-index.txt", "untimely-both.txt");
|
||||
|
||||
cl_git_pass(git_status_list_new(&statuslist, g_repo, &opts));
|
||||
test_status(statuslist, expected, 4);
|
||||
git_status_list_free(statuslist);
|
||||
|
||||
git_index_free(index);
|
||||
}
|
Loading…
Reference in New Issue
Block a user