From 4fe0b0b34b3700d6da681498f0077a455d14812b Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Fri, 27 Sep 2013 17:07:06 -0700 Subject: [PATCH 1/3] Never consider submodules for stashing --- src/stash.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/stash.c b/src/stash.c index ab4a68575..7742eee19 100644 --- a/src/stash.c +++ b/src/stash.c @@ -316,6 +316,8 @@ static int build_workdir_tree( struct cb_data data = {0}; int error; + opts.flags = GIT_DIFF_IGNORE_SUBMODULES; + if ((error = git_commit_tree(&b_tree, b_commit)) < 0) goto cleanup; @@ -474,12 +476,14 @@ static int ensure_there_are_changes_to_stash( git_status_options opts = GIT_STATUS_OPTIONS_INIT; opts.show = GIT_STATUS_SHOW_INDEX_AND_WORKDIR; + opts.flags = GIT_STATUS_OPT_EXCLUDE_SUBMODULES; + if (include_untracked_files) - opts.flags = GIT_STATUS_OPT_INCLUDE_UNTRACKED | + opts.flags |= GIT_STATUS_OPT_INCLUDE_UNTRACKED | GIT_STATUS_OPT_RECURSE_UNTRACKED_DIRS; if (include_ignored_files) - opts.flags = GIT_STATUS_OPT_INCLUDE_IGNORED; + opts.flags |= GIT_STATUS_OPT_INCLUDE_IGNORED; error = git_status_foreach_ext(repo, &opts, is_dirty_cb, NULL); From 526d4c949c4b87c01e74a19ab47171ee08c9673a Mon Sep 17 00:00:00 2001 From: Justin Spahr-Summers Date: Fri, 27 Sep 2013 21:39:28 -0700 Subject: [PATCH 2/3] Test that submodules don't affect stashing --- tests-clar/stash/save.c | 68 ++++++++++++-------------------- tests-clar/stash/stash_helpers.c | 19 +++++++++ tests-clar/stash/stash_helpers.h | 5 +++ tests-clar/stash/submodules.c | 68 ++++++++++++++++++++++++++++++++ 4 files changed, 117 insertions(+), 43 deletions(-) create mode 100644 tests-clar/stash/submodules.c diff --git a/tests-clar/stash/save.c b/tests-clar/stash/save.c index 035b62279..3d92b26bd 100644 --- a/tests-clar/stash/save.c +++ b/tests-clar/stash/save.c @@ -113,33 +113,15 @@ $ git status --short cl_assert_equal_i(GIT_STATUS_WT_NEW, status); } -static void assert_status( - const char *path, - int status_flags) -{ - unsigned int status; - int error; - - error = git_status_file(&status, repo, path); - - if (status_flags < 0) { - cl_assert_equal_i(status_flags, error); - return; - } - - cl_assert_equal_i(0, error); - cl_assert_equal_i((unsigned int)status_flags, status); -} - void test_stash_save__can_keep_index(void) { cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_KEEP_INDEX)); - assert_status("what", GIT_STATUS_INDEX_MODIFIED); - assert_status("how", GIT_STATUS_INDEX_MODIFIED); - assert_status("who", GIT_STATUS_CURRENT); - assert_status("when", GIT_STATUS_WT_NEW); - assert_status("just.ignore", GIT_STATUS_IGNORED); + assert_status(repo, "what", GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "who", GIT_STATUS_CURRENT); + assert_status(repo, "when", GIT_STATUS_WT_NEW); + assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); } static void assert_commit_message_contains(const char *revision, const char *fragment) @@ -308,25 +290,25 @@ void test_stash_save__can_stage_normal_then_stage_untracked(void) * 100644 blob b6ed15e81e2593d7bb6265eb4a991d29dc3e628b when */ - assert_status("what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); - assert_status("how", GIT_STATUS_INDEX_MODIFIED); - assert_status("who", GIT_STATUS_WT_MODIFIED); - assert_status("when", GIT_STATUS_WT_NEW); - assert_status("just.ignore", GIT_STATUS_IGNORED); + assert_status(repo, "what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); + assert_status(repo, "when", GIT_STATUS_WT_NEW); + assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); - assert_status("what", GIT_STATUS_CURRENT); - assert_status("how", GIT_STATUS_CURRENT); - assert_status("who", GIT_STATUS_CURRENT); - assert_status("when", GIT_STATUS_WT_NEW); - assert_status("just.ignore", GIT_STATUS_IGNORED); + assert_status(repo, "what", GIT_STATUS_CURRENT); + assert_status(repo, "how", GIT_STATUS_CURRENT); + assert_status(repo, "who", GIT_STATUS_CURRENT); + assert_status(repo, "when", GIT_STATUS_WT_NEW); + assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); - assert_status("what", GIT_STATUS_CURRENT); - assert_status("how", GIT_STATUS_CURRENT); - assert_status("who", GIT_STATUS_CURRENT); - assert_status("when", GIT_ENOTFOUND); - assert_status("just.ignore", GIT_STATUS_IGNORED); + assert_status(repo, "what", GIT_STATUS_CURRENT); + assert_status(repo, "how", GIT_STATUS_CURRENT); + assert_status(repo, "who", GIT_STATUS_CURRENT); + assert_status(repo, "when", GIT_ENOTFOUND); + assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); assert_blob_oid("stash@{1}^0:what", "bc99dc98b3eba0e9157e94769cd4d49cb49de449"); /* see you later */ @@ -360,11 +342,11 @@ void test_stash_save__including_untracked_without_any_untracked_file_creates_an_ { cl_git_pass(p_unlink("stash/when")); - assert_status("what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); - assert_status("how", GIT_STATUS_INDEX_MODIFIED); - assert_status("who", GIT_STATUS_WT_MODIFIED); - assert_status("when", GIT_ENOTFOUND); - assert_status("just.ignore", GIT_STATUS_IGNORED); + assert_status(repo, "what", GIT_STATUS_WT_MODIFIED | GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "how", GIT_STATUS_INDEX_MODIFIED); + assert_status(repo, "who", GIT_STATUS_WT_MODIFIED); + assert_status(repo, "when", GIT_ENOTFOUND); + assert_status(repo, "just.ignore", GIT_STATUS_IGNORED); cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_INCLUDE_UNTRACKED)); diff --git a/tests-clar/stash/stash_helpers.c b/tests-clar/stash/stash_helpers.c index 06b63f177..8b7d685f8 100644 --- a/tests-clar/stash/stash_helpers.c +++ b/tests-clar/stash/stash_helpers.c @@ -35,3 +35,22 @@ void setup_stash(git_repository *repo, git_signature *signature) git_index_free(index); } + +void assert_status( + git_repository *repo, + const char *path, + int status_flags) +{ + unsigned int status; + int error; + + error = git_status_file(&status, repo, path); + + if (status_flags < 0) { + cl_assert_equal_i(status_flags, error); + return; + } + + cl_assert_equal_i(0, error); + cl_assert_equal_i((unsigned int)status_flags, status); +} diff --git a/tests-clar/stash/stash_helpers.h b/tests-clar/stash/stash_helpers.h index 7c3e13de3..66d758fe2 100644 --- a/tests-clar/stash/stash_helpers.h +++ b/tests-clar/stash/stash_helpers.h @@ -1,3 +1,8 @@ void setup_stash( git_repository *repo, git_signature *signature); + +void assert_status( + git_repository *repo, + const char *path, + int status_flags); diff --git a/tests-clar/stash/submodules.c b/tests-clar/stash/submodules.c new file mode 100644 index 000000000..60dbbad2e --- /dev/null +++ b/tests-clar/stash/submodules.c @@ -0,0 +1,68 @@ +#include "clar_libgit2.h" +#include "stash_helpers.h" +#include "../submodule/submodule_helpers.h" + +static git_repository *repo; +static git_signature *signature; +static git_oid stash_tip_oid; + +static git_index *smindex; +static git_submodule *sm; +static git_repository *smrepo; + +void test_stash_submodules__initialize(void) +{ + cl_git_pass(git_signature_new(&signature, "nulltoken", "emeric.fermas@gmail.com", 1323847743, 60)); /* Wed Dec 14 08:29:03 2011 +0100 */ + + repo = setup_fixture_submodules(); + + cl_git_pass(git_submodule_lookup(&sm, repo, "testrepo")); + cl_git_pass(git_submodule_open(&smrepo, sm)); + cl_git_pass(git_repository_index(&smindex, smrepo)); +} + +void test_stash_submodules__cleanup(void) +{ + git_signature_free(signature); + signature = NULL; +} + +void test_stash_submodules__does_not_stash_modified_submodules(void) +{ + assert_status(repo, "modified", GIT_STATUS_WT_MODIFIED); + + /* modify file in submodule */ + cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); + assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); + + /* add file to index in submodule */ + cl_git_pass(git_index_add_bypath(smindex, "README")); + + /* commit changed index of submodule */ + cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Modify it"); + assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); + + cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); + + assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); + assert_status(repo, "modified", GIT_STATUS_CURRENT); +} + +void test_stash_submodules__stash_is_empty_with_modified_submodules(void) +{ + cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); + assert_status(repo, "modified", GIT_STATUS_CURRENT); + + /* modify file in submodule */ + cl_git_rewritefile("submodules/testrepo/README", "heyheyhey"); + assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); + + /* add file to index in submodule */ + cl_git_pass(git_index_add_bypath(smindex, "README")); + + /* commit changed index of submodule */ + cl_repo_commit_from_index(NULL, smrepo, NULL, 1372350000, "Modify it"); + assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); + + cl_git_fail_with(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT), GIT_ENOTFOUND); +} From ae5a935290c695d721f69b8836f891a639c0aff3 Mon Sep 17 00:00:00 2001 From: Ben Straub Date: Mon, 30 Sep 2013 14:47:56 -0700 Subject: [PATCH 3/3] Ensure submodule repos and indices are freed ...before the helper's cleanup method tries to delete their files. --- tests-clar/stash/submodules.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/tests-clar/stash/submodules.c b/tests-clar/stash/submodules.c index 60dbbad2e..137c4408c 100644 --- a/tests-clar/stash/submodules.c +++ b/tests-clar/stash/submodules.c @@ -6,9 +6,7 @@ static git_repository *repo; static git_signature *signature; static git_oid stash_tip_oid; -static git_index *smindex; static git_submodule *sm; -static git_repository *smrepo; void test_stash_submodules__initialize(void) { @@ -17,8 +15,6 @@ void test_stash_submodules__initialize(void) repo = setup_fixture_submodules(); cl_git_pass(git_submodule_lookup(&sm, repo, "testrepo")); - cl_git_pass(git_submodule_open(&smrepo, sm)); - cl_git_pass(git_repository_index(&smindex, smrepo)); } void test_stash_submodules__cleanup(void) @@ -29,6 +25,9 @@ void test_stash_submodules__cleanup(void) void test_stash_submodules__does_not_stash_modified_submodules(void) { + static git_index *smindex; + static git_repository *smrepo; + assert_status(repo, "modified", GIT_STATUS_WT_MODIFIED); /* modify file in submodule */ @@ -36,6 +35,8 @@ void test_stash_submodules__does_not_stash_modified_submodules(void) assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); /* add file to index in submodule */ + cl_git_pass(git_submodule_open(&smrepo, sm)); + cl_git_pass(git_repository_index(&smindex, smrepo)); cl_git_pass(git_index_add_bypath(smindex, "README")); /* commit changed index of submodule */ @@ -46,10 +47,16 @@ void test_stash_submodules__does_not_stash_modified_submodules(void) assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); assert_status(repo, "modified", GIT_STATUS_CURRENT); + + git_index_free(smindex); + git_repository_free(smrepo); } void test_stash_submodules__stash_is_empty_with_modified_submodules(void) { + static git_index *smindex; + static git_repository *smrepo; + cl_git_pass(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT)); assert_status(repo, "modified", GIT_STATUS_CURRENT); @@ -58,6 +65,8 @@ void test_stash_submodules__stash_is_empty_with_modified_submodules(void) assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); /* add file to index in submodule */ + cl_git_pass(git_submodule_open(&smrepo, sm)); + cl_git_pass(git_repository_index(&smindex, smrepo)); cl_git_pass(git_index_add_bypath(smindex, "README")); /* commit changed index of submodule */ @@ -65,4 +74,7 @@ void test_stash_submodules__stash_is_empty_with_modified_submodules(void) assert_status(repo, "testrepo", GIT_STATUS_WT_MODIFIED); cl_git_fail_with(git_stash_save(&stash_tip_oid, repo, signature, NULL, GIT_STASH_DEFAULT), GIT_ENOTFOUND); + + git_index_free(smindex); + git_repository_free(smrepo); }