Re: [PATCH 6/7] diff: handle sha1 abbreviations outside of repository
- From
Jeff King <peff@peff.net>
- Date
- Oct 20, 2016, 06:31 UTC
- Message-ID
- <20161020063120.auxwjybljo4hz3p5@sigill.intra.peff.net>
- In-Reply-To
- <20161020062125.3iqej3bpdoitr3fz@sigill.intra.peff.net>
On Thu, Oct 20, 2016 at 02:21:25AM -0400, Jeff King wrote:
Show 20 quoted lines
> diff --git a/diff.c b/diff.c
> index 8f0f309..ef11001 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -3049,6 +3049,19 @@ static int similarity_index(struct diff_filepair *p)
> return p->score * 100 / MAX_SCORE;
> }
>
> +static const char *diff_abbrev_oid(const struct object_id *oid, int abbrev)
> +{
> + if (startup_info->have_repository)
> + return find_unique_abbrev(oid->hash, abbrev);
> + else {
> + char *hex = oid_to_hex(oid);
> + if (abbrev < 0 || abbrev > GIT_SHA1_HEXSZ)
> + die("BUG: oid abbreviation out of range: %d", abbrev);
> + hex[abbrev] = '\0';
> + return hex;
> + }
> +}Note that this function has a semantic (but not textual) conflict with lt/auto-abbrev in 'next', as it sets DEFAULT_ABBREV to -1.
The resolution is:
diff --git a/diff.c b/diff.c index cab811e..4c09314 100644 --- a/diff.c +++ b/diff.c @@ -3102,7 +3102,9 @@ static const char *diff_abbrev_oid(const struct object_id *oid, int abbrev) return find_unique_abbrev(oid->hash, abbrev); else { char *hex = oid_to_hex(oid); - if (abbrev < 0 || abbrev > GIT_SHA1_HEXSZ) + if (abbrev < 0) + abbrev = FALLBACK_DEFAULT_ABBREV; + if (abbrev > GIT_SHA1_HEXSZ) die("BUG: oid abbreviation out of range: %d", abbrev); hex[abbrev] = '\0'; return hex; This logic could be pushed down into the find_unique_abbrev() code (where it _would_ just cause a textual conflict). I preferred to keep it up here because other callers could conceivably want to handle the non-repo case in some different way (e.g., by not abbreviating at all). -Peff