Merge branch 'jn/run-command-error-failure' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 30 May 2011 02:08:51 +0000 (19:08 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 30 May 2011 02:08:51 +0000 (19:08 -0700)
* jn/run-command-error-failure:
run-command: handle short writes and EINTR in die_child
tests: check error message from run_command

run-command.c
t/t0061-run-command.sh
test-run-command.c
index f91e446c86be8e27f98554567143d7ce6f934bd1..70e8a249d0fe07b6a32b4da4ac8224d1c2f06b1b 100644 (file)
@@ -67,21 +67,24 @@ static int child_notifier = -1;
 
 static void notify_parent(void)
 {
-       ssize_t unused;
-       unused = write(child_notifier, "", 1);
+       /*
+        * execvp failed.  If possible, we'd like to let start_command
+        * know, so failures like ENOENT can be handled right away; but
+        * otherwise, finish_command will still report the error.
+        */
+       xwrite(child_notifier, "", 1);
 }
 
 static NORETURN void die_child(const char *err, va_list params)
 {
        char msg[4096];
-       ssize_t unused;
        int len = vsnprintf(msg, sizeof(msg), err, params);
        if (len > sizeof(msg))
                len = sizeof(msg);
 
-       unused = write(child_err, "fatal: ", 7);
-       unused = write(child_err, msg, len);
-       unused = write(child_err, "\n", 1);
+       write_in_full(child_err, "fatal: ", 7);
+       write_in_full(child_err, msg, len);
+       write_in_full(child_err, "\n", 1);
        exit(128);
 }
 #endif
index 10b26e4d8ef3ea7b6b9b2ae7aeebbbae1ee46703..8d4938f019ca406c0f248d19d046356dff1ac09a 100755 (executable)
@@ -7,8 +7,31 @@ test_description='Test run command'
 
 . ./test-lib.sh
 
+cat >hello-script <<-EOF
+       #!$SHELL_PATH
+       cat hello-script
+EOF
+>empty
+
 test_expect_success 'start_command reports ENOENT' '
        test-run-command start-command-ENOENT ./does-not-exist
 '
 
+test_expect_success 'run_command can run a command' '
+       cat hello-script >hello.sh &&
+       chmod +x hello.sh &&
+       test-run-command run-command ./hello.sh >actual 2>err &&
+
+       test_cmp hello-script actual &&
+       test_cmp empty err
+'
+
+test_expect_success POSIXPERM 'run_command reports EACCES' '
+       cat hello-script >hello.sh &&
+       chmod -x hello.sh &&
+       test_must_fail test-run-command run-command ./hello.sh 2>err &&
+
+       grep "fatal: cannot exec.*hello.sh" err
+'
+
 test_done
index 0612bfa7cd1909c8c4292b384fd7a56b8baf3c2a..37918e15f5ce06d0079ce09ae1a7be7b14533c48 100644 (file)
@@ -29,6 +29,8 @@ int main(int argc, char **argv)
                fprintf(stderr, "FAIL %s\n", argv[1]);
                return 1;
        }
+       if (!strcmp(argv[1], "run-command"))
+               exit(run_command(&proc));
 
        fprintf(stderr, "check usage\n");
        return 1;