On Thu, Feb 24 2022, John Cai wrote: > Hi Ævar, > > On 23 Feb 2022, at 16:50, Ævar Arnfjörð Bjarmason wrote: > >> On Wed, Feb 23 2022, Junio C Hamano wrote: >> >>> Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> writes: >>> >>>> This test was already a bit broken in needing the preceding tests, but >>>> it will break now if REFFILES isn't true, which you can reproduce >>>> e.g. with: >>>> >>>> ./t3903-stash.sh --run=1-16,18-50 -vixd >>>> >>>> Perhaps the least sucky solution to that is: >>>> >>>> diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh >>>> index ec9cc5646d6..1d11c9bda20 100755 >>>> --- a/t/t3903-stash.sh >>>> +++ b/t/t3903-stash.sh >>>> @@ -205,13 +205,19 @@ test_expect_success 'drop stash reflog updates refs/stash with rewrite' ' >>>> cat >expect <<-EOF && >>>> $(test_oid zero) $oid >>>> EOF >>>> - test_cmp expect actual >>>> + test_cmp expect actual && >>>> + >dropped-stash >>>> ' >>> >>> If "git stash drop", invoked in earlier part of this test before the >>> precontext, fails, then test_cmp would fail and we leave >>> dropped-stash untouched, even though we did run "git stash drop" >>> already. >> >> Yes, that's an edge case that's exposed here, but which I thought wasn't >> worth bothering with. I.e. if you get such a failure on test N getting >> N+1 failing as well isn't that big of a deal. >> >> The big deal is rather that we know we're adding a REFFILES dependency >> to this, which won't run this at all, which will make the "stash pop" >> below fail. >> >>> Why does the next test need to depend on what has happened earlier? >> >> They don't need to, and ideally wouldn't, but most of our test suite has >> this issue already. Try e.g. running it with: >> >> prove t[0-9]*.sh :: --run=10-20 --immediate >> >> And for this particular file running e.g. this on master: >> >> ./t3903-stash.sh --run=1-10,30-40 >> >> Will fail 7 tests in the 30-40 range. >> >> So while it's ideal that we can combine tests with arbitrary --run >> parameters, i.e. all tests would tear down fully, not depend on earlier >> tests etc. we're really far from that being the case in practice. >> >> So insisting on some general refactoring of this file as part of this >> series seems a bit overzelous, which is why I'm suggesting the bare >> minimum to expect and work around the inevitable REFFILES failure, as >> Han-Wen is actively working in that area. > > Curious what your thoughts are on an effort to isolate these tests from each other. > I like your approach in t/t1417 in creating a test repo and copying it over each time. > Something like this? That looks good to me if you're willing to do that legwork, probably better in a preceding cleanup commit. > diff --git a/t/t3903-stash.sh b/t/t3903-stash.sh > index ac345eced8cb..40254f8dc99c 100755 > --- a/t/t3903-stash.sh > +++ b/t/t3903-stash.sh > @@ -41,7 +41,9 @@ diff_cmp () { > rm -f "$1.compare" "$2.compare" > } > > -test_expect_success 'stash some dirty working directory' ' > +test_expect_success 'setup' ' > + git init repo && > + cd repo && > echo 1 >file && > git add file && > echo unrelated >other-file && > @@ -54,48 +56,54 @@ test_expect_success 'stash some dirty working directory' ' > test_tick && > git stash && > git diff-files --quiet && > - git diff-index --cached --quiet HEAD > + git diff-index --cached --quiet HEAD && > + cat >expect <<-EOF && nit: you can add \ to that, i.e. <<-\EOF. Helps readability, i.e. it's obvious right away that no variables are in play.. > + diff --git a/file b/file > + index 0cfbf08..00750ed 100644 > + --- a/file > + +++ b/file > + @@ -1 +1 @@ > + -2 > + +3 > + EOF > + cd ../ > ' > > -cat >expect <<EOF > -diff --git a/file b/file > -index 0cfbf08..00750ed 100644 > ---- a/file > -+++ b/file > -@@ -1 +1 @@ > --2 > -+3 > -EOF > +test_stash () { > + cp -R repo copy && > + cd copy && > + test_expect_success "$@" && > + cd ../ && > + rm -rf copy > +} > > > -test_expect_success 'parents of stash' ' > +test_stash 'parents of stash' ' > test $(git rev-parse stash^) = $(git rev-parse HEAD) && > git diff stash^2..stash >output && > diff_cmp expect output > ' For this sort of thing I think it's usually better to override "test_expect_success" as a last resort, i.e. to have that "test_setup_stash_copy" just be a "setup_stash" or whatever function called from within your test_expect_success. And instead of the "rm -rf" later, just do: test_when_finished "rm -rf copy" && cp -R repo copy && [...] The test still needs to deal with the sub-repo, but it could cd or use "-C". It's bad to add "cd .." in a &&-chain, because if earlier steps fail we're in the wrong directory for the next test, so either -C or a sub-shell... > Not sure if it's worth it though? Maybe not, which is why I suggested upthread to maybe go for some smallest possible change here and focus on the lib-ificitaion :) > > >> >>>> test_expect_success 'stash pop' ' >>>> git reset --hard && >>>> git stash pop && >>>> - test 9 = $(cat file) && >>>> + if test -e dropped-stash >>>> + then >>>> + test 9 = $(cat file) >>>> + else >>>> + test 3 = $(cat file) >>>> + fi && >>>> test 1 = $(git show :file) && >>>> test 1 = $(git show HEAD:file) && >>>> test 0 = $(git stash list | wc -l)