mirror of
https://git.proxmox.com/git/libgit2
synced 2025-07-09 19:21:51 +00:00
Move the path comparison method to fileops.c
Signed-off-by: Vicent Marti <tanoku@gmail.com>
This commit is contained in:
parent
da7c3c71c0
commit
ccef1c9dc2
@ -493,3 +493,22 @@ int gitfo_prettify_file_path(char *buffer_out, const char *path)
|
|||||||
|
|
||||||
return GIT_SUCCESS;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -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_flush_cached(gitfo_cache *ioc);
|
||||||
extern int gitfo_close_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.
|
* Clean up a provided absolute or relative directory path.
|
||||||
*
|
*
|
||||||
|
20
src/tree.c
20
src/tree.c
@ -40,30 +40,12 @@ int entry_search_cmp(const void *key, const void *array_member)
|
|||||||
return strcmp(filename, entry->filename);
|
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)
|
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_a = *(const git_tree_entry **)(a);
|
||||||
const git_tree_entry *entry_b = *(const git_tree_entry **)(b);
|
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_a->attr & 040000,
|
||||||
entry_b->filename, strlen(entry_b->filename),
|
entry_b->filename, strlen(entry_b->filename),
|
||||||
entry_b->attr & 040000);
|
entry_b->attr & 040000);
|
||||||
|
Loading…
Reference in New Issue
Block a user