Skip to content

Commit f98838c

Browse files
derrickstoleedscho
authored andcommitted
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 54305ae + d9d796b commit f98838c

File tree

2 files changed

+22
-14
lines changed

2 files changed

+22
-14
lines changed

builtin/rebase.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,13 +1088,17 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
10881088
*/
10891089

10901090
if (!use_builtin_rebase()) {
1091-
const char *path = mkpath("%s/git-legacy-rebase",
1092-
git_exec_path());
1093-
1094-
if (sane_execvp(path, (char **)argv) < 0)
1095-
die_errno(_("could not exec %s"), path);
1096-
else
1097-
BUG("sane_execvp() returned???");
1091+
struct argv_array args = ARGV_ARRAY_INIT;
1092+
int code;
1093+
1094+
argv_array_push(&args, mkpath("%s/git-legacy-rebase",
1095+
git_exec_path()));
1096+
argv_array_pushv(&args, argv + 1);
1097+
code = run_command_v_opt(args.argv, 0);
1098+
if (code < 0)
1099+
die_errno(_("could not exec %s"), args.argv[0]);
1100+
argv_array_clear(&args);
1101+
exit(code);
10981102
}
10991103

11001104
if (argc == 2 && !strcmp(argv[1], "-h"))

builtin/stash.c

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

15521552
if (!use_builtin_stash()) {
1553-
const char *path = mkpath("%s/git-legacy-stash",
1554-
git_exec_path());
1555-
1556-
if (sane_execvp(path, (char **)argv) < 0)
1557-
die_errno(_("could not exec %s"), path);
1558-
else
1559-
BUG("sane_execvp() returned???");
1553+
struct argv_array args = ARGV_ARRAY_INIT;
1554+
int code;
1555+
1556+
argv_array_push(&args, mkpath("%s/git-legacy-stash",
1557+
git_exec_path()));
1558+
argv_array_pushv(&args, argv + 1);
1559+
code = run_command_v_opt(args.argv, 0);
1560+
if (code < 0)
1561+
die_errno(_("could not exec %s"), args.argv[0]);
1562+
argv_array_clear(&args);
1563+
exit(code);
15601564
}
15611565

15621566
prefix = setup_git_directory();

0 commit comments

Comments
 (0)