mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 18:08:11 +00:00
Merge pull request #468 from nulltoken/ntk/fix/issue-465
Status: fix segfault (#465) and order issues
This commit is contained in:
commit
d3104fa0a3
35
src/status.c
35
src/status.c
@ -183,8 +183,9 @@ static int process_folder(struct status_st *st, const git_tree_entry *tree_entry
|
||||
git_object *subtree = NULL;
|
||||
git_tree *pushed_tree = NULL;
|
||||
int error, pushed_tree_position = 0;
|
||||
git_otype tree_entry_type;
|
||||
git_otype tree_entry_type = GIT_OBJ_BAD;
|
||||
|
||||
if (tree_entry != NULL) {
|
||||
tree_entry_type = git_tree_entry_type(tree_entry);
|
||||
|
||||
switch (tree_entry_type) {
|
||||
@ -204,6 +205,7 @@ static int process_folder(struct status_st *st, const git_tree_entry *tree_entry
|
||||
default:
|
||||
error = git__throw(GIT_EINVALIDTYPE, "Unexpected tree entry type"); /* TODO: How should we deal with submodules? */
|
||||
}
|
||||
}
|
||||
|
||||
if (full_path != NULL && path_type == GIT_STATUS_PATH_FOLDER)
|
||||
error = alphasorted_futils_direach(full_path, GIT_PATH_MAX, dirent_cb, st);
|
||||
@ -289,7 +291,7 @@ static int path_type_from(char *full_path, int is_dir)
|
||||
if (!is_dir)
|
||||
return GIT_STATUS_PATH_FILE;
|
||||
|
||||
if (!git__suffixcmp(full_path, "/" DOT_GIT))
|
||||
if (!git__suffixcmp(full_path, "/" DOT_GIT "/"))
|
||||
return GIT_STATUS_PATH_IGNORE;
|
||||
|
||||
return GIT_STATUS_PATH_FOLDER;
|
||||
@ -358,7 +360,13 @@ static int dirent_cb(void *state, char *a)
|
||||
|
||||
if (m != NULL) {
|
||||
st->head_tree_relative_path[st->head_tree_relative_path_len] = '\0';
|
||||
|
||||
/* When the tree entry is a folder, append a forward slash to its name */
|
||||
if (git_tree_entry_type(m) == GIT_OBJ_TREE)
|
||||
git_path_join_n(st->head_tree_relative_path, 3, st->head_tree_relative_path, m->filename, "");
|
||||
else
|
||||
git_path_join(st->head_tree_relative_path, st->head_tree_relative_path, m->filename);
|
||||
|
||||
m_name = st->head_tree_relative_path;
|
||||
} else
|
||||
m_name = NULL;
|
||||
@ -376,7 +384,7 @@ static int dirent_cb(void *state, char *a)
|
||||
if((error = determine_status(st, pm != NULL, pi != NULL, pa != NULL, m, entry, a, status_path(pm, pi, pa), path_type)) < GIT_SUCCESS)
|
||||
return git__rethrow(error, "An error occured while determining the status of '%s'", a);
|
||||
|
||||
if (pa != NULL)
|
||||
if ((pa != NULL) || (path_type == GIT_STATUS_PATH_FOLDER))
|
||||
return GIT_SUCCESS;
|
||||
}
|
||||
}
|
||||
@ -569,19 +577,32 @@ struct alphasorted_dirent_info {
|
||||
|
||||
static struct alphasorted_dirent_info *alphasorted_dirent_info_new(const char *path)
|
||||
{
|
||||
int is_dir;
|
||||
int is_dir, size;
|
||||
struct alphasorted_dirent_info *di;
|
||||
|
||||
is_dir = git_futils_isdir(path) == GIT_SUCCESS ? 1 : 0;
|
||||
size = sizeof(*di) + (is_dir ? GIT_PATH_MAX : strlen(path)) + 2;
|
||||
|
||||
di = git__malloc(sizeof(*di) + (is_dir ? GIT_PATH_MAX : strlen(path)) + 1);
|
||||
di = git__malloc(size);
|
||||
if (di == NULL)
|
||||
return NULL;
|
||||
|
||||
memset(di, 0x0, sizeof(*di));
|
||||
memset(di, 0x0, size);
|
||||
|
||||
strcpy(di->path, path);
|
||||
di->is_dir = is_dir;
|
||||
|
||||
if (is_dir) {
|
||||
di->is_dir = 1;
|
||||
|
||||
/*
|
||||
* Append a forward slash to the name to force folders
|
||||
* to be ordered in a similar way than in a tree
|
||||
*
|
||||
* The file "subdir" should appear before the file "subdir.txt"
|
||||
* The folder "subdir" should appear after the file "subdir.txt"
|
||||
*/
|
||||
di->path[strlen(path)] = '/';
|
||||
}
|
||||
|
||||
return di;
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
tests/resources/status/subdir.txt
Normal file
BIN
tests/resources/status/subdir.txt
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user