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:
commit
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 struct string_list config_ignore_for_name;
|
||||||
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
||||||
static struct string_list changed_submodule_paths;
|
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)
|
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);
|
ignore_option = unsorted_string_list_lookup(&config_ignore_for_name, path_option->util);
|
||||||
if (ignore_option)
|
if (ignore_option)
|
||||||
handle_ignore_submodules_arg(diffopt, ignore_option->util);
|
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();
|
const char *work_tree = get_git_work_tree();
|
||||||
if (work_tree) {
|
if (work_tree) {
|
||||||
struct strbuf gitmodules_path = STRBUF_INIT;
|
struct strbuf gitmodules_path = STRBUF_INIT;
|
||||||
|
int pos;
|
||||||
strbuf_addstr(&gitmodules_path, work_tree);
|
strbuf_addstr(&gitmodules_path, work_tree);
|
||||||
strbuf_addstr(&gitmodules_path, "/.gitmodules");
|
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);
|
strbuf_release(&gitmodules_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -434,7 +460,8 @@ int fetch_populated_submodules(int num_options, const char **options,
|
|||||||
default_argv = "on-demand";
|
default_argv = "on-demand";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF)
|
if ((config_fetch_recurse_submodules == RECURSE_SUBMODULES_OFF) ||
|
||||||
|
gitmodules_is_unmerged)
|
||||||
continue;
|
continue;
|
||||||
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) {
|
if (config_fetch_recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) {
|
||||||
if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
|
if (!unsorted_string_list_lookup(&changed_submodule_paths, ce->name))
|
||||||
|
@ -4,17 +4,21 @@ test_description='git status for submodule'
|
|||||||
|
|
||||||
. ./test-lib.sh
|
. ./test-lib.sh
|
||||||
|
|
||||||
test_expect_success 'setup' '
|
test_create_repo_with_commit () {
|
||||||
test_create_repo sub &&
|
test_create_repo "$1" &&
|
||||||
(
|
(
|
||||||
cd sub &&
|
cd "$1" &&
|
||||||
: >bar &&
|
: >bar &&
|
||||||
git add bar &&
|
git add bar &&
|
||||||
git commit -m " Add bar" &&
|
git commit -m " Add bar" &&
|
||||||
: >foo &&
|
: >foo &&
|
||||||
git add foo &&
|
git add foo &&
|
||||||
git commit -m " Add foo"
|
git commit -m " Add foo"
|
||||||
) &&
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
test_expect_success 'setup' '
|
||||||
|
test_create_repo_with_commit sub &&
|
||||||
echo output > .gitignore &&
|
echo output > .gitignore &&
|
||||||
git add sub .gitignore &&
|
git add sub .gitignore &&
|
||||||
git commit -m "Add submodule sub"
|
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
|
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
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user