* [PATCH 0/1] stash apply: be prepared to run in a worktree's subdirectory @ 2019-09-25 12:45 Johannes Schindelin via GitGitGadget 2019-09-25 12:45 ` [PATCH 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget 2019-10-04 12:30 ` [PATCH v2 0/1] stash apply: be prepared to run " Johannes Schindelin via GitGitGadget 0 siblings, 2 replies; 6+ messages in thread From: Johannes Schindelin via GitGitGadget @ 2019-09-25 12:45 UTC (permalink / raw) To: git; +Cc: Junio C Hamano I saw this issue a couple times in my setup, and always wondered why nobody else seemed to be hit by this. When I finally found/made some time to investigate, I found out that it really requires a specific setup: I have many worktrees connected to my main git.git clone, often run inside t/ and I do stash quite often (now that git stash's performance is a joy on Windows). Johannes Schindelin (1): stash apply: report status correctly even in a worktree's subdirectory builtin/stash.c | 2 ++ t/t3908-stash-in-worktree.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100755 t/t3908-stash-in-worktree.sh base-commit: 4c86140027f4a0d2caaa3ab4bd8bfc5ce3c11c8a Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-354%2Fdscho%2Fapply-stash-in-subdirectory-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-354/dscho/apply-stash-in-subdirectory-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/354 -- gitgitgadget ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/1] stash apply: report status correctly even in a worktree's subdirectory 2019-09-25 12:45 [PATCH 0/1] stash apply: be prepared to run in a worktree's subdirectory Johannes Schindelin via GitGitGadget @ 2019-09-25 12:45 ` Johannes Schindelin via GitGitGadget 2019-10-03 22:22 ` Junio C Hamano 2019-10-04 12:30 ` [PATCH v2 0/1] stash apply: be prepared to run " Johannes Schindelin via GitGitGadget 1 sibling, 1 reply; 6+ messages in thread From: Johannes Schindelin via GitGitGadget @ 2019-09-25 12:45 UTC (permalink / raw) To: git; +Cc: Junio C Hamano, Johannes Schindelin From: Johannes Schindelin <johannes.schindelin@gmx.de> When Git wants to spawn a child Git process inside a worktree's subdirectory, we need to take care of specifying the work tree's top-level directory explicitly because it cannot be discovered: the current directory is _not_ the top-level directory of the work tree, and neither is it inside the parent directory of `GIT_DIR`. This fixes the problem where `git stash apply` would report pretty much everything deleted or untracked when run inside a worktree's subdirectory. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- builtin/stash.c | 2 ++ t/t3908-stash-in-worktree.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100755 t/t3908-stash-in-worktree.sh diff --git a/builtin/stash.c b/builtin/stash.c index b5a301f24d..a1e2e7ae7e 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -497,6 +497,8 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, */ cp.git_cmd = 1; cp.dir = prefix; + argv_array_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s", + absolute_path(get_git_work_tree())); argv_array_push(&cp.args, "status"); run_command(&cp); } diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh new file mode 100755 index 0000000000..2b2b366ef9 --- /dev/null +++ b/t/t3908-stash-in-worktree.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# +# Copyright (c) 2019 Johannes E Schindelin +# + +test_description='Test git stash in a worktree' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit initial && + git worktree add wt && + test_commit -C wt in-worktree +' + +test_expect_success 'apply in subdirectory' ' + mkdir wt/subdir && + ( + cd wt/subdir && + echo modified >../initial.t && + git stash && + git stash apply >out + ) && + grep "\.\.\/initial\.t" wt/subdir/out +' + +test_done -- gitgitgadget ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] stash apply: report status correctly even in a worktree's subdirectory 2019-09-25 12:45 ` [PATCH 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget @ 2019-10-03 22:22 ` Junio C Hamano 2019-10-04 9:19 ` Johannes Schindelin 0 siblings, 1 reply; 6+ messages in thread From: Junio C Hamano @ 2019-10-03 22:22 UTC (permalink / raw) To: Johannes Schindelin via GitGitGadget; +Cc: git, Johannes Schindelin "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes: > diff --git a/builtin/stash.c b/builtin/stash.c > index b5a301f24d..a1e2e7ae7e 100644 > --- a/builtin/stash.c > +++ b/builtin/stash.c > @@ -497,6 +497,8 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, > */ > cp.git_cmd = 1; > cp.dir = prefix; > + argv_array_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s", > + absolute_path(get_git_work_tree())); > argv_array_push(&cp.args, "status"); > run_command(&cp); > } Nicely spotted. Exporting GIT_WORK_TREE alone without GIT_DIR feels a bit disturbing, at least to me, though. I wondered if this misbehaves when the end user has GIT_WORK_TREE environment exported, but in such a case, get_git_work_tree() would return that directory, and by re-exporting it to the child process, we would honor the end user's intention, so all is good, I think. Thanks. > diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh > new file mode 100755 > index 0000000000..2b2b366ef9 > --- /dev/null > +++ b/t/t3908-stash-in-worktree.sh > @@ -0,0 +1,27 @@ > +#!/bin/sh > +# > +# Copyright (c) 2019 Johannes E Schindelin > +# > + > +test_description='Test git stash in a worktree' > + > +. ./test-lib.sh > + > +test_expect_success 'setup' ' > + test_commit initial && > + git worktree add wt && > + test_commit -C wt in-worktree > +' > + > +test_expect_success 'apply in subdirectory' ' > + mkdir wt/subdir && > + ( > + cd wt/subdir && > + echo modified >../initial.t && > + git stash && > + git stash apply >out > + ) && > + grep "\.\.\/initial\.t" wt/subdir/out > +' > + > +test_done ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/1] stash apply: report status correctly even in a worktree's subdirectory 2019-10-03 22:22 ` Junio C Hamano @ 2019-10-04 9:19 ` Johannes Schindelin 0 siblings, 0 replies; 6+ messages in thread From: Johannes Schindelin @ 2019-10-04 9:19 UTC (permalink / raw) To: Junio C Hamano; +Cc: Johannes Schindelin via GitGitGadget, git Hi Junio, On Fri, 4 Oct 2019, Junio C Hamano wrote: > "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> > writes: > > > diff --git a/builtin/stash.c b/builtin/stash.c > > index b5a301f24d..a1e2e7ae7e 100644 > > --- a/builtin/stash.c > > +++ b/builtin/stash.c > > @@ -497,6 +497,8 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, > > */ > > cp.git_cmd = 1; > > cp.dir = prefix; > > + argv_array_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s", > > + absolute_path(get_git_work_tree())); > > argv_array_push(&cp.args, "status"); > > run_command(&cp); > > } > > Nicely spotted. Exporting GIT_WORK_TREE alone without GIT_DIR feels > a bit disturbing, at least to me, though. You're absolutely right! Of course, the problem this patch fixes is _because_ `GIT_DIR` is defined, but I should make sure that I don't introduce the reverse problem ;-) > I wondered if this misbehaves when the end user has GIT_WORK_TREE > environment exported, but in such a case, get_git_work_tree() would > return that directory, and by re-exporting it to the child process, > we would honor the end user's intention, so all is good, I think. Yes, that'd my understanding, too. It won't hurt to re-define that variable, but it hurts not to define it at all. Ciao, Dscho > > Thanks. > > > diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh > > new file mode 100755 > > index 0000000000..2b2b366ef9 > > --- /dev/null > > +++ b/t/t3908-stash-in-worktree.sh > > @@ -0,0 +1,27 @@ > > +#!/bin/sh > > +# > > +# Copyright (c) 2019 Johannes E Schindelin > > +# > > + > > +test_description='Test git stash in a worktree' > > + > > +. ./test-lib.sh > > + > > +test_expect_success 'setup' ' > > + test_commit initial && > > + git worktree add wt && > > + test_commit -C wt in-worktree > > +' > > + > > +test_expect_success 'apply in subdirectory' ' > > + mkdir wt/subdir && > > + ( > > + cd wt/subdir && > > + echo modified >../initial.t && > > + git stash && > > + git stash apply >out > > + ) && > > + grep "\.\.\/initial\.t" wt/subdir/out > > +' > > + > > +test_done > ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 0/1] stash apply: be prepared to run in a worktree's subdirectory 2019-09-25 12:45 [PATCH 0/1] stash apply: be prepared to run in a worktree's subdirectory Johannes Schindelin via GitGitGadget 2019-09-25 12:45 ` [PATCH 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget @ 2019-10-04 12:30 ` Johannes Schindelin via GitGitGadget 2019-10-04 12:30 ` [PATCH v2 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget 1 sibling, 1 reply; 6+ messages in thread From: Johannes Schindelin via GitGitGadget @ 2019-10-04 12:30 UTC (permalink / raw) To: git; +Cc: Johannes Schindelin, Junio C Hamano I saw this issue a couple times in my setup, and always wondered why nobody else seemed to be hit by this. When I finally found/made some time to investigate, I found out that it really requires a specific setup: I have many worktrees connected to my main git.git clone, often run inside t/ and I do stash quite often (now that git stash's performance is a joy on Windows). Changes since v1: * We now make sure to also set GIT_DIR. Johannes Schindelin (1): stash apply: report status correctly even in a worktree's subdirectory builtin/stash.c | 4 ++++ t/t3908-stash-in-worktree.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100755 t/t3908-stash-in-worktree.sh base-commit: 4c86140027f4a0d2caaa3ab4bd8bfc5ce3c11c8a Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-354%2Fdscho%2Fapply-stash-in-subdirectory-v2 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-354/dscho/apply-stash-in-subdirectory-v2 Pull-Request: https://github.com/gitgitgadget/git/pull/354 Range-diff vs v1: 1: a687c16b82 ! 1: 4e19436fbf stash apply: report status correctly even in a worktree's subdirectory @@ -3,15 +3,20 @@ stash apply: report status correctly even in a worktree's subdirectory When Git wants to spawn a child Git process inside a worktree's - subdirectory, we need to take care of specifying the work tree's - top-level directory explicitly because it cannot be discovered: the - current directory is _not_ the top-level directory of the work tree, and - neither is it inside the parent directory of `GIT_DIR`. + subdirectory while `GIT_DIR` is set, we need to take care of specifying + the work tree's top-level directory explicitly because it cannot be + discovered: the current directory is _not_ the top-level directory of + the work tree, and neither is it inside the parent directory of + `GIT_DIR`. This fixes the problem where `git stash apply` would report pretty much everything deleted or untracked when run inside a worktree's subdirectory. + To make sure that we do not introduce the "reverse problem", i.e. when + `GIT_WORK_TREE` is defined but `GIT_DIR` is not, we simply make sure + that both are set. + Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> diff --git a/builtin/stash.c b/builtin/stash.c @@ -23,6 +28,8 @@ cp.dir = prefix; + argv_array_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s", + absolute_path(get_git_work_tree())); ++ argv_array_pushf(&cp.env_array, GIT_DIR_ENVIRONMENT"=%s", ++ absolute_path(get_git_dir())); argv_array_push(&cp.args, "status"); run_command(&cp); } -- gitgitgadget ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/1] stash apply: report status correctly even in a worktree's subdirectory 2019-10-04 12:30 ` [PATCH v2 0/1] stash apply: be prepared to run " Johannes Schindelin via GitGitGadget @ 2019-10-04 12:30 ` Johannes Schindelin via GitGitGadget 0 siblings, 0 replies; 6+ messages in thread From: Johannes Schindelin via GitGitGadget @ 2019-10-04 12:30 UTC (permalink / raw) To: git; +Cc: Johannes Schindelin, Junio C Hamano, Johannes Schindelin From: Johannes Schindelin <johannes.schindelin@gmx.de> When Git wants to spawn a child Git process inside a worktree's subdirectory while `GIT_DIR` is set, we need to take care of specifying the work tree's top-level directory explicitly because it cannot be discovered: the current directory is _not_ the top-level directory of the work tree, and neither is it inside the parent directory of `GIT_DIR`. This fixes the problem where `git stash apply` would report pretty much everything deleted or untracked when run inside a worktree's subdirectory. To make sure that we do not introduce the "reverse problem", i.e. when `GIT_WORK_TREE` is defined but `GIT_DIR` is not, we simply make sure that both are set. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> --- builtin/stash.c | 4 ++++ t/t3908-stash-in-worktree.sh | 27 +++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100755 t/t3908-stash-in-worktree.sh diff --git a/builtin/stash.c b/builtin/stash.c index b5a301f24d..b108f099fa 100644 --- a/builtin/stash.c +++ b/builtin/stash.c @@ -497,6 +497,10 @@ static int do_apply_stash(const char *prefix, struct stash_info *info, */ cp.git_cmd = 1; cp.dir = prefix; + argv_array_pushf(&cp.env_array, GIT_WORK_TREE_ENVIRONMENT"=%s", + absolute_path(get_git_work_tree())); + argv_array_pushf(&cp.env_array, GIT_DIR_ENVIRONMENT"=%s", + absolute_path(get_git_dir())); argv_array_push(&cp.args, "status"); run_command(&cp); } diff --git a/t/t3908-stash-in-worktree.sh b/t/t3908-stash-in-worktree.sh new file mode 100755 index 0000000000..2b2b366ef9 --- /dev/null +++ b/t/t3908-stash-in-worktree.sh @@ -0,0 +1,27 @@ +#!/bin/sh +# +# Copyright (c) 2019 Johannes E Schindelin +# + +test_description='Test git stash in a worktree' + +. ./test-lib.sh + +test_expect_success 'setup' ' + test_commit initial && + git worktree add wt && + test_commit -C wt in-worktree +' + +test_expect_success 'apply in subdirectory' ' + mkdir wt/subdir && + ( + cd wt/subdir && + echo modified >../initial.t && + git stash && + git stash apply >out + ) && + grep "\.\.\/initial\.t" wt/subdir/out +' + +test_done -- gitgitgadget ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-10-04 12:31 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-09-25 12:45 [PATCH 0/1] stash apply: be prepared to run in a worktree's subdirectory Johannes Schindelin via GitGitGadget 2019-09-25 12:45 ` [PATCH 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget 2019-10-03 22:22 ` Junio C Hamano 2019-10-04 9:19 ` Johannes Schindelin 2019-10-04 12:30 ` [PATCH v2 0/1] stash apply: be prepared to run " Johannes Schindelin via GitGitGadget 2019-10-04 12:30 ` [PATCH v2 1/1] stash apply: report status correctly even " Johannes Schindelin via GitGitGadget
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.