Commit 3f0d0c85d06f0d5ff9ba469c6ab523bfddcc710b

Philip Kelley 2013-03-01T15:44:18

Disable ignore_case when writing the index to a tree

diff --git a/src/index.c b/src/index.c
index 5964908..544f337 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;
@@ -388,7 +390,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 9304b55..7fc138d 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 ec57e8b..decd37e 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'll 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;
 }