builtin-am: implement skeletal builtin am
authorPaul Tan <pyokagan@gmail.com>
Tue, 4 Aug 2015 13:51:24 +0000 (21:51 +0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Aug 2015 05:02:11 +0000 (22:02 -0700)
For the purpose of rewriting git-am.sh 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 git-am.sh takes precedence over builtin/am.c,
$GIT_EXEC_PATH/git-am will contain the shell script git-am.sh, and thus
this allows us to fall back on the functional git-am.sh when running the
test suite for tests that depend on a working git-am implementation.

Since git-am.sh 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 git-am.sh 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 git-am.sh
have been re-implemented in builtin/am.c.

Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Paul Tan <pyokagan@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Makefile
builtin.h
builtin/am.c [new file with mode: 0644]
git.c
index 7efedbe8346f198716674161248fda43396c656b..da451f8bca18ccfd4e4902115eb5251f13c3ef9e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -813,6 +813,7 @@ LIB_OBJS += xdiff-interface.o
 LIB_OBJS += zlib.o
 
 BUILTIN_OBJS += builtin/add.o
+BUILTIN_OBJS += builtin/am.o
 BUILTIN_OBJS += builtin/annotate.o
 BUILTIN_OBJS += builtin/apply.o
 BUILTIN_OBJS += builtin/archive.o
index 839483de6ec2bb2b68bb77632b8e25eefac93999..79aaf0afe8912d154573df3baa6ea5c28f8097d6 100644 (file)
--- a/builtin.h
+++ b/builtin.h
@@ -30,6 +30,7 @@ extern int textconv_object(const char *path, unsigned mode, const unsigned char
 extern int is_builtin(const char *s);
 
 extern int cmd_add(int argc, const char **argv, const char *prefix);
+extern int cmd_am(int argc, const char **argv, const char *prefix);
 extern int cmd_annotate(int argc, const char **argv, const char *prefix);
 extern int cmd_apply(int argc, const char **argv, const char *prefix);
 extern int cmd_archive(int argc, const char **argv, const char *prefix);
diff --git a/builtin/am.c b/builtin/am.c
new file mode 100644 (file)
index 0000000..fd32caf
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Builtin "git am"
+ *
+ * Based on git-am.sh 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 git-am.sh 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;
+}
diff --git a/git.c b/git.c
index 55c327c7b3d2cd9cf9e0d52ddc5f83b34eeea75e..38d9ad531eb2c34a7ac02ced0e10cc13dbc37e0c 100644 (file)
--- a/git.c
+++ b/git.c
@@ -370,6 +370,12 @@ static int run_builtin(struct cmd_struct *p, int argc, const char **argv)
 
 static struct cmd_struct commands[] = {
        { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE },
+       /*
+        * NEEDSWORK: Once the redirection to git-am.sh in builtin/am.c has
+        * been removed, this entry should be changed to
+        * RUN_SETUP | NEED_WORK_TREE
+        */
+       { "am", cmd_am },
        { "annotate", cmd_annotate, RUN_SETUP },
        { "apply", cmd_apply, RUN_SETUP_GENTLY },
        { "archive", cmd_archive },