Skip to content

Commit

Permalink
Merge branch 'jc/diff-unique-abbrev-comments' into maint
Browse files Browse the repository at this point in the history
A bit more comments in a tricky code.

* jc/diff-unique-abbrev-comments:
  diff_unique_abbrev(): document its assumption and limitation
  • Loading branch information
gitster committed Oct 28, 2016
2 parents 4efd8e6 + d709f1f commit 0582a34
Showing 1 changed file with 22 additions and 1 deletion.
23 changes: 22 additions & 1 deletion diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit 0582a34

Please sign in to comment.