From: Linus Torvalds Date: Fri, 20 May 2005 16:09:18 +0000 (-0700) Subject: Introduce "base_name_compare()" helper function X-Git-Tag: v0.99~528 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=958ba6c96eb58b359c855c9d07e3e45072f0503e;p=git.git Introduce "base_name_compare()" helper function 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. --- diff --git a/cache.h b/cache.h index 2cfaa195..28e3dbdd 100644 --- 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, diff --git a/read-cache.c b/read-cache.c index 732f483c..b3eec846 100644 --- a/read-cache.c +++ b/read-cache.c @@ -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;