From: Junio C Hamano Date: Tue, 11 Sep 2012 18:10:17 +0000 (-0700) Subject: Merge branch 'sz/submodule-force-update' into maint-1.7.11 X-Git-Tag: v1.7.11.6~2 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/ee7a83f6314a6fe281c8e3e041cfd42b5a2deb44?hp=-c Merge branch 'sz/submodule-force-update' into maint-1.7.11 * sz/submodule-force-update: Make 'git submodule update --force' always check out submodules. --- ee7a83f6314a6fe281c8e3e041cfd42b5a2deb44 diff --combined git-submodule.sh index dd3ae0e1a0,812a60fe4c..e89b516039 --- a/git-submodule.sh +++ b/git-submodule.sh @@@ -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 () { + 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) diff --combined t/t7406-submodule-update.sh index 646298b212,8e9c380c47..15426530e4 --- a/t/t7406-submodule-update.sh +++ b/t/t7406-submodule-update.sh @@@ -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 @@@ -384,7 -396,7 +396,7 @@@ 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 && @@@ -428,7 -440,7 +440,7 @@@ ) && 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