mirror of
https://github.com/git/git.git
synced 2026-03-06 15:29:05 +01:00
Merge branch 'ds/for-each-repo-w-worktree' into jch
"git for-each-repo" started from a secondary worktree did not work as expected, which has been corrected. * ds/for-each-repo-w-worktree: for-each-repo: simplify passing of parameters for-each-repo: work correctly in a worktree run-command: extract sanitize_repo_env helper for-each-repo: test outside of repo context
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "builtin.h"
|
||||
#include "config.h"
|
||||
#include "environment.h"
|
||||
#include "gettext.h"
|
||||
#include "parse-options.h"
|
||||
#include "path.h"
|
||||
@@ -13,17 +14,16 @@ static const char * const for_each_repo_usage[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
static int run_command_on_repo(const char *path, int argc, const char ** argv)
|
||||
static int run_command_on_repo(const char *path, const char **argv)
|
||||
{
|
||||
int i;
|
||||
struct child_process child = CHILD_PROCESS_INIT;
|
||||
char *abspath = interpolate_path(path, 0);
|
||||
|
||||
sanitize_repo_env(&child.env);
|
||||
|
||||
child.git_cmd = 1;
|
||||
strvec_pushl(&child.args, "-C", abspath, NULL);
|
||||
|
||||
for (i = 0; i < argc; i++)
|
||||
strvec_push(&child.args, argv[i]);
|
||||
strvec_pushv(&child.args, argv);
|
||||
|
||||
free(abspath);
|
||||
|
||||
@@ -63,7 +63,7 @@ int cmd_for_each_repo(int argc,
|
||||
return 0;
|
||||
|
||||
for (size_t i = 0; i < values->nr; i++) {
|
||||
int ret = run_command_on_repo(values->items[i].string, argc, argv);
|
||||
int ret = run_command_on_repo(values->items[i].string, argv);
|
||||
if (ret) {
|
||||
if (!keep_going)
|
||||
return ret;
|
||||
|
||||
@@ -1971,7 +1971,7 @@ int run_auto_maintenance(int quiet)
|
||||
return run_command(&maint);
|
||||
}
|
||||
|
||||
void prepare_other_repo_env(struct strvec *env, const char *new_git_dir)
|
||||
void sanitize_repo_env(struct strvec *env)
|
||||
{
|
||||
const char * const *var;
|
||||
|
||||
@@ -1980,6 +1980,11 @@ void prepare_other_repo_env(struct strvec *env, const char *new_git_dir)
|
||||
strcmp(*var, CONFIG_COUNT_ENVIRONMENT))
|
||||
strvec_push(env, *var);
|
||||
}
|
||||
}
|
||||
|
||||
void prepare_other_repo_env(struct strvec *env, const char *new_git_dir)
|
||||
{
|
||||
sanitize_repo_env(env);
|
||||
strvec_pushf(env, "%s=%s", GIT_DIR_ENVIRONMENT, new_git_dir);
|
||||
}
|
||||
|
||||
|
||||
@@ -530,13 +530,18 @@ struct run_process_parallel_opts
|
||||
*/
|
||||
void run_processes_parallel(const struct run_process_parallel_opts *opts);
|
||||
|
||||
/**
|
||||
* Unset all local-repo GIT_* variables in env; see local_repo_env in
|
||||
* environment.h. GIT_CONFIG_PARAMETERS and GIT_CONFIG_COUNT are preserved
|
||||
* to pass -c and --config-env options from the parent process.
|
||||
*/
|
||||
void sanitize_repo_env(struct strvec *env);
|
||||
|
||||
/**
|
||||
* Convenience function which prepares env for a command to be run in a
|
||||
* new repo. This adds all GIT_* environment variables to env with the
|
||||
* exception of GIT_CONFIG_PARAMETERS and GIT_CONFIG_COUNT (which cause the
|
||||
* corresponding environment variables to be unset in the subprocess) and adds
|
||||
* an environment variable pointing to new_git_dir. See local_repo_env in
|
||||
* environment.h for more information.
|
||||
* new repo. This removes variables pointing to the local repository (using
|
||||
* sanitize_repo_env() above), and adds an environment variable pointing to
|
||||
* new_git_dir.
|
||||
*/
|
||||
void prepare_other_repo_env(struct strvec *env, const char *new_git_dir);
|
||||
|
||||
|
||||
@@ -2,17 +2,23 @@
|
||||
|
||||
test_description='git for-each-repo builtin'
|
||||
|
||||
# We need to test running 'git for-each-repo' outside of a repo context.
|
||||
TEST_NO_CREATE_REPO=1
|
||||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'run based on configured value' '
|
||||
git init one &&
|
||||
git init two &&
|
||||
git init three &&
|
||||
git init ~/four &&
|
||||
git init --initial-branch=one one &&
|
||||
git init --initial-branch=two two &&
|
||||
git -C two worktree add --orphan ../three &&
|
||||
git -C three checkout -b three &&
|
||||
git init --initial-branch=four ~/four &&
|
||||
|
||||
git -C two commit --allow-empty -m "DID NOT RUN" &&
|
||||
git config run.key "$TRASH_DIRECTORY/one" &&
|
||||
git config --add run.key "$TRASH_DIRECTORY/three" &&
|
||||
git config --add run.key "~/four" &&
|
||||
git config --global run.key "$TRASH_DIRECTORY/one" &&
|
||||
git config --global --add run.key "$TRASH_DIRECTORY/three" &&
|
||||
git config --global --add run.key "~/four" &&
|
||||
|
||||
git for-each-repo --config=run.key commit --allow-empty -m "ran" &&
|
||||
git -C one log -1 --pretty=format:%s >message &&
|
||||
grep ran message &&
|
||||
@@ -22,6 +28,7 @@ test_expect_success 'run based on configured value' '
|
||||
grep ran message &&
|
||||
git -C ~/four log -1 --pretty=format:%s >message &&
|
||||
grep ran message &&
|
||||
|
||||
git for-each-repo --config=run.key -- commit --allow-empty -m "ran again" &&
|
||||
git -C one log -1 --pretty=format:%s >message &&
|
||||
grep again message &&
|
||||
@@ -30,7 +37,43 @@ 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 &&
|
||||
test_grep "ran from worktree" message &&
|
||||
git -C two log -1 --pretty=format:%s >message &&
|
||||
test_grep ! "ran from worktree" message &&
|
||||
git -C three log -1 --pretty=format:%s >message &&
|
||||
test_grep "ran from worktree" message &&
|
||||
git -C ~/four log -1 --pretty=format:%s >message &&
|
||||
test_grep "ran from worktree" message &&
|
||||
|
||||
# Test running with config values set by environment
|
||||
cat >expect <<-EOF &&
|
||||
ran from worktree (HEAD -> refs/heads/one)
|
||||
ran from worktree (HEAD -> refs/heads/three)
|
||||
ran from worktree (HEAD -> refs/heads/four)
|
||||
EOF
|
||||
|
||||
GIT_CONFIG_PARAMETERS="${SQ}log.decorate=full${SQ}" \
|
||||
git -C three for-each-repo --config=run.key -- log --format="%s%d" -1 >out &&
|
||||
test_cmp expect out &&
|
||||
|
||||
cat >test-config <<-EOF &&
|
||||
[run]
|
||||
key = $(pwd)/one
|
||||
key = $(pwd)/three
|
||||
key = $(pwd)/four
|
||||
|
||||
[log]
|
||||
decorate = full
|
||||
EOF
|
||||
|
||||
GIT_CONFIG_GLOBAL="$(pwd)/test-config" \
|
||||
git -C three for-each-repo --config=run.key -- log --format="%s%d" -1 >out &&
|
||||
test_cmp expect out
|
||||
'
|
||||
|
||||
test_expect_success 'do nothing on empty config' '
|
||||
@@ -46,7 +89,7 @@ test_expect_success 'error on bad config keys' '
|
||||
'
|
||||
|
||||
test_expect_success 'error on NULL value for config keys' '
|
||||
cat >>.git/config <<-\EOF &&
|
||||
cat >>.gitconfig <<-\EOF &&
|
||||
[empty]
|
||||
key
|
||||
EOF
|
||||
@@ -59,8 +102,8 @@ test_expect_success 'error on NULL value for config keys' '
|
||||
'
|
||||
|
||||
test_expect_success '--keep-going' '
|
||||
git config keep.going non-existing &&
|
||||
git config --add keep.going . &&
|
||||
git config --global keep.going non-existing &&
|
||||
git config --global --add keep.going one &&
|
||||
|
||||
test_must_fail git for-each-repo --config=keep.going \
|
||||
-- branch >out 2>err &&
|
||||
@@ -70,7 +113,7 @@ test_expect_success '--keep-going' '
|
||||
test_must_fail git for-each-repo --config=keep.going --keep-going \
|
||||
-- branch >out 2>err &&
|
||||
test_grep "cannot change to .*non-existing" err &&
|
||||
git branch >expect &&
|
||||
git -C one branch >expect &&
|
||||
test_cmp expect out
|
||||
'
|
||||
|
||||
|
||||
Reference in New Issue
Block a user