From: Junio C Hamano <gitster@pobox.com>
To: "Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, fastcat@gmail.com,
Eric Sunshine <sunshine@sunshineco.com>,
Jeff King <peff@peff.net>, Patrick Steinhardt <ps@pks.im>,
Derrick Stolee <stolee@gmail.com>
Subject: Re: [PATCH v2 2/2] for-each-repo: work correctly in a worktree
Date: Tue, 24 Feb 2026 13:47:05 -0800 [thread overview]
Message-ID: <xmqqv7flervq.fsf@gitster.g> (raw)
In-Reply-To: <4e3f4aa6cd36f779c6c1d6b4f30bb68ed807b9da.1771968924.git.gitgitgadget@gmail.com> (Derrick Stolee via GitGitGadget's message of "Tue, 24 Feb 2026 21:35:24 +0000")
"Derrick Stolee via GitGitGadget" <gitgitgadget@gmail.com> writes:
> static int run_command_on_repo(const char *path, int argc, const char ** argv)
> {
> - int i;
> + int res;
> struct child_process child = CHILD_PROCESS_INIT;
> + char **envvars;
> + size_t envvar_nr = 0;
> char *abspath = interpolate_path(path, 0);
>
> + while (local_repo_env[envvar_nr])
> + envvar_nr++;
> +
> + CALLOC_ARRAY(envvars, envvar_nr);
> +
> + for (size_t i = 0; i < envvar_nr; i++) {
> + envvars[i] = getenv(local_repo_env[i]);
> +
> + if (envvars[i]) {
> + unsetenv(local_repo_env[i]);
> + envvars[i] = xstrdup(envvars[i]);
> + }
> + }
>
> child.git_cmd = 1;
> strvec_pushl(&child.args, "-C", abspath, NULL);
>
> - for (i = 0; i < argc; i++)
> + for (int i = 0; i < argc; i++)
> strvec_push(&child.args, argv[i]);
>
> free(abspath);
>
> - return run_command(&child);
> + res = run_command(&child);
> +
> + for (size_t i = 0; i < envvar_nr; i++) {
> + if (envvars[i]) {
> + setenv(local_repo_env[i], envvars[i], 1);
> + free(envvars[i]);
> + }
> + }
> +
> + free(envvars);
> + return res;
> }
Doesn't run_command() let you unsetenv in the child without
affecting the parent process?
Looking at run-command.c:prep_childenv(), it seems that you can pass
"VAR=VAL" to "export VAR=VAL" in the child, and pass "VAR" to "unset
VAR" in the child.
Or is it essential to unset in both parent and child while the child
is working and that is why we unset in the parent and then restore
later? I find this highly confusing.
> int cmd_for_each_repo(int argc,
> diff --git a/t/t0068-for-each-repo.sh b/t/t0068-for-each-repo.sh
> index 512af34c82..d55557a934 100755
> --- a/t/t0068-for-each-repo.sh
> +++ b/t/t0068-for-each-repo.sh
> @@ -10,7 +10,7 @@ TEST_NO_CREATE_REPO=1
> test_expect_success 'run based on configured value' '
> git init one &&
> git init two &&
> - git init three &&
> + git -C two worktree add --orphan ../three &&
> git init ~/four &&
> git -C two commit --allow-empty -m "DID NOT RUN" &&
> git config --global run.key "$TRASH_DIRECTORY/one" &&
> @@ -35,7 +35,17 @@ test_expect_success 'run based on configured value' '
> git -C three log -1 --pretty=format:%s >message &&
> grep again message &&
> git -C ~/four log -1 --pretty=format:%s >message &&
> - grep again message
> + grep again message &&
> +
> + git -C three for-each-repo --config=run.key -- commit --allow-empty -m "ran from worktree" &&
> + git -C one log -1 --pretty=format:%s >message &&
> + grep worktree message &&
> + git -C two log -1 --pretty=format:%s >message &&
> + ! grep worktree message &&
> + git -C three log -1 --pretty=format:%s >message &&
> + grep worktree message &&
> + git -C ~/four log -1 --pretty=format:%s >message &&
> + grep worktree message
> '
>
> test_expect_success 'do nothing on empty config' '
next prev parent reply other threads:[~2026-02-24 21:47 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-24 3:32 [PATCH 0/2] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-02-24 3:32 ` [PATCH 1/2] for-each-repo: stop using the_repository Derrick Stolee via GitGitGadget
2026-02-24 9:18 ` Patrick Steinhardt
2026-02-24 12:07 ` Derrick Stolee
2026-02-24 3:32 ` [PATCH 2/2] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-02-24 3:34 ` Eric Sunshine
2026-02-24 9:18 ` Jeff King
2026-02-24 12:11 ` Derrick Stolee
2026-02-25 13:23 ` Jeff King
2026-02-24 9:18 ` Patrick Steinhardt
2026-02-24 21:35 ` [PATCH v2 0/2] " Derrick Stolee via GitGitGadget
2026-02-24 21:35 ` [PATCH v2 1/2] for-each-repo: test outside of repo context Derrick Stolee via GitGitGadget
2026-02-24 21:35 ` [PATCH v2 2/2] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-02-24 21:47 ` Junio C Hamano [this message]
2026-02-25 11:44 ` Derrick Stolee
2026-02-25 13:13 ` Jeff King
2026-02-26 15:29 ` Derrick Stolee
2026-02-26 16:21 ` Junio C Hamano
2026-02-26 18:14 ` Phillip Wood
2026-02-27 19:41 ` Junio C Hamano
2026-02-27 22:28 ` Derrick Stolee
2026-02-27 22:45 ` Jeff King
2026-02-27 22:42 ` Jeff King
2026-03-02 15:31 ` Derrick Stolee
2026-03-02 18:09 ` Jeff King
2026-03-02 15:36 ` [PATCH v3 0/4] " Derrick Stolee via GitGitGadget
2026-03-02 15:36 ` [PATCH v3 1/4] for-each-repo: test outside of repo context Derrick Stolee via GitGitGadget
2026-03-02 17:56 ` Jeff King
2026-03-02 18:31 ` Junio C Hamano
2026-03-02 18:36 ` Derrick Stolee
2026-03-02 15:36 ` [PATCH v3 2/4] run-command: extract clear_local_repo_env helper Derrick Stolee via GitGitGadget
2026-03-02 18:03 ` Jeff King
2026-03-02 18:35 ` Junio C Hamano
2026-03-02 18:37 ` Derrick Stolee
2026-03-02 15:36 ` [PATCH v3 3/4] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-03-02 18:06 ` Jeff King
2026-03-02 18:39 ` Derrick Stolee
2026-03-02 21:32 ` Junio C Hamano
2026-03-02 15:36 ` [PATCH v3 4/4] for-each-repo: simplify passing of parameters Derrick Stolee via GitGitGadget
2026-03-02 18:06 ` Jeff King
2026-03-03 17:31 ` [PATCH v4 0/4] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-03-03 17:31 ` [PATCH v4 1/4] for-each-repo: test outside of repo context Derrick Stolee via GitGitGadget
2026-03-03 17:31 ` [PATCH v4 2/4] run-command: extract sanitize_repo_env helper Derrick Stolee via GitGitGadget
2026-03-03 17:31 ` [PATCH v4 3/4] for-each-repo: work correctly in a worktree Derrick Stolee via GitGitGadget
2026-03-03 17:31 ` [PATCH v4 4/4] for-each-repo: simplify passing of parameters Derrick Stolee via GitGitGadget
2026-03-05 1:20 ` [PATCH v4 0/4] for-each-repo: work correctly in a worktree Jeff King
2026-03-05 6:14 ` Patrick Steinhardt
2026-03-05 17:23 ` Derrick Stolee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqv7flervq.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=fastcat@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=peff@peff.net \
--cc=ps@pks.im \
--cc=stolee@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox