git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v6 03/45] builtin-am: implement skeletal builtin am

From
Paul Tan <pyokagan@gmail.com>
Date
Jul 19, 2015, 16:09 UTC
Message-ID
<1437322237-29863-4-git-send-email-pyokagan@gmail.com>
In-Reply-To
<1437322237-29863-1-git-send-email-pyokagan@gmail.com>

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>
---
 Makefile     |  1 +
 builtin.h    |  1 +
 builtin/am.c | 29 +++++++++++++++++++++++++++++
 git.c        |  6 ++++++
 4 files changed, 37 insertions(+)
 create mode 100644 builtin/am.c
diff --git a/Makefile b/Makefile
index c6c28bc..f88642a 100644
--- a/Makefile
+++ b/Makefile
@@ -812,6 +812,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
diff --git a/builtin.h b/builtin.h
index 839483d..79aaf0a 100644
--- 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
index 0000000..fd32caf
--- /dev/null
+++ b/builtin/am.c
@@ -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 55c327c..38d9ad5 100644
--- 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 },
-- 
2.5.0.rc2.110.gb39b692
Previous: Paul TanNext: Paul Tan
Message 4 of 47 in “Make git-am a builtin”
  1. 00/45 Make git-am a builtinPaul Tan, Jul 19, 2015
  2. 01/45 wrapper: implement xopen()Paul Tan, Jul 19, 2015
  3. 02/45 wrapper: implement xfopen()Paul Tan, Jul 19, 2015
  4. 03/45 builtin-am: implement skeletal builtin amPaul Tan, Jul 19, 2015
  5. 04/45 builtin-am: implement patch queue mechanismPaul Tan, Jul 19, 2015
  6. 05/45 builtin-am: split out mbox/maildir patches with git-mailsplitPaul Tan, Jul 19, 2015
  7. 06/45 builtin-am: auto-detect mbox patchesPaul Tan, Jul 19, 2015
  8. 07/45 builtin-am: extract patch and commit info with git-mailinfoPaul Tan, Jul 19, 2015
  9. 08/45 builtin-am: apply patch with git-applyPaul Tan, Jul 19, 2015
  10. 09/45 builtin-am: implement committing applied patchPaul Tan, Jul 19, 2015
  11. 10/45 builtin-am: refuse to apply patches if index is dirtyPaul Tan, Jul 19, 2015
  12. 11/45 builtin-am: implement --resolved/--continuePaul Tan, Jul 19, 2015
  13. 12/45 builtin-am: don't parse mail when resumingPaul Tan, Jul 19, 2015
  14. 13/45 builtin-am: implement --skipPaul Tan, Jul 19, 2015
  15. 14/45 builtin-am: implement --abortPaul Tan, Jul 19, 2015
  16. Stefan BellerJul 31, 2015
  17. 15/45 builtin-am: reject patches when there's a session in progressPaul Tan, Jul 19, 2015
  18. 16/45 builtin-am: implement -q/--quietPaul Tan, Jul 19, 2015
  19. 17/45 builtin-am: exit with user friendly message on failurePaul Tan, Jul 19, 2015
  20. 18/45 builtin-am: implement -s/--signoffPaul Tan, Jul 19, 2015
  21. 19/45 cache-tree: introduce write_index_as_tree()Paul Tan, Jul 19, 2015
  22. 20/45 builtin-am: implement --3way, am.threeWayPaul Tan, Jul 19, 2015
  23. 21/45 builtin-am: implement --rebasing modePaul Tan, Jul 19, 2015
  24. 22/45 builtin-am: bypass git-mailinfo when --rebasingPaul Tan, Jul 19, 2015
  25. 23/45 builtin-am: handle stray state directoryPaul Tan, Jul 19, 2015
  26. 24/45 builtin-am: implement -u/--utf8Paul Tan, Jul 19, 2015
  27. 25/45 builtin-am: implement -k/--keep, --keep-non-patchPaul Tan, Jul 19, 2015
  28. 26/45 builtin-am: implement --[no-]message-id, am.messageidPaul Tan, Jul 19, 2015
  29. 27/45 builtin-am: support --keep-cr, am.keepcrPaul Tan, Jul 19, 2015
  30. 28/45 builtin-am: implement --[no-]scissorsPaul Tan, Jul 19, 2015
  31. 29/45 builtin-am: pass git-apply's options to git-applyPaul Tan, Jul 19, 2015
  32. 30/45 builtin-am: implement --ignore-datePaul Tan, Jul 19, 2015
  33. 31/45 builtin-am: implement --committer-date-is-author-datePaul Tan, Jul 19, 2015
  34. 32/45 builtin-am: implement -S/--gpg-sign, commit.gpgsignPaul Tan, Jul 19, 2015
  35. 33/45 builtin-am: invoke post-rewrite hookPaul Tan, Jul 19, 2015
  36. 34/45 builtin-am: support automatic notes copyingPaul Tan, Jul 19, 2015
  37. 35/45 builtin-am: invoke applypatch-msg hookPaul Tan, Jul 19, 2015
  38. 36/45 builtin-am: invoke pre-applypatch hookPaul Tan, Jul 19, 2015
  39. 37/45 builtin-am: invoke post-applypatch hookPaul Tan, Jul 19, 2015
  40. 38/45 builtin-am: rerere supportPaul Tan, Jul 19, 2015
  41. 39/45 builtin-am: support and auto-detect StGit patchesPaul Tan, Jul 19, 2015
  42. 40/45 builtin-am: support and auto-detect StGit series filesPaul Tan, Jul 19, 2015
  43. 41/45 builtin-am: support and auto-detect mercurial patchesPaul Tan, Jul 19, 2015
  44. 42/45 builtin-am: implement -i/--interactivePaul Tan, Jul 19, 2015
  45. 43/45 builtin-am: implement legacy -b/--binary optionPaul Tan, Jul 19, 2015
  46. 44/45 builtin-am: check for valid committer identPaul Tan, Jul 19, 2015
  47. 45/45 builtin-am: remove redirection to git-am.shPaul Tan, Jul 19, 2015

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.