I went ahead and took a stab at a solution. My solution is more aggressive than a warning, I actually prevent the creation of ambiguous refs. My changes are also in refs.c, which may not be appropriate, but it seemed like the natural place. I have never contributed to Git (in fact this is my first dive into the source) and my C is a bit rusty, so bear with me, this is just a suggestion: --- refs.c | 31 ++++++++++++++++++++++++------- 1 files changed, 24 insertions(+), 7 deletions(-) diff --git a/refs.c b/refs.c index 89228e2..12ccdac 100644 --- a/refs.c +++ b/refs.c @@ -359,14 +359,24 @@ struct string_slice { const char *str; }; +static int ref_entry_ncmp(const void *key_, const void *ent_, int (*cmp_fn)(const char *, const char *, size_t)) +{ + const struct string_slice *key = key_; + const struct ref_entry *ent = *(const struct ref_entry * const *)ent_; + int cmp = cmp_fn(key->str, ent->name, key->len); + if (cmp) + return cmp; + return '\0' - (unsigned char)ent->name[key->len]; +} + static int ref_entry_cmp_sslice(const void *key_, const void *ent_) { - const struct string_slice *key = key_; - const struct ref_entry *ent = *(const struct ref_entry * const *)ent_; - int cmp = strncmp(key->str, ent->name, key->len); - if (cmp) - return cmp; - return '\0' - (unsigned char)ent->name[key->len]; + return ref_entry_ncmp(key_, ent_, strncmp); +} + +static int ref_entry_casecmp_sslice(const void *key_, const void *ent_) +{ + return ref_entry_ncmp(key_, ent_, strncasecmp); } /* @@ -378,6 +388,7 @@ static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len) { struct ref_entry **r; struct string_slice key; + int (*cmp_fn)(const void *, const void *); if (refname == NULL || !dir->nr) return -1; @@ -385,8 +396,14 @@ static int search_ref_dir(struct ref_dir *dir, const char *refname, size_t len) sort_ref_dir(dir); key.len = len; key.str = refname; + + if(ignore_case) + cmp_fn = ref_entry_casecmp_sslice; + else + cmp_fn = ref_entry_cmp_sslice; + r = bsearch(&key, dir->entries, dir->nr, sizeof(*dir->entries), - ref_entry_cmp_sslice); + cmp_fn); if (r == NULL) return -1; -- -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html