When the arguments to test_must_fail() begin with a variable assignment,
test_must_fail() attempts to execute the variable assignment as a command.
This fails, and so test_must_fail returns with a successful status value
without running the command it was intended to test.
For example, the following script:
#!/bin/sh
test_must_fail () {
"$@"
test $? -gt 0 -a $? -le 129
}
foo='wo adrian'
test_must_fail foo='yo adrian' sh -c 'echo foo: $foo'
always exits zero and prints the message:
test.sh: line 3: foo=yo adrian: command not found
Test 16 calls test_must_fail in such a way and therefore has not been
testing whether git 'do[es] not fire editor in the presence of conflicts'.
Fix this by reverting to the traditional negation operator '!' and accept
the caveat that segfault will not be detected.
Signed-off-by: Brandon Casey <redacted>
---
Unless you have a better work around...
-brandon
t/t7502-commit.sh | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
@@ -212,7 +212,9 @@ test_expect_success 'do not fire editor in the presence of conflicts' '# Must fail due to conflicttest_must_failgitcherry-pick-nmaster&&echo"editor not started">.git/result&&-test_must_failGIT_EDITOR="$(pwd)/.git/FAKE_EDITOR"gitcommit&&+# We intentionally do not use test_must_fail on the next line since the+# mechanism does not work when setting environment variables inline+!GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR"gitcommit&&test"$(cat.git/result)"="editor not started"'
From: Mike Hommey <hidden> Date: 2016-06-15 22:44:47
On Thu, Jun 19, 2008 at 12:32:02PM -0500, Brandon Casey wrote:
- test_must_fail GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
+ # We intentionally do not use test_must_fail on the next line since the
+ # mechanism does not work when setting environment variables inline
+ ! GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
Doesn't GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" test_must_fail git commit
work ?
Mike
On Thu, Jun 19, 2008 at 12:32:02PM -0500, Brandon Casey wrote:
quoted
- test_must_fail GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
+ # We intentionally do not use test_must_fail on the next line since the
+ # mechanism does not work when setting environment variables inline
+ ! GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
Doesn't GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" test_must_fail git commit
work ?
That leaves GIT_EDITOR set to the new value after the command completes.
-brandon
From: Mike Hommey <hidden> Date: 2016-06-15 22:44:47
On Thu, Jun 19, 2008 at 12:44:23PM -0500, Brandon Casey wrote:
Mike Hommey wrote:
quoted
On Thu, Jun 19, 2008 at 12:32:02PM -0500, Brandon Casey wrote:
quoted
- test_must_fail GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
+ # We intentionally do not use test_must_fail on the next line since the
+ # mechanism does not work when setting environment variables inline
+ ! GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
Doesn't GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" test_must_fail git commit
work ?
That leaves GIT_EDITOR set to the new value after the command completes.
On Thu, Jun 19, 2008 at 12:44:23PM -0500, Brandon Casey wrote:
quoted
Mike Hommey wrote:
quoted
On Thu, Jun 19, 2008 at 12:32:02PM -0500, Brandon Casey wrote:
quoted
- test_must_fail GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
+ # We intentionally do not use test_must_fail on the next line since the
+ # mechanism does not work when setting environment variables inline
+ ! GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" git commit &&
Doesn't GIT_EDITOR="$(pwd)/.git/FAKE_EDITOR" test_must_fail git commit
work ?
That leaves GIT_EDITOR set to the new value after the command completes.
It really shouldn't.
The change you suggested is also what I tried first. Looks like it depends on the
shell. On my system /bin/sh is a symlink to /bin/bash and that is the behavior
I observed. On other shells the assignment is not passed to the environment of
the called procedure at all.
Here is an example script:
#!/bin/sh
test_must_fail () {
"$@"
test $? -gt 0 -a $? -le 129
}
foo='wo adrian'
foo='yo adrian' test_must_fail sh -c 'echo foo: $foo'
echo "foo: $foo"
When /bin/sh is a symlink to bash, I get:
foo: yo adrian
foo: yo adrian
If I change #!/bin/sh to #!/bin/bash I get what is expected:
foo: yo adrian
foo: wo adrian
#!/bin/ksh
foo:
foo: yo adrian
#!/bin/dash
foo:
foo: yo adrian
-brandon