summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/fileops.c19
-rw-r--r--src/fileops.h4
-rw-r--r--src/tree.c20
3 files changed, 24 insertions, 19 deletions
diff --git a/src/fileops.c b/src/fileops.c
index 602862ca4..9938011d7 100644
--- a/src/fileops.c
+++ b/src/fileops.c
@@ -493,3 +493,22 @@ int gitfo_prettify_file_path(char *buffer_out, const char *path)
return GIT_SUCCESS;
}
+
+int gitfo_cmp_path(const char *name1, int len1, int isdir1,
+ const char *name2, int len2, int isdir2)
+{
+ int len = len1 < len2 ? len1 : len2;
+ int cmp;
+
+ cmp = memcmp(name1, name2, len);
+ if (cmp)
+ return cmp;
+ if (len1 < len2)
+ return ((!isdir1 && !isdir2) ? -1 :
+ (isdir1 ? '/' - name2[len1] : name2[len1] - '/'));
+ if (len1 > len2)
+ return ((!isdir1 && !isdir2) ? 1 :
+ (isdir2 ? name1[len2] - '/' : '/' - name1[len2]));
+ return 0;
+}
+
diff --git a/src/fileops.h b/src/fileops.h
index d333805d9..16e71038b 100644
--- a/src/fileops.h
+++ b/src/fileops.h
@@ -131,6 +131,10 @@ extern int gitfo_write_cached(gitfo_cache *ioc, void *buf, size_t len);
extern int gitfo_flush_cached(gitfo_cache *ioc);
extern int gitfo_close_cached(gitfo_cache *ioc);
+
+extern int gitfo_cmp_path(const char *name1, int len1, int isdir1,
+ const char *name2, int len2, int isdir2);
+
/**
* Clean up a provided absolute or relative directory path.
*
diff --git a/src/tree.c b/src/tree.c
index e8cf17979..a23be9151 100644
--- a/src/tree.c
+++ b/src/tree.c
@@ -40,30 +40,12 @@ int entry_search_cmp(const void *key, const void *array_member)
return strcmp(filename, entry->filename);
}
-static int cache_name_compare(const char *name1, int len1, int isdir1,
- const char *name2, int len2, int isdir2)
-{
- int len = len1 < len2 ? len1 : len2;
- int cmp;
-
- cmp = memcmp(name1, name2, len);
- if (cmp)
- return cmp;
- if (len1 < len2)
- return ((!isdir1 && !isdir2) ? -1 :
- (isdir1 ? '/' - name2[len1] : name2[len1] - '/'));
- if (len1 > len2)
- return ((!isdir1 && !isdir2) ? 1 :
- (isdir2 ? name1[len2] - '/' : '/' - name1[len2]));
- return 0;
-}
-
int entry_sort_cmp(const void *a, const void *b)
{
const git_tree_entry *entry_a = *(const git_tree_entry **)(a);
const git_tree_entry *entry_b = *(const git_tree_entry **)(b);
- return cache_name_compare(entry_a->filename, strlen(entry_a->filename),
+ return gitfo_cmp_path(entry_a->filename, strlen(entry_a->filename),
entry_a->attr & 040000,
entry_b->filename, strlen(entry_b->filename),
entry_b->attr & 040000);