git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] diff-cache: diff-patch (-p) format fixes.

From
Junio C Hamano <junkio@cox.net>
Date
May 29, 2005, 05:23 UTC
Message-ID
<7voeaur4fu.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<7v3bs6slwl.fsf_-_@assigned-by-dhcp.cox.net>
This fixes two more bugs.
 - When diff-cache is run with -R and without --cached, a
   stat-dirty but otherwise unmodified file still produced an
   empty "diff --git" header (earlier fix was only for the case
   without -R).
 - When diff-cache is run without --cached, an unmodifed file
   that has different mode bits from the tree incorrectly picked
   up the mode bits from the filesystem, when it should have
   used what was recorded in the tree object.
Signed-off-by: Junio C Hamano <junkio@cox.net>
---

diff.c | 26 ++++++++++++++++++++++---- 1 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/diff.c b/diff.c
--- a/diff.c
+++ b/diff.c
@@ -183,6 +183,9 @@ void fill_filespec(struct diff_filespec 
  * Given a name and sha1 pair, if the dircache tells us the file in
  * the work tree has that object contents, return true, so that
  * prepare_temp_file() does not have to inflate and extract.
+ *
+ * NOTE: this function does not use the mode bits, so diff_filespec
+ * users must be careful about mode handling!
  */
 static int work_tree_matches(const char *name, const unsigned char *sha1)
 {
@@ -394,6 +397,10 @@ static void prepare_temp_file(const char
 
 	if (!one->sha1_valid ||
 	    work_tree_matches(name, one->sha1)) {
+		/* NOTE: we only say the matching file has the same
+		 * contents.  It may have a different mode, in which
+		 * case we should not pick it up from the filesystem!
+		 */
 		struct stat st;
 		if (lstat(name, &st) < 0) {
 			if (errno == ENOENT)
@@ -421,8 +428,15 @@ static void prepare_temp_file(const char
 				strcpy(temp->hex, sha1_to_hex(null_sha1));
 			else
 				strcpy(temp->hex, sha1_to_hex(one->sha1));
-			sprintf(temp->mode, "%06o",
-				S_IFREG |ce_permissions(st.st_mode));
+			/* even though we borrow the contents from the
+			 * work tree, we want our mode if we are not told
+			 * to look at the filesystem.
+			 */
+			if (one->sha1_valid)
+				sprintf(temp->mode, "%06o", one->mode);
+			else
+				sprintf(temp->mode, "%06o",
+					S_IFREG | ce_permissions(st.st_mode));
 		}
 		return;
 	}
@@ -716,9 +730,13 @@ static void diff_flush_patch(struct diff
 	 * need to see if the two are the same and if so not to emit
 	 * anything at all.  Avoid is_exact_match() comparison when it
 	 * does not matter.
+	 * Notice that "look at the filesystem" can happen on p->one
+	 * if we are operating under reverse-diff option.
 	 */
-	if ((DIFF_FILE_VALID(p->two) && !p->two->sha1_valid) &&
-	    is_exact_match(p->one, p->two))
+	if ( ((DIFF_FILE_VALID(p->one) && !p->one->sha1_valid) ||
+	      (DIFF_FILE_VALID(p->two) && !p->two->sha1_valid)) &&
+	     is_exact_match(p->one, p->two) &&
+	     (p->one->mode == p->two->mode) )
 		return;
 
 	name = p->one->path;
------------------------------------------------
Previous: Junio C HamanoNext: Junio C Hamano
Message 26 of 45 in “Broken directory pathname pruning..”
  1. Linus TorvaldsMay 27, 2005
  2. Junio C HamanoMay 27, 2005
  3. allow pathspec to end with a slashJunio C Hamano, May 27, 2005
  4. allow pathspec to end with a slash (take #2)Junio C Hamano, May 27, 2005
  5. Diff updates, fixing pathspec and rename/copy interaction.Junio C Hamano, May 27, 2005
  6. Linus TorvaldsMay 27, 2005
  7. Junio C HamanoMay 27, 2005
  8. 00/12 Diff updatesJunio C Hamano, May 27, 2005
  9. 01/12 Fix math thinko in similarity estimator.Junio C Hamano, May 27, 2005
  10. 02/12 Introduce diff_free_filepair() funcion.Junio C Hamano, May 27, 2005
  11. 03/12 Make pathspec only care about the detination tree.Junio C Hamano, May 27, 2005
  12. 04/12 Remove unused rank field from diff_core structure.Junio C Hamano, May 27, 2005
  13. 05/12 Do not expose internal scaling to diff-helper.Junio C Hamano, May 27, 2005
  14. 06/12 Remove final newline from the value of xfrm_msg variable.Junio C Hamano, May 27, 2005
  15. 07/12 Clean up diff_setup() to make it more extensible.Junio C Hamano, May 27, 2005
  16. 08/12 Remove a function not used anymore.Junio C Hamano, May 27, 2005
  17. 09/12 Add --pickaxe-all to diff-* brothers.Junio C Hamano, May 27, 2005
  18. 10/12 Fix the way diffcore-rename records unremoved source.Junio C Hamano, May 27, 2005
  19. 11/12 Move pathspec to the beginning of the diffcore chain.Junio C Hamano, May 27, 2005
  20. 12/12 Optimize diff-tree -[CM] --stdinJunio C Hamano, May 27, 2005
  21. Yoichi YuasaJun 4, 2005
  22. Junio C HamanoMay 27, 2005
  23. Do not show empty diff in diff-cache uncached.Junio C Hamano, May 28, 2005
  24. Diff: two fixes.Junio C Hamano, May 28, 2005
  25. diff-helper: fix R/C score parsing under -z flag.Junio C Hamano, May 29, 2005
  26. diff-cache: diff-patch (-p) format fixes.Junio C Hamano, May 29, 2005
  27. diff: code clean-up.Junio C Hamano, May 29, 2005
  28. Linus TorvaldsMay 29, 2005
  29. Junio C HamanoMay 29, 2005
  30. Junio C HamanoMay 29, 2005
  31. 0/3 Leftover bits after 12-seriesJunio C Hamano, May 29, 2005
  32. 1/3 diff-helper: Fix R/C score parsing under -z flag.Junio C Hamano, May 29, 2005
  33. 2/3 diff: consolidate various calls into diffcore.Junio C Hamano, May 29, 2005
  34. 3/3 diff: code clean-up and removal of rename hack.Junio C Hamano, May 29, 2005
  35. 0/4 Junio C Hamano, May 30, 2005
  36. 1/4 diff: further cleanup.Junio C Hamano, May 30, 2005
  37. 2/4 diff: fix the culling of unneeded delete record.Junio C Hamano, May 30, 2005
  38. 3/4 Add -B flag to diff-* brothers.Junio C Hamano, May 30, 2005
  39. 4/4 Add -O<orderfile> option to diff-* brothers.Junio C Hamano, May 30, 2005
  40. Linus TorvaldsMay 30, 2005
  41. Junio C HamanoMay 30, 2005
  42. apply.c: tolerate diff from a dirty but unchanged pathJunio C Hamano, Jun 11, 2005
  43. Linus TorvaldsJun 12, 2005
  44. Linus TorvaldsJun 12, 2005
  45. Junio C HamanoJun 12, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.