v5 addresses the issues with creating the child's environment. Instead of doing vanilla C string manipulation, I used a struct string_list and struct strbuf. The code should be much easier to read and understand now. I also needed to add a function to remove a string_list_item from a string_list to the string_list API. Brandon Williams (10): t5550: use write_script to generate post-update hook t0061: run_command executes scripts without a #! line run-command: prepare command before forking run-command: use the async-signal-safe execv instead of execvp string-list: add string_list_remove function run-command: prepare child environment before forking run-command: don't die in child when duping /dev/null run-command: eliminate calls to error handling functions in child run-command: handle dup2 and close errors in child run-command: add note about forking and threading Eric Wong (1): run-command: block signals between fork and execve run-command.c | 404 +++++++++++++++++++++++++++++++++++---------- string-list.c | 18 ++ string-list.h | 5 + t/t0061-run-command.sh | 11 ++ t/t5550-http-fetch-dumb.sh | 5 +- 5 files changed, 358 insertions(+), 85 deletions(-) -- 2.12.2.816.g2cccc81164-goog