Introduce "base_name_compare()" helper function
authorLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 20 May 2005 16:09:18 +0000 (09:09 -0700)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Fri, 20 May 2005 16:09:18 +0000 (09:09 -0700)
This one compares two pathnames that may be partial basenames, not
full paths. We need to get the path sorting right, since a directory
name will sort as if it had the final '/' at the end.

cache.h
read-cache.c

diff --git a/cache.h b/cache.h
index 2cfaa19..28e3dbd 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -173,6 +173,7 @@ extern void usage(const char *err);
 extern void die(const char *err, ...);
 extern int error(const char *err, ...);
 
+extern int base_name_compare(const char *name1, int len1, int mode1, const char *name2, int len2, int mode2);
 extern int cache_name_compare(const char *name1, int len1, const char *name2, int len2);
 
 extern void *read_object_with_reference(const unsigned char *sha1,
index 732f483..b3eec84 100644 (file)
@@ -74,6 +74,25 @@ int ce_match_stat(struct cache_entry *ce, struct stat *st)
        return changed;
 }
 
+int base_name_compare(const char *name1, int len1, int mode1,
+                     const char *name2, int len2, int mode2)
+{
+       unsigned char c1, c2;
+       int len = len1 < len2 ? len1 : len2;
+       int cmp;
+
+       cmp = memcmp(name1, name2, len);
+       if (cmp)
+               return cmp;
+       c1 = name1[len];
+       c2 = name2[len];
+       if (!c1 && S_ISDIR(mode1))
+               c1 = '/';
+       if (!c2 && S_ISDIR(mode2))
+               c2 = '/';
+       return (c1 < c2) ? -1 : (c1 > c2) ? 1 : 0;
+}
+
 int cache_name_compare(const char *name1, int flags1, const char *name2, int flags2)
 {
        int len1 = flags1 & CE_NAMEMASK;