Merge branch 'nm/maint-conflicted-submodule-entries'
* nm/maint-conflicted-submodule-entries: submodule: process conflicting submodules only once
This commit is contained in:
commit
1eb71bc0ec
@ -101,9 +101,10 @@ status::
|
||||
currently checked out commit for each submodule, along with the
|
||||
submodule path and the output of 'git describe' for the
|
||||
SHA-1. Each SHA-1 will be prefixed with `-` if the submodule is not
|
||||
initialized and `+` if the currently checked out submodule commit
|
||||
initialized, `+` if the currently checked out submodule commit
|
||||
does not match the SHA-1 found in the index of the containing
|
||||
repository. This command is the default command for 'git submodule'.
|
||||
repository and `U` if the submodule has merge conflicts.
|
||||
This command is the default command for 'git submodule'.
|
||||
+
|
||||
If '--recursive' is specified, this command will recurse into nested
|
||||
submodules, and show their status as well.
|
||||
|
@ -72,7 +72,24 @@ resolve_relative_url ()
|
||||
#
|
||||
module_list()
|
||||
{
|
||||
git ls-files --error-unmatch --stage -- "$@" | sane_grep '^160000 '
|
||||
git ls-files --error-unmatch --stage -- "$@" |
|
||||
perl -e '
|
||||
my %unmerged = ();
|
||||
my ($null_sha1) = ("0" x 40);
|
||||
while (<STDIN>) {
|
||||
chomp;
|
||||
my ($mode, $sha1, $stage, $path) =
|
||||
/^([0-7]+) ([0-9a-f]{40}) ([0-3])\t(.*)$/;
|
||||
next unless $mode eq "160000";
|
||||
if ($stage ne "0") {
|
||||
if (!$unmerged{$path}++) {
|
||||
print "$mode $null_sha1 U\t$path\n";
|
||||
}
|
||||
next;
|
||||
}
|
||||
print "$_\n";
|
||||
}
|
||||
'
|
||||
}
|
||||
|
||||
#
|
||||
@ -427,6 +444,11 @@ cmd_update()
|
||||
module_list "$@" |
|
||||
while read mode sha1 stage path
|
||||
do
|
||||
if test "$stage" = U
|
||||
then
|
||||
echo >&2 "Skipping unmerged submodule $path"
|
||||
continue
|
||||
fi
|
||||
name=$(module_name "$path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
update_module=$(git config submodule."$name".update)
|
||||
@ -770,6 +792,11 @@ cmd_status()
|
||||
name=$(module_name "$path") || exit
|
||||
url=$(git config submodule."$name".url)
|
||||
displaypath="$prefix$path"
|
||||
if test "$stage" = U
|
||||
then
|
||||
say "U$sha1 $displaypath"
|
||||
continue
|
||||
fi
|
||||
if test -z "$url" || ! test -d "$path"/.git -o -f "$path"/.git
|
||||
then
|
||||
say "-$sha1 $displaypath"
|
||||
|
@ -56,11 +56,11 @@ test_expect_success setup '
|
||||
|
||||
# History setup
|
||||
#
|
||||
# b
|
||||
# / \
|
||||
# a d
|
||||
# \ /
|
||||
# c
|
||||
# b
|
||||
# / \
|
||||
# init -- a d
|
||||
# \ \ /
|
||||
# g c
|
||||
#
|
||||
# a in the main repository records to sub-a in the submodule and
|
||||
# analogous b and c. d should be automatically found by merging c into
|
||||
@ -76,6 +76,8 @@ test_expect_success 'setup for merge search' '
|
||||
git add file-a &&
|
||||
git commit -m "sub-a" &&
|
||||
git branch sub-a) &&
|
||||
git commit --allow-empty -m init &&
|
||||
git branch init &&
|
||||
git add sub &&
|
||||
git commit -m "a" &&
|
||||
git branch a &&
|
||||
@ -101,7 +103,13 @@ test_expect_success 'setup for merge search' '
|
||||
git checkout -b sub-d sub-b &&
|
||||
git merge sub-c) &&
|
||||
git commit -a -m "d" &&
|
||||
git branch test b)
|
||||
git branch test b &&
|
||||
|
||||
git checkout -b g init &&
|
||||
(cd sub &&
|
||||
git checkout -b sub-g sub-c) &&
|
||||
git add sub &&
|
||||
git commit -a -m "g")
|
||||
'
|
||||
|
||||
test_expect_success 'merge with one side as a fast-forward of the other' '
|
||||
@ -176,6 +184,44 @@ test_expect_success 'merging should fail for changes that are backwards' '
|
||||
test_must_fail git merge f)
|
||||
'
|
||||
|
||||
|
||||
# Check that the conflicting submodule is detected when it is
|
||||
# in the common ancestor. status should be 'U00...00"
|
||||
test_expect_success 'git submodule status should display the merge conflict properly with merge base' '
|
||||
(cd merge-search &&
|
||||
cat >.gitmodules <<EOF &&
|
||||
[submodule "sub"]
|
||||
path = sub
|
||||
url = $TRASH_DIRECTORY/sub
|
||||
EOF
|
||||
cat >expect <<EOF &&
|
||||
U0000000000000000000000000000000000000000 sub
|
||||
EOF
|
||||
git submodule status > actual &&
|
||||
test_cmp expect actual &&
|
||||
git reset --hard)
|
||||
'
|
||||
|
||||
# Check that the conflicting submodule is detected when it is
|
||||
# not in the common ancestor. status should be 'U00...00"
|
||||
test_expect_success 'git submodule status should display the merge conflict properly without merge-base' '
|
||||
(cd merge-search &&
|
||||
git checkout -b test-no-merge-base g &&
|
||||
test_must_fail git merge b &&
|
||||
cat >.gitmodules <<EOF &&
|
||||
[submodule "sub"]
|
||||
path = sub
|
||||
url = $TRASH_DIRECTORY/sub
|
||||
EOF
|
||||
cat >expect <<EOF &&
|
||||
U0000000000000000000000000000000000000000 sub
|
||||
EOF
|
||||
git submodule status > actual &&
|
||||
test_cmp expect actual &&
|
||||
git reset --hard)
|
||||
'
|
||||
|
||||
|
||||
test_expect_success 'merging with a modify/modify conflict between merge bases' '
|
||||
git reset --hard HEAD &&
|
||||
git checkout -b test2 c &&
|
||||
|
Loading…
Reference in New Issue
Block a user