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 ... }