summaryrefslogtreecommitdiff
path: root/src/status.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/status.c')
-rw-r--r--src/status.c49
1 files changed, 15 insertions, 34 deletions
diff --git a/src/status.c b/src/status.c
index a92693851..72ee7b049 100644
--- a/src/status.c
+++ b/src/status.c
@@ -678,28 +678,15 @@ cleanup:
*
*/
-struct alphasorted_dirent_info {
- int is_dir;
- char path[GIT_FLEX_ARRAY]; /* more */
-};
-
-static struct alphasorted_dirent_info *alphasorted_dirent_info_new(const git_buf *path)
+static char *alphasorted_dirent_info_new(const git_buf *path)
{
- int is_dir, size;
- struct alphasorted_dirent_info *di;
-
- is_dir = git_futils_isdir(path->ptr) == GIT_SUCCESS ? 1 : 0;
- size = sizeof(*di) + path->size + is_dir + 1;
-
- di = git__calloc(size, 1);
- if (di == NULL)
- return NULL;
+ char *di = git__malloc(path->size + 2);
+ if (!di)
+ return di;
- git_buf_copy_cstr(di->path, path->size + 1, path);
-
- if (is_dir) {
- di->is_dir = 1;
+ git_buf_copy_cstr(di, path->size + 1, path);
+ if (git_futils_isdir(path->ptr) == GIT_SUCCESS) {
/*
* Append a forward slash to the name to force folders
* to be ordered in a similar way than in a tree
@@ -707,23 +694,16 @@ static struct alphasorted_dirent_info *alphasorted_dirent_info_new(const git_buf
* The file "subdir" should appear before the file "subdir.txt"
* The folder "subdir" should appear after the file "subdir.txt"
*/
- di->path[path->size] = '/';
+ di[path->size] = '/';
+ di[path->size + 1] = '\0';
}
return di;
}
-static int alphasorted_dirent_info_cmp(const void *a, const void *b)
-{
- struct alphasorted_dirent_info *stra = (struct alphasorted_dirent_info *)a;
- struct alphasorted_dirent_info *strb = (struct alphasorted_dirent_info *)b;
-
- return strcmp(stra->path, strb->path);
-}
-
static int alphasorted_dirent_cb(void *state, git_buf *full_path)
{
- struct alphasorted_dirent_info *entry;
+ char *entry;
git_vector *entry_names;
entry_names = (git_vector *)state;
@@ -745,13 +725,13 @@ static int alphasorted_futils_direach(
int (*fn)(void *, git_buf *),
void *arg)
{
- struct alphasorted_dirent_info *entry;
+ char *entry;
git_vector entry_names;
unsigned int idx;
int error = GIT_SUCCESS;
git_buf entry_path = GIT_BUF_INIT;
- if (git_vector_init(&entry_names, 16, alphasorted_dirent_info_cmp) < GIT_SUCCESS)
+ if (git_vector_init(&entry_names, 16, git__strcmp_cb) < GIT_SUCCESS)
return GIT_ENOMEM;
error = git_futils_direach(path, alphasorted_dirent_cb, &entry_names);
@@ -759,17 +739,18 @@ static int alphasorted_futils_direach(
git_vector_sort(&entry_names);
for (idx = 0; idx < entry_names.length; ++idx) {
- entry = (struct alphasorted_dirent_info *)git_vector_get(&entry_names, idx);
+ entry = (char *)git_vector_get(&entry_names, idx);
/* We have to walk the entire vector even if there was an error,
* in order to free up memory, but we stop making callbacks after
* an error.
*/
if (error == GIT_SUCCESS)
- error = git_buf_sets(&entry_path, entry->path);
+ error = git_buf_sets(&entry_path, entry);
if (error == GIT_SUCCESS) {
- ((struct status_st *)arg)->is_dir = entry->is_dir;
+ ((struct status_st *)arg)->is_dir =
+ (entry[entry_path.size - 1] == '/');
error = fn(arg, &entry_path);
}