Re: [PATCH] test: make SYMLINKS prerequisite more robust
- From
Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Date
- Feb 8, 2023, 23:09 UTC
- Message-ID
- <230209.86k00rzqsz.gmgdl@evledraar.gmail.com>
- In-Reply-To
- <xmqqwn4sq73f.fsf@gitster.g>
On Wed, Feb 08 2023, Junio C Hamano wrote:
Show 16 quoted lines
> I see many failures around SYMLINKS prerequisite in Windows tests.
> There are too many to point at, but the pattern seems to be the
> same. Here is one example:
>
> https://github.com/git/git/actions/runs/4127147009/jobs/7130175639#step:5:502
>
> where "ln -s x y && test -h y" succeeds and declares SYMLINKS
> lazy prerequisite is satisfied, but then it fails to run
>
> "ln -s unrelated DS && git update-index --add DS"
>
> with:
>
> error: readlink("DS"): Function not implemented
>
> I wonder if something like this is in order?I don't have much to contribute on that front, but this is really missing some "why", this worked before, why is it failing now? Do we have any idea.
We use "windows-latest", at first I suspected that this was the 2019->2022 migration, which seems to be happening around now: https://github.blog/changelog/2022-01-11-github-actions-jobs-running-on-windows-latest-are-now-running-on-windows-server-2022/
But looking at a previous successful run on master: https://github.com/git/git/actions/runs/4089369223/jobs/7052074004
V.s. this current failure: https://github.com/git/git/actions/runs/4127146869/jobs/7130173444
Shows that both run 2022, and seem to be running the same software, except that in "set up job" this is different, it was:
Download action repository 'git-for-windows/setup-git-for-windows-sdk@v1' (SHA:cbe017cd7ae39629bf4e34fce8b1ccd211fec009)
Now:
Download action repository 'git-for-windows/setup-git-for-windows-sdk@v1' (SHA:848609620edfa4c2fc64838b85fbe19e534236ee)
I have no idea if that's related though...
Show 14 quoted lines
> diff --git a/t/helper/test-readlink.c b/t/helper/test-readlink.c
> new file mode 100644
> index 0000000000..c300dc8a1a
> --- /dev/null
> +++ b/t/helper/test-readlink.c
> @@ -0,0 +1,19 @@
> +#include "test-tool.h"
> +#include "strbuf.h"
> +
> +static const char *usage_msg = "test-tool readlink file";
> +
> +int cmd__readlink(int ac, const char **av)
> +{
> + struct strbuf buf;You're leaving the strbuf uninitialized here, use STRBUF_INIT...
Show 6 quoted lines
> + int ret; > + > + if (ac != 2 || !av[1]) > + usage(usage_msg); > + > + ret = strbuf_readlink(&buf, av[1], 0);
...it's used here, and there's no implicit strbuf_init() on strbuf_readlink(). The first thing it does is inspect sb->alloc.
> + if (!ret)
> + printf("%s\n", buf.buf);Nit: puts(buf.buf);
All in all a simple helper, but isn't this redundant to "test_readlink"?
That requires perl, and once we have this we could just replace it, but then let's do that here, no?
Show 11 quoted lines
> diff --git a/t/test-lib.sh b/t/test-lib.sh > index 01e88781dd..c8094f643b 100644 > --- a/t/test-lib.sh > +++ b/t/test-lib.sh > @@ -1773,7 +1773,8 @@ test_lazy_prereq PIPE ' > > test_lazy_prereq SYMLINKS ' > # test whether the filesystem supports symbolic links > - ln -s x y && test -h y > + ln -s x y && test -h y && test-tool readlink y >/dev/null && > + test "$(test-tool readlink y)" = x
Why get the exit code, and then proceed to hide the exit code with the test "$()" pattern, we can just (untested):
echo x >expect && test-tool readlink y >actual && test_cmp expect actual
If you're trying to avoid leaving litter or cleaning up that's not needed anymore with these lazy prereqs for a while now (they get their throw-away temporary directory).