Merge branch 'sz/submodule-force-update' into maint-1.7.11
authorJunio C Hamano <gitster@pobox.com>
Tue, 11 Sep 2012 18:10:17 +0000 (11:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 11 Sep 2012 18:10:17 +0000 (11:10 -0700)
* sz/submodule-force-update:
Make 'git submodule update --force' always check out submodules.

1  2 
git-submodule.sh
t/t7406-submodule-update.sh
diff --combined git-submodule.sh
index dd3ae0e1a0f52118933a64a49f85652e87a0fb3e,812a60fe4c4184d57ab22a43e0a471753f2a577a..e89b516039347ce8d3f28efaf8894d75e6bf1d8e
@@@ -73,48 -73,26 +73,48 @@@ resolve_relative_url (
  #
  module_list()
  {
 -      git ls-files --error-unmatch --stage -- "$@" |
 +      (
 +              git ls-files --error-unmatch --stage -- "$@" ||
 +              echo "unmatched pathspec exists"
 +      ) |
        perl -e '
        my %unmerged = ();
        my ($null_sha1) = ("0" x 40);
 +      my @out = ();
 +      my $unmatched = 0;
        while (<STDIN>) {
 +              if (/^unmatched pathspec/) {
 +                      $unmatched = 1;
 +                      next;
 +              }
                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";
 +                              push @out, "$mode $null_sha1 U\t$path\n";
                        }
                        next;
                }
 -              print "$_\n";
 +              push @out, "$_\n";
 +      }
 +      if ($unmatched) {
 +              print "#unmatched\n";
 +      } else {
 +              print for (@out);
        }
        '
  }
  
 +die_if_unmatched ()
 +{
 +      if test "$1" = "#unmatched"
 +      then
 +              exit 1
 +      fi
 +}
 +
  #
  # Map submodule path to submodule name
  #
@@@ -172,10 -150,8 +172,10 @@@ module_clone(
                die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
        fi
  
 -      a=$(cd "$gitdir" && pwd)/
 -      b=$(cd "$sm_path" && pwd)/
 +      # We already are at the root of the work tree but cd_to_toplevel will
 +      # resolve any symlinks that might be present in $PWD
 +      a=$(cd_to_toplevel && cd "$gitdir" && pwd)/
 +      b=$(cd_to_toplevel && cd "$sm_path" && pwd)/
        # normalize Windows-style absolute paths to POSIX-style absolute paths
        case $a in [a-zA-Z]:/*) a=/${a%%:*}${a#*:} ;; esac
        case $b in [a-zA-Z]:/*) b=/${b%%:*}${b#*:} ;; esac
@@@ -368,7 -344,6 +368,7 @@@ cmd_foreach(
        module_list |
        while read mode sha1 stage sm_path
        do
 +              die_if_unmatched "$mode"
                if test -e "$sm_path"/.git
                then
                        say "$(eval_gettext "Entering '\$prefix\$sm_path'")"
@@@ -421,7 -396,6 +421,7 @@@ cmd_init(
        module_list "$@" |
        while read mode sha1 stage sm_path
        do
 +              die_if_unmatched "$mode"
                name=$(module_name "$sm_path") || exit
  
                # Copy url setting when it is not set yet
@@@ -522,7 -496,6 +522,7 @@@ cmd_update(
        err=
        while read mode sha1 stage sm_path
        do
 +              die_if_unmatched "$mode"
                if test "$stage" = U
                then
                        echo >&2 "Skipping unmerged submodule $sm_path"
@@@ -564,7 -537,7 +564,7 @@@ Maybe you want to use 'update --init'?"
                        die "$(eval_gettext "Unable to find current revision in submodule path '\$sm_path'")"
                fi
  
-               if test "$subsha1" != "$sha1"
+               if test "$subsha1" != "$sha1" -o -n "$force"
                then
                        subforce=$force
                        # If we don't already have a -f flag and the submodule has never been checked out
@@@ -918,7 -891,6 +918,7 @@@ cmd_status(
        module_list "$@" |
        while read mode sha1 stage sm_path
        do
 +              die_if_unmatched "$mode"
                name=$(module_name "$sm_path") || exit
                url=$(git config submodule."$name".url)
                displaypath="$prefix$sm_path"
@@@ -987,7 -959,6 +987,7 @@@ cmd_sync(
        module_list "$@" |
        while read mode sha1 stage sm_path
        do
 +              die_if_unmatched "$mode"
                name=$(module_name "$sm_path")
                url=$(git config -f .gitmodules --get submodule."$name".url)
  
index 646298b2125fbbb7379ffb041099dc0d4bafaa55,8e9c380c47f33fcdc0a99646050cb6c67f9fa2e5..15426530e49ef2e42cda2528f4a72a784eb40cd9
@@@ -123,6 -123,18 +123,18 @@@ test_expect_success 'submodule update s
        )
  '
  
+ test_expect_success 'submodule update --force forcibly checks out submodules' '
+       (cd super &&
+        (cd submodule &&
+         rm -f file
+        ) &&
+        git submodule update --force submodule &&
+        (cd submodule &&
+         test "$(git status -s file)" = ""
+        )
+       )
+ '
  test_expect_success 'submodule update --rebase staying on master' '
        (cd super/submodule &&
          git checkout master
@@@ -367,7 -379,7 +379,7 @@@ test_expect_success 'submodule update c
         git submodule init &&
         git commit -am "new_submodule" &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../expect
 +        git rev-parse --verify HEAD >../expect
         ) &&
         (cd submodule &&
          test_commit "update_submodule" file
         git checkout HEAD^ &&
         test_must_fail git submodule update &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../actual
 +        git rev-parse --verify HEAD >../actual
         ) &&
         test_cmp expect actual
        )
@@@ -413,7 -425,7 +425,7 @@@ test_expect_success 'submodule update c
          test_commit "update_submodule_again_again" file
         ) &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../expect &&
 +        git rev-parse --verify HEAD >../expect &&
          test_commit "update_submodule2_again" file
         ) &&
         git add submodule &&
         ) &&
         test_must_fail git submodule update --recursive &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../actual
 +        git rev-parse --verify HEAD >../actual
         ) &&
         test_cmp expect actual
        )
@@@ -460,12 -472,12 +472,12 @@@ test_expect_success 'submodule update e
         ) &&
         git checkout HEAD^ &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../expect
 +        git rev-parse --verify HEAD >../expect
         ) &&
         git config submodule.submodule.update merge &&
         test_must_fail git submodule update &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../actual
 +        git rev-parse --verify HEAD >../actual
         ) &&
         test_cmp expect actual
        )
@@@ -495,12 -507,12 +507,12 @@@ test_expect_success 'submodule update e
         ) &&
         git checkout HEAD^ &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../expect
 +        git rev-parse --verify HEAD >../expect
         ) &&
         git config submodule.submodule.update rebase &&
         test_must_fail git submodule update &&
         (cd submodule2 &&
 -        git rev-parse --max-count=1 HEAD > ../actual
 +        git rev-parse --verify HEAD >../actual
         ) &&
         test_cmp expect actual
        )
@@@ -636,17 -648,4 +648,17 @@@ test_expect_success 'submodule update p
        )
  '
  
 +test_expect_success SYMLINKS 'submodule update can handle symbolic links in pwd' '
 +      mkdir -p linked/dir &&
 +      ln -s linked/dir linkto &&
 +      (
 +              cd linkto &&
 +              git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
 +              (
 +                      cd super &&
 +                      git submodule update --init --recursive
 +              )
 +      )
 +'
 +
  test_done