diff --git a/src/index.c b/src/index.c index eb3376c7a..4deafd77f 100644 --- a/src/index.c +++ b/src/index.c @@ -242,8 +242,10 @@ static unsigned int index_merge_mode( return index_create_mode(mode); } -static void index_set_ignore_case(git_index *index, bool ignore_case) +void git_index__set_ignore_case(git_index *index, bool ignore_case) { + index->ignore_case = ignore_case; + index->entries._cmp = ignore_case ? index_icmp : index_cmp; index->entries_cmp_path = ignore_case ? index_icmp_path : index_cmp_path; index->entries_search = ignore_case ? index_isrch : index_srch; @@ -372,7 +374,7 @@ int git_index_set_caps(git_index *index, unsigned int caps) } if (old_ignore_case != index->ignore_case) { - index_set_ignore_case(index, index->ignore_case); + git_index__set_ignore_case(index, index->ignore_case); } return 0; diff --git a/src/index.h b/src/index.h index 9304b5539..2beaa6375 100644 --- a/src/index.h +++ b/src/index.h @@ -48,6 +48,8 @@ extern size_t git_index__prefix_position(git_index *index, const char *path); extern int git_index_entry__cmp(const void *a, const void *b); extern int git_index_entry__cmp_icase(const void *a, const void *b); +extern void git_index__set_ignore_case(git_index *index, bool ignore_case); + extern int git_index_read_tree_match( git_index *index, git_tree *tree, git_strarray *strspec); diff --git a/src/tree.c b/src/tree.c index ec57e8bb8..11123a18a 100644 --- a/src/tree.c +++ b/src/tree.c @@ -566,6 +566,7 @@ int git_tree__write_index( git_oid *oid, git_index *index, git_repository *repo) { int ret; + bool old_ignore_case = false; assert(oid && index && repo); @@ -580,8 +581,21 @@ int git_tree__write_index( return 0; } - /* The tree cache didn't help us */ + /* The tree cache didn't help us; we'll have to write + * out a tree. If the index is ignore_case, we must + * make it case-sensitive for the duration of the tree-write + * operation. */ + + if (index->ignore_case) { + old_ignore_case = true; + git_index__set_ignore_case(index, false); + } + ret = write_tree(oid, repo, index, "", 0); + + if (old_ignore_case) + git_index__set_ignore_case(index, true); + return ret < 0 ? ret : 0; }