git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Branch Name Case Sensitivity

From
LHLee Hopkins <leerhop@gmail.com>
Date
Mar 1, 2014, 02:42 UTC
Message-ID
<CAJHY66EP539ZsLJcmHcnRQcOqcLqXK-M45wME9DkKkqmumg8fA@mail.gmail.com>
In-Reply-To
<xmqq7g8eu891.fsf@gitster.dls.corp.google.com>

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;
--
Previous: Junio C HamanoNext: Torsten Bögershausen
Message 14 of 27 in “Branch Name Case Sensitivity”
  1. Lee HopkinsFeb 26, 2014
  2. Junio C HamanoFeb 27, 2014
  3. Torsten BögershausenFeb 27, 2014
  4. Lee HopkinsFeb 27, 2014
  5. Michael HaggertyFeb 27, 2014
  6. Karsten BleesFeb 27, 2014
  7. Lee HopkinsFeb 27, 2014
  8. Johannes SixtFeb 28, 2014
  9. Karsten BleesFeb 28, 2014
  10. Lee HopkinsFeb 28, 2014
  11. Junio C HamanoFeb 28, 2014
  12. Duy NguyenFeb 28, 2014
  13. Junio C HamanoFeb 28, 2014
  14. Lee HopkinsMar 1, 2014
  15. Torsten BögershausenMar 1, 2014
  16. Lee HopkinsMar 1, 2014
  17. Karsten BleesMar 3, 2014
  18. Lee HopkinsMar 3, 2014
  19. Junio C HamanoMar 3, 2014
  20. Karsten BleesMar 4, 2014
  21. Torsten BögershausenMar 4, 2014
  22. Lee HopkinsMar 5, 2014
  23. Michael HaggertyFeb 28, 2014
  24. Duy NguyenFeb 28, 2014
  25. Michael HaggertyFeb 28, 2014
  26. Stephen LeakeFeb 28, 2014
  27. Michael HaggertyFeb 28, 2014

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.