Commit c2907575ec050d4cbc667544f7e6114e09b7b123

Russell Belfer 2013-01-15T09:24:17

Add FORCE_TEXT check into git_diff_blobs code path `git_diff_blobs` and `git_diff_blob_to_buffer` skip the step where we check file attributes because they don't have a filename associated with the data. Unfortunately, this meant they were also skipping the check for the GIT_DIFF_FORCE_TEXT option and so you could not force a diff of an apparent binary file. This adds the force text check into their code path.

diff --git a/src/diff_output.c b/src/diff_output.c
index c2c2591..2e0be63 100644
--- a/src/diff_output.c
+++ b/src/diff_output.c
@@ -137,15 +137,22 @@ static int diff_delta_is_binary_by_content(
 	git_diff_file *file,
 	const git_map *map)
 {
-	const git_buf search = { map->data, 0, min(map->len, 4000) };
-
-	GIT_UNUSED(ctxt);
+	/* check if user is forcing us to text diff these files */
+	if (ctxt->opts && (ctxt->opts->flags & GIT_DIFF_FORCE_TEXT) != 0) {
+		delta->old_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
+		delta->new_file.flags |= GIT_DIFF_FILE_NOT_BINARY;
+		delta->binary = 0;
+		return 0;
+	}
 
 	if ((file->flags & KNOWN_BINARY_FLAGS) == 0) {
+		const git_buf search = { map->data, 0, min(map->len, 4000) };
+
 		/* TODO: provide encoding / binary detection callbacks that can
 		 * be UTF-8 aware, etc.  For now, instead of trying to be smart,
 		 * let's just use the simple NUL-byte detection that core git uses.
 		 */
+
 		/* previously was: if (git_buf_text_is_binary(&search)) */
 		if (git_buf_text_contains_nul(&search))
 			file->flags |= GIT_DIFF_FILE_BINARY;