submodule: process conflicting submodules only once
[git/git.git] / git-submodule.sh
index 3a13397..7f6b3cf 100755 (executable)
@@ -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"