On Mon, Jan 08, 2018 at 05:20:29AM -0500, Jeff King wrote: > I.e., what if we did something like this: > > diff --git a/sha1_name.c b/sha1_name.c > index 611c7d24dd..04c661ba85 100644 > --- a/sha1_name.c > +++ b/sha1_name.c > @@ -600,6 +600,15 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len) > if (len == GIT_SHA1_HEXSZ || !len) > return GIT_SHA1_HEXSZ; > > + /* > + * A default length of 10 implies a repository big enough that it's > + * getting expensive to double check the ambiguity of each object, > + * and the chance that any particular object of interest has a > + * collision is low. > + */ > + if (len >= 10) > + return len; > + Oops, this really needs to terminate the string in addition to returning the length (so it was always printing 40 characters in most cases). The correct patch is below, but it performs the same. diff --git a/sha1_name.c b/sha1_name.c index 611c7d24dd..5921298a80 100644 --- a/sha1_name.c +++ b/sha1_name.c @@ -600,6 +600,17 @@ int find_unique_abbrev_r(char *hex, const unsigned char *sha1, int len) if (len == GIT_SHA1_HEXSZ || !len) return GIT_SHA1_HEXSZ; + /* + * A default length of 10 implies a repository big enough that it's + * getting expensive to double check the ambiguity of each object, + * and the chance that any particular object of interest has a + * collision is low. + */ + if (len >= 10) { + hex[len] = 0; + return len; + } + mad.init_len = len; mad.cur_len = len; mad.hex = hex;