mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-29 17:05:49 +00:00
status: handle subdirs for git_status_file
This commit is contained in:
parent
6b251490a8
commit
34dfea2774
37
src/status.c
37
src/status.c
@ -152,6 +152,35 @@ static void recurse_tree_entries(git_tree *tree, git_vector *entries, char *path
|
|||||||
git_tree_close(tree);
|
git_tree_close(tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void recurse_tree_entry(git_tree *tree, struct status_entry *e, const char *path)
|
||||||
|
{
|
||||||
|
char *dir_sep;
|
||||||
|
char buffer[GIT_PATH_MAX];
|
||||||
|
const git_tree_entry *tree_entry;
|
||||||
|
git_tree *subtree;
|
||||||
|
|
||||||
|
strcpy(buffer, path);
|
||||||
|
|
||||||
|
dir_sep = strchr(buffer, '/');
|
||||||
|
if (dir_sep) {
|
||||||
|
*dir_sep = '\0';
|
||||||
|
|
||||||
|
tree_entry = git_tree_entry_byname(tree, buffer);
|
||||||
|
if (tree_entry != NULL) {
|
||||||
|
if (git_tree_lookup(&subtree, tree->object.repo, &tree_entry->oid) == GIT_SUCCESS) {
|
||||||
|
recurse_tree_entry(subtree, e, dir_sep+1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tree_entry = git_tree_entry_byname(tree, path);
|
||||||
|
if (tree_entry != NULL) {
|
||||||
|
git_oid_cpy(&e->head_oid, &tree_entry->oid);
|
||||||
|
}
|
||||||
|
git_tree_close(tree);
|
||||||
|
}
|
||||||
|
|
||||||
static int workdir_path_len;
|
static int workdir_path_len;
|
||||||
static int dirent_cb(void *state, char *full_path)
|
static int dirent_cb(void *state, char *full_path)
|
||||||
{
|
{
|
||||||
@ -320,7 +349,6 @@ int git_status_file(unsigned int *status_flags, git_repository *repo, const char
|
|||||||
git_tree *tree;
|
git_tree *tree;
|
||||||
git_reference *head_ref, *resolved_head_ref;
|
git_reference *head_ref, *resolved_head_ref;
|
||||||
git_commit *head_commit;
|
git_commit *head_commit;
|
||||||
const git_tree_entry *tree_entry;
|
|
||||||
|
|
||||||
assert(status_flags);
|
assert(status_flags);
|
||||||
|
|
||||||
@ -342,12 +370,7 @@ int git_status_file(unsigned int *status_flags, git_repository *repo, const char
|
|||||||
git_commit_lookup(&head_commit, repo, git_reference_oid(resolved_head_ref));
|
git_commit_lookup(&head_commit, repo, git_reference_oid(resolved_head_ref));
|
||||||
|
|
||||||
git_commit_tree(&tree, head_commit);
|
git_commit_tree(&tree, head_commit);
|
||||||
// TODO: handle subdirectories by walking into subtrees
|
recurse_tree_entry(tree, e, path);
|
||||||
tree_entry = git_tree_entry_byname(tree, path);
|
|
||||||
if (tree_entry != NULL) {
|
|
||||||
git_oid_cpy(&e->head_oid, &tree_entry->oid);
|
|
||||||
}
|
|
||||||
git_tree_close(tree);
|
|
||||||
|
|
||||||
// Find file in Workdir
|
// Find file in Workdir
|
||||||
workdir_path_len = strlen(repo->path_workdir);
|
workdir_path_len = strlen(repo->path_workdir);
|
||||||
|
@ -68,6 +68,11 @@ static const char *entry_paths[] = {
|
|||||||
"staged_new_file",
|
"staged_new_file",
|
||||||
"staged_new_file_deleted_file",
|
"staged_new_file_deleted_file",
|
||||||
"staged_new_file_modified_file",
|
"staged_new_file_modified_file",
|
||||||
|
|
||||||
|
"subdir/current_file",
|
||||||
|
"subdir/deleted_file",
|
||||||
|
"subdir/modified_file",
|
||||||
|
"subdir/new_file",
|
||||||
};
|
};
|
||||||
static const unsigned int entry_statuses[] = {
|
static const unsigned int entry_statuses[] = {
|
||||||
GIT_STATUS_CURRENT,
|
GIT_STATUS_CURRENT,
|
||||||
@ -82,8 +87,13 @@ static const unsigned int entry_statuses[] = {
|
|||||||
GIT_STATUS_INDEX_NEW,
|
GIT_STATUS_INDEX_NEW,
|
||||||
GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED,
|
GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_DELETED,
|
||||||
GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED,
|
GIT_STATUS_INDEX_NEW | GIT_STATUS_WT_MODIFIED,
|
||||||
|
|
||||||
|
GIT_STATUS_CURRENT,
|
||||||
|
GIT_STATUS_WT_DELETED,
|
||||||
|
GIT_STATUS_WT_MODIFIED,
|
||||||
|
GIT_STATUS_WT_NEW,
|
||||||
};
|
};
|
||||||
#define ENTRY_COUNT 12
|
#define ENTRY_COUNT 16
|
||||||
|
|
||||||
static unsigned int get_expected_entry_status(const char *path)
|
static unsigned int get_expected_entry_status(const char *path)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user