Thread (1 message) 1 message, 1 author, 2016-06-15
DORMANTno replies

[PATCH] diff: code clean-up.

From: Junio C Hamano <hidden>
Date: 2016-06-15 22:41:58
Subsystem: the rest · Maintainer: Linus Torvalds

 - The previous fix for the "diff-cache -p mode bits problem"
   had an unnecessary conditional statement not to use the mode
   that came from the calling program when we get 0{40} SHA1.
   This was totally unnecessary, since the caller gives the
   valid mode bits even when calling us with 0{40} SHA1.
   This mistake did not break anything, since the mode bits we
   got ourselves were the same one taken from the filesystem,
   but it was doing unnecessary work.  This has been fixed.

 - DIFF_PAIR_RENAME() macro is introduced to distinguish a filepair
   that is a rename/copy (the definition of which is src and dst
   are different paths, of course).  This removes the hack used
   in the record_rename_pair() to always put some non-zero value
   in the score field.

Signed-off-by: Junio C Hamano <redacted>
---

diff.c            |   17 +++++++----------
diffcore-rename.c |    2 +-
diffcore.h        |    6 +++---
3 files changed, 11 insertions(+), 14 deletions(-)
diff --git a/diff.c b/diff.c
--- a/diff.c
+++ b/diff.c
@@ -429,14 +429,11 @@ static void prepare_temp_file(const char
 			else
 				strcpy(temp->hex, sha1_to_hex(one->sha1));
 			/* even though we borrow the contents from the
-			 * work tree, we want our mode if we are not told
-			 * to look at the filesystem.
+			 * work tree, we always want our mode.  mode is
+			 * trustworthy even when !(one->sha1_valid), as
+			 * long as DIFF_FILE_VALID(one).
 			 */
-			if (one->sha1_valid)
-				sprintf(temp->mode, "%06o", one->mode);
-			else
-				sprintf(temp->mode, "%06o",
-					S_IFREG | ce_permissions(st.st_mode));
+			sprintf(temp->mode, "%06o", one->mode);
 		}
 		return;
 	}
@@ -843,7 +840,7 @@ static void diff_resolve_rename_copy(voi
 			for (j = 0; j < q->nr; j++) {
 				pp = q->queue[j];
 				if (!strcmp(p->one->path, pp->one->path) &&
-				    pp->score) {
+				    DIFF_PAIR_RENAME(pp)) {
 					/* rename/copy are always valid
 					 * so we do not say DIFF_FILE_VALID()
 					 * on pp->one and pp->two.
@@ -862,7 +859,7 @@ static void diff_resolve_rename_copy(voi
 		 * whose both sides are valid and of the same type, i.e.
 		 * either in-place edit or rename/copy edit.
 		 */
-		else if (p->score) {
+		else if (DIFF_PAIR_RENAME(p)) {
 			if (p->source_stays) {
 				p->status = 'C';
 				continue;
@@ -875,7 +872,7 @@ static void diff_resolve_rename_copy(voi
 				pp = q->queue[j];
 				if (strcmp(pp->one->path, p->one->path))
 					continue; /* not us */
-				if (!pp->score)
+				if (!DIFF_PAIR_RENAME(pp))
 					continue; /* not a rename/copy */
 				/* pp is a rename/copy from the same source */
 				p->status = 'C';
diff --git a/diffcore-rename.c b/diffcore-rename.c
--- a/diffcore-rename.c
+++ b/diffcore-rename.c
@@ -190,7 +190,7 @@ static void record_rename_pair(struct di
 	fill_filespec(two, dst->sha1, dst->mode);
 
 	dp = diff_queue(renq, one, two);
-	dp->score = score ? : 1; /* make sure it is at least 1 */
+	dp->score = score;
 	dp->source_stays = rename_src[src_index].src_stays;
 	rename_dst[dst_index].pair = dp;
 }
diff --git a/diffcore.h b/diffcore.h
--- a/diffcore.h
+++ b/diffcore.h
@@ -42,15 +42,15 @@ extern void diff_free_filespec_data(stru
 struct diff_filepair {
 	struct diff_filespec *one;
 	struct diff_filespec *two;
-	unsigned short int score; /* only valid when one and two are
-				   * different paths
-				   */
+	unsigned short int score;
 	char source_stays; /* all of R/C are copies */
 	char status; /* M C R N D U (see Documentation/diff-format.txt) */
 };
 #define DIFF_PAIR_UNMERGED(p) \
 	(!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two))
 
+#define DIFF_PAIR_RENAME(p) (strcmp((p)->one->path, (p)->two->path))
+
 #define DIFF_PAIR_TYPE_CHANGED(p) \
 	((S_IFMT & (p)->one->mode) != (S_IFMT & (p)->two->mode))
 
------------------------------------------------
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help