git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v2 1/3] stash: add test to ensure reflog --rewrite --updatref behavior

From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Date
Feb 25, 2022, 11:45 UTC
Message-ID
<220225.86lexz88sp.gmgdl@evledraar.gmail.com>
In-Reply-To
<865928A5-3F54-4B51-B502-07E24D98CEDB@gmail.com>
On Thu, Feb 24 2022, John Cai wrote:
Show 67 quoted lines
> 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@gmail.com> 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.

Show 22 quoted lines
> 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..

Show 35 quoted lines
> +       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 :)

Show 16 quoted lines
>
>
>>
>>>>  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)
Previous: John CaiNext: Junio C Hamano
Message 31 of 63 in “libify reflog”
  1. 0/3 libify reflogJohn Cai via GitGitGadget, Feb 18, 2022
  2. 2/3 reflog: call reflog_delete from reflog.cJohn Cai via GitGitGadget, Feb 18, 2022
  3. Ævar Arnfjörð BjarmasonFeb 18, 2022
  4. Junio C HamanoFeb 18, 2022
  5. 3/3 stash: call reflog_delete from reflog.cJohn Cai via GitGitGadget, Feb 18, 2022
  6. Ævar Arnfjörð BjarmasonFeb 18, 2022
  7. Taylor BlauFeb 19, 2022
  8. John CaiFeb 22, 2022
  9. Ævar Arnfjörð BjarmasonFeb 22, 2022
  10. 1/3 reflog: libify delete reflog function and helpersJohn Cai via GitGitGadget, Feb 18, 2022
  11. Ævar Arnfjörð BjarmasonFeb 18, 2022
  12. Taylor BlauFeb 18, 2022
  13. Ævar Arnfjörð BjarmasonFeb 18, 2022
  14. Taylor BlauFeb 18, 2022
  15. John CaiFeb 21, 2022
  16. Taylor BlauFeb 21, 2022
  17. John CaiFeb 23, 2022
  18. Junio C HamanoFeb 18, 2022
  19. Ævar Arnfjörð BjarmasonFeb 19, 2022
  20. Taylor BlauFeb 19, 2022
  21. Junio C HamanoFeb 20, 2022
  22. Junio C HamanoFeb 18, 2022
  23. Ævar Arnfjörð BjarmasonFeb 18, 2022
  24. 0/3 libify reflogJohn Cai via GitGitGadget, Feb 22, 2022
  25. 1/3 stash: add test to ensure reflog --rewrite --updatref behaviorJohn Cai via GitGitGadget, Feb 22, 2022
  26. Ævar Arnfjörð BjarmasonFeb 23, 2022
  27. Junio C HamanoFeb 23, 2022
  28. John CaiFeb 23, 2022
  29. Ævar Arnfjörð BjarmasonFeb 23, 2022
  30. John CaiFeb 24, 2022
  31. Ævar Arnfjörð BjarmasonFeb 25, 2022
  32. Junio C HamanoFeb 25, 2022
  33. Junio C HamanoFeb 23, 2022
  34. John CaiFeb 23, 2022
  35. Junio C HamanoFeb 23, 2022
  36. John CaiFeb 24, 2022
  37. Ævar Arnfjörð BjarmasonFeb 23, 2022
  38. 2/3 reflog: libify delete reflog function and helpersJohn Cai via GitGitGadget, Feb 22, 2022
  39. Ævar Arnfjörð BjarmasonFeb 23, 2022
  40. John CaiFeb 23, 2022
  41. Junio C HamanoFeb 23, 2022
  42. 3/3 stash: call reflog_delete() in reflog.cJohn Cai via GitGitGadget, Feb 22, 2022
  43. 0/3 libify reflogJohn Cai via GitGitGadget, Feb 25, 2022
  44. 1/3 stash: add tests to ensure reflog --rewrite --updatref behaviorJohn Cai via GitGitGadget, Feb 25, 2022
  45. Ævar Arnfjörð BjarmasonMar 2, 2022
  46. 3/3 stash: call reflog_delete() in reflog.cJohn Cai via GitGitGadget, Feb 25, 2022
  47. 2/3 reflog: libify delete reflog function and helpersJohn Cai via GitGitGadget, Feb 25, 2022
  48. Taylor BlauFeb 25, 2022
  49. John CaiMar 2, 2022
  50. Ævar Arnfjörð BjarmasonMar 2, 2022
  51. 0/3 libify reflogJohn Cai via GitGitGadget, Mar 2, 2022
  52. 1/3 stash: add tests to ensure reflog --rewrite --updatref behaviorJohn Cai via GitGitGadget, Mar 2, 2022
  53. Junio C HamanoMar 2, 2022
  54. John CaiMar 3, 2022
  55. Phillip WoodMar 3, 2022
  56. Ævar Arnfjörð BjarmasonMar 3, 2022
  57. Phillip WoodMar 3, 2022
  58. John CaiMar 3, 2022
  59. Phillip WoodMar 8, 2022
  60. John CaiMar 8, 2022
  61. 3/3 stash: call reflog_delete() in reflog.cJohn Cai via GitGitGadget, Mar 2, 2022
  62. 2/3 reflog: libify delete reflog function and helpersJohn Cai via GitGitGadget, Mar 2, 2022
  63. Junio C HamanoMar 2, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.