summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cache.h1
-rw-r--r--read-cache.c19
2 files changed, 20 insertions, 0 deletions
diff --git a/cache.h b/cache.h
index 2cfaa19..28e3dbd 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 732f483..b3eec84 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;