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:
Junio C Hamano 2011-05-19 20:37:21 -07:00
commit 1d699f7934
2 changed files with 117 additions and 6 deletions

View File

@ -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))

View File

@ -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