path: root/builtin/am.c
diff options
authorPaul Tan <>2015-08-04 13:51:24 (GMT)
committerJunio C Hamano <>2015-08-05 05:02:11 (GMT)
commit73c2779f421fe1eaead6f1c07a0e134a9c17d6db (patch)
treed64784376e10ce1a71eec802d261a96b707a62c4 /builtin/am.c
parent260eec292736388831958637eccdcf1a8f00e14d (diff)
builtin-am: implement skeletal builtin am
For the purpose of rewriting into a C builtin, implement a skeletal builtin/am.c that redirects to $GIT_EXEC_PATH/git-am if the environment variable _GIT_USE_BUILTIN_AM is not defined. Since in the Makefile takes precedence over builtin/am.c, $GIT_EXEC_PATH/git-am will contain the shell script, and thus this allows us to fall back on the functional when running the test suite for tests that depend on a working git-am implementation. Since cannot handle any environment modifications by setup_git_directory(), "am" is declared with no setup flags in git.c. On the other hand, to re-implement in builtin/am.c, we need to run all the git dir and work tree setup logic that git.c typically does for us. As such, we work around this temporarily by copying the logic in git.c's run_builtin(), which is roughly: prefix = setup_git_directory(); trace_repo_setup(prefix); setup_work_tree(); This redirection should be removed when all the features of have been re-implemented in builtin/am.c. Helped-by: Junio C Hamano <> Signed-off-by: Paul Tan <> Signed-off-by: Junio C Hamano <>
Diffstat (limited to 'builtin/am.c')
1 files changed, 29 insertions, 0 deletions
diff --git a/builtin/am.c b/builtin/am.c
new file mode 100644
index 0000000..fd32caf
--- /dev/null
+++ b/builtin/am.c
@@ -0,0 +1,29 @@
+ * Builtin "git am"
+ *
+ * Based on by Junio C Hamano.
+ */
+#include "cache.h"
+#include "builtin.h"
+#include "exec_cmd.h"
+int cmd_am(int argc, const char **argv, const char *prefix)
+ /*
+ * NEEDSWORK: Once all the features of have been
+ * re-implemented in builtin/am.c, this preamble can be removed.
+ */
+ if (!getenv("_GIT_USE_BUILTIN_AM")) {
+ const char *path = mkpath("%s/git-am", git_exec_path());
+ if (sane_execvp(path, (char **)argv) < 0)
+ die_errno("could not exec %s", path);
+ } else {
+ prefix = setup_git_directory();
+ trace_repo_setup(prefix);
+ setup_work_tree();
+ }
+ return 0;