зеркало из https://github.com/microsoft/git.git
Merge branch 'jl/submodule-conflicted-gitmodules'
* jl/submodule-conflicted-gitmodules: Submodules: Don't parse .gitmodules when it contains, merge conflicts test that git status works with merge conflict in, .gitmodules
This commit is contained in:
Коммит
1d699f7934
31
submodule.c
31
submodule.c
|
@ -14,6 +14,15 @@ static struct string_list config_fetch_recurse_submodules_for_name;
|
|||
static struct string_list config_ignore_for_name;
|
||||
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
||||
static struct string_list changed_submodule_paths;
|
||||
/*
|
||||
* The following flag is set if the .gitmodules file is unmerged. We then
|
||||
* disable recursion for all submodules where .git/config doesn't have a
|
||||
* matching config entry because we can't guess what might be configured in
|
||||
* .gitmodules unless the user resolves the conflict. When a command line
|
||||
* option is given (which always overrides configuration) this flag will be
|
||||
* ignored.
|
||||
*/
|
||||
static int gitmodules_is_unmerged;
|
||||
|
||||
static int add_submodule_odb(const char *path)
|
||||
{
|
||||
|
@ -63,6 +72,8 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
|
|||
ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util);
|
||||
if (ignore_option)
|
||||
handle_ignore_submodules_arg(diffopt, ignore_option->util);
|
||||
else if (gitmodules_is_unmerged)
|
||||
DIFF_OPT_SET(diffopt, IGNORE_SUBMODULES);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -82,9 +93,24 @@ void gitmodules_config(void)
|
|||
const char *work_tree = get_git_work_tree();
|
||||
if (work_tree) {
|
||||
struct strbuf gitmodules_path = STRBUF_INIT;
|
||||
int pos;
|
||||
strbuf_addstr(&gitmodules_path, work_tree);
|
||||
strbuf_addstr(&gitmodules_path, "/.gitmodules");
|
||||
git_config_from_file(submodule_config, gitmodules_path.buf, NULL);
|
||||
if (read_cache() < 0)
|
||||
die("index file corrupt");
|
||||
pos = cache_name_pos(".gitmodules", 11);
|
||||
if (pos < 0) { /* .gitmodules not found or isn't merged */
|
||||
pos = -1 - pos;
|
||||
if (active_nr > pos) { /* there is a .gitmodules */
|
||||
const struct cache_entry *ce = active_cache[pos];
|
||||
if (ce_namelen(ce) == 11 &&
|
||||
!memcmp(ce->name, ".gitmodules", 11))
|
||||
gitmodules_is_unmerged = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (!gitmodules_is_unmerged)
|
||||
git_config_from_file(submodule_config, gitmodules_path.buf, NULL);
|
||||
strbuf_release(&gitmodules_path);
|
||||
}
|
||||
}
|
||||
|
@ -434,7 +460,8 @@ int fetch_populated_submodules(int num_options, const char **options,
|
|||
default_argv = "on-demand";
|
||||
}
|
||||
} else {
|
||||
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
|
||||
if ((config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF) ||
|
||||
gitmodules_is_unmerged)
|
||||
continue;
|
||||
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) {
|
||||
if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
|
||||
|
|
|
@ -4,17 +4,21 @@ test_description='git status for submodule'
|
|||
|
||||
. ./test-lib.sh
|
||||
|
||||
test_expect_success 'setup' '
|
||||
test_create_repo sub &&
|
||||
test_create_repo_with_commit () {
|
||||
test_create_repo "$1" &&
|
||||
(
|
||||
cd sub &&
|
||||
cd "$1" &&
|
||||
: >bar &&
|
||||
git add bar &&
|
||||
git commit -m " Add bar" &&
|
||||
: >foo &&
|
||||
git add foo &&
|
||||
git commit -m " Add foo"
|
||||
) &&
|
||||
)
|
||||
}
|
||||
|
||||
test_expect_success 'setup' '
|
||||
test_create_repo_with_commit sub &&
|
||||
echo output > .gitignore &&
|
||||
git add sub .gitignore &&
|
||||
git commit -m "Add submodule sub"
|
||||
|
@ -187,4 +191,84 @@ test_expect_success 'status -a clean (empty submodule dir)' '
|
|||
test_i18ngrep "nothing to commit" output
|
||||
'
|
||||
|
||||
cat >status_expect <<\EOF
|
||||
AA .gitmodules
|
||||
A sub1
|
||||
EOF
|
||||
|
||||
test_expect_success 'status with merge conflict in .gitmodules' '
|
||||
git clone . super &&
|
||||
test_create_repo_with_commit sub1 &&
|
||||
test_tick &&
|
||||
test_create_repo_with_commit sub2 &&
|
||||
(
|
||||
cd super &&
|
||||
prev=$(git rev-parse HEAD) &&
|
||||
git checkout -b add_sub1 &&
|
||||
git submodule add ../sub1 &&
|
||||
git commit -m "add sub1" &&
|
||||
git checkout -b add_sub2 $prev &&
|
||||
git submodule add ../sub2 &&
|
||||
git commit -m "add sub2" &&
|
||||
git checkout -b merge_conflict_gitmodules &&
|
||||
test_must_fail git merge add_sub1 &&
|
||||
git status -s >../status_actual 2>&1
|
||||
) &&
|
||||
test_cmp status_actual status_expect
|
||||
'
|
||||
|
||||
sha1_merge_sub1=$(cd sub1 && git rev-parse HEAD)
|
||||
sha1_merge_sub2=$(cd sub2 && git rev-parse HEAD)
|
||||
short_sha1_merge_sub1=$(cd sub1 && git rev-parse --short HEAD)
|
||||
short_sha1_merge_sub2=$(cd sub2 && git rev-parse --short HEAD)
|
||||
cat >diff_expect <<\EOF
|
||||
diff --cc .gitmodules
|
||||
index badaa4c,44f999a..0000000
|
||||
--- a/.gitmodules
|
||||
+++ b/.gitmodules
|
||||
@@@ -1,3 -1,3 +1,9 @@@
|
||||
++<<<<<<< HEAD
|
||||
+[submodule "sub2"]
|
||||
+ path = sub2
|
||||
+ url = ../sub2
|
||||
++=======
|
||||
+ [submodule "sub1"]
|
||||
+ path = sub1
|
||||
+ url = ../sub1
|
||||
++>>>>>>> add_sub1
|
||||
EOF
|
||||
|
||||
cat >diff_submodule_expect <<\EOF
|
||||
diff --cc .gitmodules
|
||||
index badaa4c,44f999a..0000000
|
||||
--- a/.gitmodules
|
||||
+++ b/.gitmodules
|
||||
@@@ -1,3 -1,3 +1,9 @@@
|
||||
++<<<<<<< HEAD
|
||||
+[submodule "sub2"]
|
||||
+ path = sub2
|
||||
+ url = ../sub2
|
||||
++=======
|
||||
+ [submodule "sub1"]
|
||||
+ path = sub1
|
||||
+ url = ../sub1
|
||||
++>>>>>>> add_sub1
|
||||
EOF
|
||||
|
||||
test_expect_success 'diff with merge conflict in .gitmodules' '
|
||||
(
|
||||
cd super &&
|
||||
git diff >../diff_actual 2>&1
|
||||
) &&
|
||||
test_cmp diff_actual diff_expect
|
||||
'
|
||||
|
||||
test_expect_success 'diff --submodule with merge conflict in .gitmodules' '
|
||||
(
|
||||
cd super &&
|
||||
git diff --submodule >../diff_submodule_actual 2>&1
|
||||
) &&
|
||||
test_cmp diff_submodule_actual diff_submodule_expect
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Загрузка…
Ссылка в новой задаче