Skip to content

Commit 5e15413

Browse files
committed
Merge pull request #36 Avoid sane_execvp in git rebase and git stash
William Baker reported that the non-built-in rebase and stash fail to run the post-command hook (which is important for VFS for Git, though). The reason is that an `exec()` will replace the current process by the newly-exec'ed one (our Windows-specific emulation cannot do that, and does not even try, so this is only an issue on Linux/macOS). As a consequence, not even the atexit() handlers are run, including the one running the post-command hook. To work around that, let's spawn the legacy rebase/stash and exit with the reported exit code.
2 parents d9aa45e + 2d946b4 commit 5e15413

File tree

1 file changed

+11
-7
lines changed

1 file changed

+11
-7
lines changed

builtin/stash.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1593,13 +1593,17 @@ int cmd_stash(int argc, const char **argv, const char *prefix)
15931593
};
15941594

15951595
if (!use_builtin_stash()) {
1596-
const char *path = mkpath("%s/git-legacy-stash",
1597-
git_exec_path());
1598-
1599-
if (sane_execvp(path, (char **)argv) < 0)
1600-
die_errno(_("could not exec %s"), path);
1601-
else
1602-
BUG("sane_execvp() returned???");
1596+
struct argv_array args = ARGV_ARRAY_INIT;
1597+
int code;
1598+
1599+
argv_array_push(&args, mkpath("%s/git-legacy-stash",
1600+
git_exec_path()));
1601+
argv_array_pushv(&args, argv + 1);
1602+
code = run_command_v_opt(args.argv, 0);
1603+
if (code < 0)
1604+
die_errno(_("could not exec %s"), args.argv[0]);
1605+
argv_array_clear(&args);
1606+
exit(code);
16031607
}
16041608

16051609
prefix = setup_git_directory();

0 commit comments

Comments
 (0)