Merge branch 'ml/submodule'
authorJunio C Hamano <gitster@pobox.com>
Thu, 28 Aug 2008 00:16:30 +0000 (17:16 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 28 Aug 2008 00:16:30 +0000 (17:16 -0700)
* ml/submodule:
git-submodule.sh - Remove trailing / from URL if found
git-submodule.sh - Remove trailing / from URL if found

1  2 
git-submodule.sh
diff --combined git-submodule.sh
index 4a95035d85d7563b84df15a09dc7c8160e9864ca,46d75aba3114778f277cb62b5b0fe84866b326c9..1c39b593a628cc94d24d227cc5d92e00ac5e71ed
@@@ -6,10 -6,9 +6,10 @@@
  
  USAGE="[--quiet] [--cached] \
  [add <repo> [-b branch] <path>]|[status|init|update [-i|--init]|summary [-n|--summary-limit <n>] [<commit>]] \
 -[--] [<path>...]"
 +[--] [<path>...]|[foreach <command>]|[sync [--] [<path>...]]"
  OPTIONS_SPEC=
  . git-sh-setup
 +. git-parse-remote
  require_work_tree
  
  command=
@@@ -31,10 -30,13 +31,11 @@@ say(
  # Resolve relative url by appending to parent's url
  resolve_relative_url ()
  {
 -      branch="$(git symbolic-ref HEAD 2>/dev/null)"
 -      remote="$(git config branch.${branch#refs/heads/}.remote)"
 -      remote="${remote:-origin}"
 +      remote=$(get_default_remote)
        remoteurl=$(git config "remote.$remote.url") ||
                die "remote ($remote) does not have a url defined in .git/config"
        url="$1"
+       remoteurl=${remoteurl%/}
        while test -n "$url"
        do
                case "$url" in
                        break;;
                esac
        done
-       echo "$remoteurl/$url"
+       echo "$remoteurl/${url%/}"
  }
  
 +#
 +# Get submodule info for registered submodules
 +# $@ = path to limit submodule list
 +#
 +module_list()
 +{
 +      git ls-files --stage -- "$@" | grep '^160000 '
 +}
 +
  #
  # Map submodule path to submodule name
  #
@@@ -206,26 -199,6 +207,26 @@@ cmd_add(
        die "Failed to register submodule '$path'"
  }
  
 +#
 +# Execute an arbitrary command sequence in each checked out
 +# submodule
 +#
 +# $@ = command to execute
 +#
 +cmd_foreach()
 +{
 +      module_list |
 +      while read mode sha1 stage path
 +      do
 +              if test -e "$path"/.git
 +              then
 +                      say "Entering '$path'"
 +                      (cd "$path" && eval "$@") ||
 +                      die "Stopping at '$path'; script returned non-zero status."
 +              fi
 +      done
 +}
 +
  #
  # Register submodules in .git/config
  #
@@@ -254,7 -227,7 +255,7 @@@ cmd_init(
                shift
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                # Skip already registered paths
@@@ -312,7 -285,7 +313,7 @@@ cmd_update(
                esac
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
@@@ -577,7 -550,7 +578,7 @@@ cmd_status(
                shift
        done
  
 -      git ls-files --stage -- "$@" | grep '^160000 ' |
 +      module_list "$@" |
        while read mode sha1 stage path
        do
                name=$(module_name "$path") || exit
                fi
        done
  }
 +#
 +# Sync remote urls for submodules
 +# This makes the value for remote.$remote.url match the value
 +# specified in .gitmodules.
 +#
 +cmd_sync()
 +{
 +      while test $# -ne 0
 +      do
 +              case "$1" in
 +              -q|--quiet)
 +                      quiet=1
 +                      shift
 +                      ;;
 +              --)
 +                      shift
 +                      break
 +                      ;;
 +              -*)
 +                      usage
 +                      ;;
 +              *)
 +                      break
 +                      ;;
 +              esac
 +      done
 +      cd_to_toplevel
 +      module_list "$@" |
 +      while read mode sha1 stage path
 +      do
 +              name=$(module_name "$path")
 +              url=$(git config -f .gitmodules --get submodule."$name".url)
 +              if test -e "$path"/.git
 +              then
 +              (
 +                      unset GIT_DIR
 +                      cd "$path"
 +                      remote=$(get_default_remote)
 +                      say "Synchronizing submodule url for '$name'"
 +                      git config remote."$remote".url "$url"
 +              )
 +              fi
 +      done
 +}
  
  # This loop parses the command line arguments to find the
  # subcommand name to dispatch.  Parsing of the subcommand specific
  while test $# != 0 && test -z "$command"
  do
        case "$1" in
 -      add | init | update | status | summary)
 +      add | foreach | init | update | status | summary | sync)
                command=$1
                ;;
        -q|--quiet)