Commit c2e1b0581ada8453447bdeaacca92d972d83b1a8

Pierre-Olivier Latour 2015-06-05T18:26:49

Only write index if updated when passing GIT_DIFF_UPDATE_INDEX When diffing the index with the workdir and GIT_DIFF_UPDATE_INDEX has been passed, the previous implementation was always writing the index to disk even if it wasn't modified.

diff --git a/src/diff.c b/src/diff.c
index 12d34a1..c1adcc6 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -664,8 +664,10 @@ int git_diff__oid_for_entry(
 		updated_entry.mode = mode;
 		git_oid_cpy(&updated_entry.id, out);
 
-		if (!(error = git_repository_index__weakptr(&idx, diff->repo)))
+		if (!(error = git_repository_index__weakptr(&idx, diff->repo))) {
 			error = git_index_add(idx, &updated_entry);
+			diff->index_updated = true;
+		}
  	}
 
 	git_buf_free(&full_path);
@@ -1360,7 +1362,7 @@ int git_diff_index_to_workdir(
 			&b, repo, index, NULL, GIT_ITERATOR_DONT_AUTOEXPAND, pfx, pfx)
 	);
 
-	if (!error && DIFF_FLAG_IS_SET(*diff, GIT_DIFF_UPDATE_INDEX))
+	if (!error && DIFF_FLAG_IS_SET(*diff, GIT_DIFF_UPDATE_INDEX) && (*diff)->index_updated)
 		error = git_index_write(index);
 
 	return error;
diff --git a/src/diff.h b/src/diff.h
index a202a08..2dfc2c6 100644
--- a/src/diff.h
+++ b/src/diff.h
@@ -64,6 +64,7 @@ struct git_diff {
 	git_iterator_type_t new_src;
 	uint32_t diffcaps;
 	git_diff_perfdata perf;
+	bool index_updated;
 
 	int (*strcomp)(const char *, const char *);
 	int (*strncomp)(const char *, const char *, size_t);