]> git.ipfire.org Git - thirdparty/git.git/commitdiff
cache,tree: move basic name compare functions from read-cache to tree
authorElijah Newren <newren@gmail.com>
Sat, 22 Apr 2023 20:17:22 +0000 (20:17 +0000)
committerJunio C Hamano <gitster@pobox.com>
Mon, 24 Apr 2023 19:47:32 +0000 (12:47 -0700)
None of base_name_compare(), df_name_compare(), or name_compare()
depended upon a cache_entry or index_state in any way.  By moving these
functions to tree.h, half a dozen other files can stop depending upon
cache.h (though that change will be made in a later commit).

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
cache.h
read-cache.c
tree.c
tree.h

diff --git a/cache.h b/cache.h
index 502e4c0b11add890969a2234af51420f3bb5668c..591c67b0595a6d8ffdcff9696ff0dde4f709f1bc 100644 (file)
--- a/cache.h
+++ b/cache.h
@@ -557,11 +557,6 @@ extern int verify_ce_order;
 #define DATA_CHANGED    0x0020
 #define TYPE_CHANGED    0x0040
 
-int base_name_compare(const char *name1, size_t len1, int mode1,
-                     const char *name2, size_t len2, int mode2);
-int df_name_compare(const char *name1, size_t len1, int mode1,
-                   const char *name2, size_t len2, int mode2);
-int name_compare(const char *name1, size_t len1, const char *name2, size_t len2);
 int cmp_cache_name_compare(const void *a_, const void *b_);
 
 /* add */
index 8f00da4bf7acf86e006fa0b0b6527abd3fecb897..b3e2917ddc95ad796d9d0c71e1a8c4c087340233 100644 (file)
@@ -499,74 +499,6 @@ int ie_modified(struct index_state *istate,
        return 0;
 }
 
-int base_name_compare(const char *name1, size_t len1, int mode1,
-                     const char *name2, size_t len2, int mode2)
-{
-       unsigned char c1, c2;
-       size_t 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;
-}
-
-/*
- * df_name_compare() is identical to base_name_compare(), except it
- * compares conflicting directory/file entries as equal. Note that
- * while a directory name compares as equal to a regular file, they
- * then individually compare _differently_ to a filename that has
- * a dot after the basename (because '\0' < '.' < '/').
- *
- * This is used by routines that want to traverse the git namespace
- * but then handle conflicting entries together when possible.
- */
-int df_name_compare(const char *name1, size_t len1, int mode1,
-                   const char *name2, size_t len2, int mode2)
-{
-       unsigned char c1, c2;
-       size_t len = len1 < len2 ? len1 : len2;
-       int cmp;
-
-       cmp = memcmp(name1, name2, len);
-       if (cmp)
-               return cmp;
-       /* Directories and files compare equal (same length, same name) */
-       if (len1 == len2)
-               return 0;
-       c1 = name1[len];
-       if (!c1 && S_ISDIR(mode1))
-               c1 = '/';
-       c2 = name2[len];
-       if (!c2 && S_ISDIR(mode2))
-               c2 = '/';
-       if (c1 == '/' && !c2)
-               return 0;
-       if (c2 == '/' && !c1)
-               return 0;
-       return c1 - c2;
-}
-
-int name_compare(const char *name1, size_t len1, const char *name2, size_t len2)
-{
-       size_t min_len = (len1 < len2) ? len1 : len2;
-       int cmp = memcmp(name1, name2, min_len);
-       if (cmp)
-               return cmp;
-       if (len1 < len2)
-               return -1;
-       if (len1 > len2)
-               return 1;
-       return 0;
-}
-
 static int cache_name_stage_compare(const char *name1, int len1, int stage1,
                                    const char *name2, int len2, int stage2)
 {
diff --git a/tree.c b/tree.c
index 896b7f4776bf95a1fa9caf32db3d0e156362c820..f242a7ab6918a16d38e5efae801739dc41813a39 100644 (file)
--- a/tree.c
+++ b/tree.c
@@ -94,6 +94,74 @@ int read_tree(struct repository *r,
        return ret;
 }
 
+int base_name_compare(const char *name1, size_t len1, int mode1,
+                     const char *name2, size_t len2, int mode2)
+{
+       unsigned char c1, c2;
+       size_t 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;
+}
+
+/*
+ * df_name_compare() is identical to base_name_compare(), except it
+ * compares conflicting directory/file entries as equal. Note that
+ * while a directory name compares as equal to a regular file, they
+ * then individually compare _differently_ to a filename that has
+ * a dot after the basename (because '\0' < '.' < '/').
+ *
+ * This is used by routines that want to traverse the git namespace
+ * but then handle conflicting entries together when possible.
+ */
+int df_name_compare(const char *name1, size_t len1, int mode1,
+                   const char *name2, size_t len2, int mode2)
+{
+       unsigned char c1, c2;
+       size_t len = len1 < len2 ? len1 : len2;
+       int cmp;
+
+       cmp = memcmp(name1, name2, len);
+       if (cmp)
+               return cmp;
+       /* Directories and files compare equal (same length, same name) */
+       if (len1 == len2)
+               return 0;
+       c1 = name1[len];
+       if (!c1 && S_ISDIR(mode1))
+               c1 = '/';
+       c2 = name2[len];
+       if (!c2 && S_ISDIR(mode2))
+               c2 = '/';
+       if (c1 == '/' && !c2)
+               return 0;
+       if (c2 == '/' && !c1)
+               return 0;
+       return c1 - c2;
+}
+
+int name_compare(const char *name1, size_t len1, const char *name2, size_t len2)
+{
+       size_t min_len = (len1 < len2) ? len1 : len2;
+       int cmp = memcmp(name1, name2, min_len);
+       if (cmp)
+               return cmp;
+       if (len1 < len2)
+               return -1;
+       if (len1 > len2)
+               return 1;
+       return 0;
+}
+
 struct tree *lookup_tree(struct repository *r, const struct object_id *oid)
 {
        struct object *obj = lookup_object(r, oid);
diff --git a/tree.h b/tree.h
index 8e3c6d441cc8b7965c471900deece76aa7f2f73b..1b5ecbda6b335b4962ee2150534dfd8c0a73964c 100644 (file)
--- a/tree.h
+++ b/tree.h
@@ -29,6 +29,15 @@ void free_tree_buffer(struct tree *tree);
 /* Parses and returns the tree in the given ent, chasing tags and commits. */
 struct tree *parse_tree_indirect(const struct object_id *oid);
 
+/*
+ * Functions for comparing pathnames
+ */
+int base_name_compare(const char *name1, size_t len1, int mode1,
+                     const char *name2, size_t len2, int mode2);
+int df_name_compare(const char *name1, size_t len1, int mode1,
+                   const char *name2, size_t len2, int mode2);
+int name_compare(const char *name1, size_t len1,
+                const char *name2, size_t len2);
 
 #define READ_TREE_RECURSIVE 1
 typedef int (*read_tree_fn_t)(const struct object_id *, struct strbuf *, const char *, unsigned int, void *);