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

Re: [PATCH/WIP v2 03/19] am: implement skeletal builtin am

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 15, 2015, 17:54 UTC
Message-ID
<xmqqoakgamcj.fsf@gitster.dls.corp.google.com>
In-Reply-To
<CACRoPnS9fkNQTB8bEKdOBqFgV1E1Mff7oE8rBFDUK+c-woxqZg@mail.gmail.com>
Paul Tan <pyokagan@gmail.com> writes:
Show 8 quoted lines
>> The scripted Porcelain is spawned after applying patches 1-3 from
>> here, when you do not have _GIT_USE_BUILTIN_AM exported.  Haven't
>> RUN_SETUP code did its thing by that time?
>
> Ah right, the RUN_SETUP code would have chdir()-ed to the working
> directory root, so git-am.sh will be unable to find the original
> working directory. To aid it, we would have to chdir() back to the
> original working directory, and unset GIT_DIR.

I do not think that is a correct workaround, though. GIT_DIR may have come from the end user, i.e.

	$ GIT_WORK_TREE=somewhere GIT_DIR=somewhere.else git am ...

As the RUN_SETUP|REQUIRE_WORK_TREE bit is merely a convenence in git.c, one workable way to keep these dual implementations is to do what built-in commands used to do before these were invented. Perhaps studying how cmd_diff(), which is run from git.c without either RUN_SETUP or NEED_WORK_TREE, and taking good bits from it would help. I think the implementation roughly would look like this:

	int cmd_am(int ac, const char **av, const char *prefix)
	{
                /*
                 * NEEDSWORK: once we retire the dual-mode
                 * implementation, this preamble can be removed...                
                 */
		if (... want to do scripted ...) {
                	... spawn the scripted thing ...
		}
		prefix = setup_git_directory();
                setup_work_tree();
                /* ... up to this point */
		... your real "git am in C" comes here ...
	}
Previous: Paul TanNext: Paul Tan
Message 9 of 31 in “Make git-am a builtin”
  1. 00/19 Make git-am a builtinPaul Tan, Jun 11, 2015
  2. 01/19 wrapper: implement xopen()Paul Tan, Jun 11, 2015
  3. 02/19 wrapper: implement xfopen()Paul Tan, Jun 11, 2015
  4. 03/19 am: implement skeletal builtin amPaul Tan, Jun 11, 2015
  5. Junio C HamanoJun 14, 2015
  6. Paul TanJun 15, 2015
  7. Junio C HamanoJun 15, 2015
  8. Paul TanJun 15, 2015
  9. Junio C HamanoJun 15, 2015
  10. Paul TanJun 18, 2015
  11. 04/19 am: implement patch queue mechanismPaul Tan, Jun 11, 2015
  12. Stefan BellerJun 11, 2015
  13. Paul TanJun 15, 2015
  14. 05/19 am: split out mbox/maildir patches with git-mailsplitPaul Tan, Jun 11, 2015
  15. Stefan BellerJun 11, 2015
  16. Paul TanJun 15, 2015
  17. 06/19 am: detect mbox patchesPaul Tan, Jun 11, 2015
  18. 07/19 am: extract patch, message and authorship with git-mailinfoPaul Tan, Jun 11, 2015
  19. Junio C HamanoJun 14, 2015
  20. 08/19 am: apply patch with git-applyPaul Tan, Jun 11, 2015
  21. 09/19 am: commit applied patchPaul Tan, Jun 11, 2015
  22. 10/19 am: refresh the index at startPaul Tan, Jun 11, 2015
  23. 11/19 am: refuse to apply patches if index is dirtyPaul Tan, Jun 11, 2015
  24. 12/19 am: implement --resolved/--continuePaul Tan, Jun 11, 2015
  25. 13/19 am: implement --skipPaul Tan, Jun 11, 2015
  26. 14/19 am: implement --abortPaul Tan, Jun 11, 2015
  27. 15/19 am: implement quiet optionPaul Tan, Jun 11, 2015
  28. 16/19 am: exit with user friendly message on patch failurePaul Tan, Jun 11, 2015
  29. 17/19 am: implement am --signoffPaul Tan, Jun 11, 2015
  30. 18/19 cache-tree: introduce write_index_as_tree()Paul Tan, Jun 11, 2015
  31. 19/19 am: implement 3-way mergePaul Tan, Jun 11, 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.