Merge branch 'rr/maint-submodule-unknown-cmd'
authorJunio C Hamano <gitster@pobox.com>
Sun, 30 Sep 2012 05:28:32 +0000 (22:28 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 30 Sep 2012 05:28:33 +0000 (22:28 -0700)
* rr/maint-submodule-unknown-cmd:
submodule: if $command was not matched, don't parse other args

1  2 
git-submodule.sh
t/t7400-submodule-basic.sh
diff --combined git-submodule.sh
index 3e2045e52daf43cc351af23af0fd770fb1a5044f,152ad9214bcd01a761c59a56a292eaa9e8b5bd51..ab6b1107b6090494f192f361471ed5748ffa7dc1
@@@ -30,22 -30,7 +30,22 @@@ nofetch
  update=
  prefix=
  
 -# Resolve relative url by appending to parent's url
 +# The function takes at most 2 arguments. The first argument is the
 +# URL that navigates to the submodule origin repo. When relative, this URL
 +# is relative to the superproject origin URL repo. The second up_path
 +# argument, if specified, is the relative path that navigates
 +# from the submodule working tree to the superproject working tree.
 +#
 +# The output of the function is the origin URL of the submodule.
 +#
 +# The output will either be an absolute URL or filesystem path (if the
 +# superproject origin URL is an absolute URL or filesystem path,
 +# respectively) or a relative file system path (if the superproject
 +# origin URL is a relative file system path).
 +#
 +# When the output is a relative file system path, the path is either
 +# relative to the submodule working tree, if up_path is specified, or to
 +# the superproject working tree otherwise.
  resolve_relative_url ()
  {
        remote=$(get_default_remote)
        url="$1"
        remoteurl=${remoteurl%/}
        sep=/
 +      up_path="$2"
 +
 +      case "$remoteurl" in
 +      *:*|/*)
 +              is_relative=
 +              ;;
 +      ./*|../*)
 +              is_relative=t
 +              ;;
 +      *)
 +              is_relative=t
 +              remoteurl="./$remoteurl"
 +              ;;
 +      esac
 +
        while test -n "$url"
        do
                case "$url" in
                                sep=:
                                ;;
                        *)
 -                              die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
 +                              if test -z "$is_relative" || test "." = "$remoteurl"
 +                              then
 +                                      die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"
 +                              else
 +                                      remoteurl=.
 +                              fi
                                ;;
                        esac
                        ;;
@@@ -99,8 -64,7 +99,8 @@@
                        break;;
                esac
        done
 -      echo "$remoteurl$sep${url%/}"
 +      remoteurl="$remoteurl$sep${url%/}"
 +      echo "${is_relative:+${up_path}}${remoteurl#./}"
  }
  
  #
@@@ -203,11 -167,8 +203,11 @@@ module_clone(
                rm -f "$gitdir/index"
        else
                mkdir -p "$gitdir_base"
 -              git clone $quiet -n ${reference:+"$reference"} \
 -                      --separate-git-dir "$gitdir" "$url" "$sm_path" ||
 +              (
 +                      clear_local_git_env
 +                      git clone $quiet -n ${reference:+"$reference"} \
 +                              --separate-git-dir "$gitdir" "$url" "$sm_path"
 +              ) ||
                die "$(eval_gettext "Clone of '\$url' into submodule path '\$sm_path' failed")"
        fi
  
@@@ -776,7 -737,7 +776,7 @@@ cmd_summary() 
        if [ -n "$files" ]
        then
                test -n "$cached" &&
 -              die "$(gettext -- "--cached cannot be used with --files")"
 +              die "$(gettext "The --cached option cannot be used with the --files option")"
                diff_cmd=diff-files
                head=
        fi
@@@ -1033,26 -994,14 +1033,26 @@@ cmd_sync(
                # Possibly a url relative to parent
                case "$url" in
                ./*|../*)
 -                      url=$(resolve_relative_url "$url") || exit
 +                      # rewrite foo/bar as ../.. to find path from
 +                      # submodule work tree to superproject work tree
 +                      up_path="$(echo "$sm_path" | sed "s/[^/][^/]*/../g")" &&
 +                      # guarantee a trailing /
 +                      up_path=${up_path%/}/ &&
 +                      # path from submodule work tree to submodule origin repo
 +                      sub_origin_url=$(resolve_relative_url "$url" "$up_path") &&
 +                      # path from superproject work tree to submodule origin repo
 +                      super_config_url=$(resolve_relative_url "$url") || exit
 +                      ;;
 +              *)
 +                      sub_origin_url="$url"
 +                      super_config_url="$url"
                        ;;
                esac
  
                if git config "submodule.$name.url" >/dev/null 2>/dev/null
                then
                        say "$(eval_gettext "Synchronizing submodule url for '\$name'")"
 -                      git config submodule."$name".url "$url"
 +                      git config submodule."$name".url "$super_config_url"
  
                        if test -e "$sm_path"/.git
                        then
                                clear_local_git_env
                                cd "$sm_path"
                                remote=$(get_default_remote)
 -                              git config remote."$remote".url "$url"
 +                              git config remote."$remote".url "$sub_origin_url"
                        )
                        fi
                fi
  done
  
  # No command word defaults to "status"
- test -n "$command" || command=status
+ if test -z "$command"
+ then
+     if test $# = 0
+     then
+       command=status
+     else
+       usage
+     fi
+ fi
  
  # "-b branch" is accepted only by "add"
  if test -n "$branch" && test "$command" != add
index 56a81cd7486716897cc4f08196d0815a62461ffd,442dc44e3c67529fe021c3239edaecb46a56054a..53970374913eaa6f1b5921b14b5f25043974e3a4
@@@ -438,8 -438,8 +438,8 @@@ test_expect_success 'moving to a commi
        git checkout second
  '
  
- test_expect_success 'submodule <invalid-path> warns' '
-       test_failure_with_unknown_submodule
+ test_expect_success 'submodule <invalid-subcommand> fails' '
+       test_must_fail git submodule no-such-subcommand
  '
  
  test_expect_success 'add submodules without specifying an explicit path' '
@@@ -501,72 -501,21 +501,72 @@@ test_expect_success 'set up for relativ
                git add sub &&
                git config -f .gitmodules submodule.sub.path sub &&
                git config -f .gitmodules submodule.sub.url ../subrepo &&
 -              cp .git/config pristine-.git-config
 +              cp .git/config pristine-.git-config &&
 +              cp .gitmodules pristine-.gitmodules
        )
  '
  
 -test_expect_success 'relative path works with URL' '
 +test_expect_success '../subrepo works with URL - ssh://hostname/repo' '
        (
                cd reltest &&
                cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
                git config remote.origin.url ssh://hostname/repo &&
                git submodule init &&
                test "$(git config submodule.sub.url)" = ssh://hostname/subrepo
        )
  '
  
 -test_expect_success 'relative path works with user@host:path' '
 +test_expect_success '../subrepo works with port-qualified URL - ssh://hostname:22/repo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url ssh://hostname:22/repo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = ssh://hostname:22/subrepo
 +      )
 +'
 +
 +# About the choice of the path in the next test:
 +# - double-slash side-steps path mangling issues on Windows
 +# - it is still an absolute local path
 +# - there cannot be a server with a blank in its name just in case the
 +#   path is used erroneously to access a //server/share style path
 +test_expect_success '../subrepo path works with local path - //somewhere else/repo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url "//somewhere else/repo" &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = "//somewhere else/subrepo"
 +      )
 +'
 +
 +test_expect_success '../subrepo works with file URL - file:///tmp/repo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url file:///tmp/repo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = file:///tmp/subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with helper URL- helper:://hostname/repo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url helper:://hostname/repo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = helper:://hostname/subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with scp-style URL - user@host:repo' '
        (
                cd reltest &&
                cp pristine-.git-config .git/config &&
        )
  '
  
 +test_expect_success '../subrepo works with scp-style URL - user@host:path/to/repo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url user@host:path/to/repo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = user@host:path/to/subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - foo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url foo &&
 +              # actual: fails with an error
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - foo/bar' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url foo/bar &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = foo/subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - ./foo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url ./foo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - ./foo/bar' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url ./foo/bar &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = foo/subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - ../foo' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url ../foo &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = ../subrepo
 +      )
 +'
 +
 +test_expect_success '../subrepo works with relative local path - ../foo/bar' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              git config remote.origin.url ../foo/bar &&
 +              git submodule init &&
 +              test "$(git config submodule.sub.url)" = ../foo/subrepo
 +      )
 +'
 +
 +test_expect_success '../bar/a/b/c works with relative local path - ../foo/bar.git' '
 +      (
 +              cd reltest &&
 +              cp pristine-.git-config .git/config &&
 +              cp pristine-.gitmodules .gitmodules &&
 +              mkdir -p a/b/c &&
 +              (cd a/b/c; git init) &&
 +              git config remote.origin.url ../foo/bar.git &&
 +              git submodule add ../bar/a/b/c ./a/b/c &&
 +              git submodule init &&
 +              test "$(git config submodule.a/b/c.url)" = ../foo/bar/a/b/c
 +      )
 +'
 +
  test_expect_success 'moving the superproject does not break submodules' '
        (
                cd addtest &&