diff options
author | Junio C Hamano <gitster@pobox.com> | 2016-10-28 09:01:23 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-10-28 09:01:23 -0700 |
commit | 0582a34f525a95a1c592f111fbf64dd45a4d8e70 (patch) | |
tree | 46cf11e7891d25ae1ee88212dd0d8bbacfff59de | |
parent | Merge branch 'rs/pretty-format-color-doc-fix' into maint (diff) | |
parent | diff_unique_abbrev(): document its assumption and limitation (diff) | |
download | tgif-0582a34f525a95a1c592f111fbf64dd45a4d8e70.tar.xz |
Merge branch 'jc/diff-unique-abbrev-comments' into maint
A bit more comments in a tricky code.
* jc/diff-unique-abbrev-comments:
diff_unique_abbrev(): document its assumption and limitation
-rw-r--r-- | diff.c | 23 |
1 files changed, 22 insertions, 1 deletions
@@ -4089,7 +4089,8 @@ void diff_free_filepair(struct diff_filepair *p) free(p); } -/* This is different from find_unique_abbrev() in that +/* + * This is different from find_unique_abbrev() in that * it stuffs the result with dots for alignment. */ const char *diff_unique_abbrev(const unsigned char *sha1, int len) @@ -4101,6 +4102,26 @@ const char *diff_unique_abbrev(const unsigned char *sha1, int len) abbrev = find_unique_abbrev(sha1, 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). + */ if (abblen < 37) { static char hex[41]; if (len < abblen && abblen <= len + 2) |