Unverified Commit 429bb357 by Edward Thomson Committed by GitHub

Merge pull request #4318 from Uncommon/amend_status

Add git_status_file_at
parents 344b4ead 4ccacdc8
...@@ -173,12 +173,16 @@ typedef enum { ...@@ -173,12 +173,16 @@ typedef enum {
* The `pathspec` is an array of path patterns to match (using * The `pathspec` is an array of path patterns to match (using
* fnmatch-style matching), or just an array of paths to match exactly if * fnmatch-style matching), or just an array of paths to match exactly if
* `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags. * `GIT_STATUS_OPT_DISABLE_PATHSPEC_MATCH` is specified in the flags.
*
* The `baseline` is the tree to be used for comparison to the working directory
* and index; defaults to HEAD.
*/ */
typedef struct { typedef struct {
unsigned int version; unsigned int version;
git_status_show_t show; git_status_show_t show;
unsigned int flags; unsigned int flags;
git_strarray pathspec; git_strarray pathspec;
git_tree *baseline;
} git_status_options; } git_status_options;
#define GIT_STATUS_OPTIONS_VERSION 1 #define GIT_STATUS_OPTIONS_VERSION 1
......
...@@ -280,12 +280,16 @@ int git_status_list_new( ...@@ -280,12 +280,16 @@ int git_status_list_new(
if ((error = git_repository__ensure_not_bare(repo, "status")) < 0 || if ((error = git_repository__ensure_not_bare(repo, "status")) < 0 ||
(error = git_repository_index(&index, repo)) < 0) (error = git_repository_index(&index, repo)) < 0)
return error; return error;
/* if there is no HEAD, that's okay - we'll make an empty iterator */ if (opts != NULL && opts->baseline != NULL) {
if ((error = git_repository_head_tree(&head, repo)) < 0) { head = opts->baseline;
if (error != GIT_ENOTFOUND && error != GIT_EUNBORNBRANCH) } else {
goto done; /* if there is no HEAD, that's okay - we'll make an empty iterator */
giterr_clear(); if ((error = git_repository_head_tree(&head, repo)) < 0) {
if (error != GIT_ENOTFOUND && error != GIT_EUNBORNBRANCH)
goto done;
giterr_clear();
}
} }
/* refresh index from disk unless prevented */ /* refresh index from disk unless prevented */
...@@ -377,7 +381,8 @@ done: ...@@ -377,7 +381,8 @@ done:
*out = status; *out = status;
git_tree_free(head); if (opts == NULL || opts->baseline != head)
git_tree_free(head);
git_index_free(index); git_index_free(index);
return error; return error;
......
...@@ -1280,3 +1280,34 @@ void test_status_worktree__with_directory_in_pathlist(void) ...@@ -1280,3 +1280,34 @@ void test_status_worktree__with_directory_in_pathlist(void)
git_status_list_free(statuslist); git_status_list_free(statuslist);
} }
void test_status_worktree__at_head_parent(void)
{
git_repository *repo = cl_git_sandbox_init("empty_standard_repo");
git_status_options opts = GIT_STATUS_OPTIONS_INIT;
git_status_list *statuslist;
git_tree *parent_tree;
const git_status_entry *status;
cl_git_mkfile("empty_standard_repo/file1", "ping");
stage_and_commit(repo, "file1");
cl_git_pass(git_repository_head_tree(&parent_tree, repo));
cl_git_mkfile("empty_standard_repo/file2", "pong");
stage_and_commit(repo, "file2");
cl_git_rewritefile("empty_standard_repo/file2", "pyng");
opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR;
opts.baseline = parent_tree;
cl_git_pass(git_status_list_new(&statuslist, repo, &opts));
cl_assert_equal_sz(1, git_status_list_entrycount(statuslist));
status = git_status_byindex(statuslist, 0);
cl_assert(status != NULL);
cl_assert_equal_s("file2", status->index_to_workdir->old_file.path);
cl_assert_equal_i(GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_NEW, status->status);
git_tree_free(parent_tree);
git_status_list_free(statuslist);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment