Web lists-archives.com

Re: [PATCH v2 3/6] diff: diff_aligned_abbrev: remove ellipsis after abbreviated SHA-1 value




Neither Git nor the user are in need of this (visual) aid anymore, but
we must offer a transition period.

Also, fix a typo: "abbbreviated" ---> "abbreviated".

Signed-off-by: Ann T Ropea <bedhanger@xxxxxx>
---
v2: rename patch series & focus on removal of ellipses
 diff.c | 69 +++++++++++++++++++++++++++++++++++++-----------------------------
 1 file changed, 39 insertions(+), 30 deletions(-)

diff --git a/diff.c b/diff.c
index 0763e89263ef..9709dc37c6d7 100644
--- a/diff.c
+++ b/diff.c
@@ -4902,41 +4902,50 @@ const char *diff_aligned_abbrev(const struct object_id *oid, int len)
 	int abblen;
 	const char *abbrev;
 
+	/* Do we want all 40 hex characters?
+	 */
 	if (len == GIT_SHA1_HEXSZ)
 		return oid_to_hex(oid);
 
-	abbrev = diff_abbrev_oid(oid, len);
-	abblen = strlen(abbrev);
-
-	/*
-	 * In well-behaved cases, where the abbbreviated result is the
-	 * same as the requested length, append three dots after the
-	 * abbreviation (hence the whole logic is limited to the case
-	 * where abblen < 37); when the actual abbreviated result is a
-	 * bit longer than the requested length, we reduce the number
-	 * of dots so that they match the well-behaved ones.  However,
-	 * if the actual abbreviation is longer than the requested
-	 * length by more than three, we give up on aligning, and add
-	 * three dots anyway, to indicate that the output is not the
-	 * full object name.  Yes, this may be suboptimal, but this
-	 * appears only in "diff --raw --abbrev" output and it is not
-	 * worth the effort to change it now.  Note that this would
-	 * likely to work fine when the automatic sizing of default
-	 * abbreviation length is used--we would be fed -1 in "len" in
-	 * that case, and will end up always appending three-dots, but
-	 * the automatic sizing is supposed to give abblen that ensures
-	 * uniqueness across all objects (statistically speaking).
+	/* An abbreviated value is fine, possibly followed by an
+	 * ellipsis.
 	 */
-	if (abblen < GIT_SHA1_HEXSZ - 3) {
-		static char hex[GIT_MAX_HEXSZ + 1];
-		if (len < abblen && abblen <= len + 2)
-			xsnprintf(hex, sizeof(hex), "%s%.*s", abbrev, len+3-abblen, "..");
-		else
-			xsnprintf(hex, sizeof(hex), "%s...", abbrev);
-		return hex;
-	}
+	if (print_sha1_ellipsis) {
+		abbrev = diff_abbrev_oid(oid, len);
+		abblen = strlen(abbrev);
+
+		/*
+		 * In well-behaved cases, where the abbreviated result is the
+		 * same as the requested length, append three dots after the
+		 * abbreviation (hence the whole logic is limited to the case
+		 * where abblen < 37); when the actual abbreviated result is a
+		 * bit longer than the requested length, we reduce the number
+		 * of dots so that they match the well-behaved ones.  However,
+		 * if the actual abbreviation is longer than the requested
+		 * length by more than three, we give up on aligning, and add
+		 * three dots anyway, to indicate that the output is not the
+		 * full object name.  Yes, this may be suboptimal, but this
+		 * appears only in "diff --raw --abbrev" output and it is not
+		 * worth the effort to change it now.  Note that this would
+		 * likely to work fine when the automatic sizing of default
+		 * abbreviation length is used--we would be fed -1 in "len" in
+		 * that case, and will end up always appending three-dots, but
+		 * the automatic sizing is supposed to give abblen that ensures
+		 * uniqueness across all objects (statistically speaking).
+		 */
+		if (abblen < GIT_SHA1_HEXSZ - 3) {
+			static char hex[GIT_MAX_HEXSZ + 1];
+			if (len < abblen && abblen <= len + 2)
+				xsnprintf(hex, sizeof(hex), "%s%.*s", abbrev, len+3-abblen, "..");
+			else
+				xsnprintf(hex, sizeof(hex), "%s...", abbrev);
+			return hex;
+		}
 
-	return oid_to_hex(oid);
+		return oid_to_hex(oid);
+	} else {
+		return diff_abbrev_oid(oid, len);
+	}
 }
 
 static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt)
-- 
2.13.6