From: Junio C Hamano Date: Thu, 28 Aug 2008 00:16:30 +0000 (-0700) Subject: Merge branch 'ml/submodule' X-Git-Tag: v1.6.1-rc1~295 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/8d13caf795902812d44809e2f222fb2334030603?ds=inline;hp=-c Merge branch 'ml/submodule' * ml/submodule: git-submodule.sh - Remove trailing / from URL if found git-submodule.sh - Remove trailing / from URL if found --- 8d13caf795902812d44809e2f222fb2334030603 diff --combined git-submodule.sh index 4a95035d85,46d75aba31..1c39b593a6 --- a/git-submodule.sh +++ b/git-submodule.sh @@@ -6,10 -6,9 +6,10 @@@ USAGE="[--quiet] [--cached] \ [add [-b branch] ]|[status|init|update [-i|--init]|summary [-n|--summary-limit ] []] \ -[--] [...]" +[--] [...]|[foreach ]|[sync [--] [...]]" 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 @@@ -49,18 -51,9 +50,18 @@@ 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 @@@ -601,50 -574,6 +602,50 @@@ 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 @@@ -655,7 -584,7 +656,7 @@@ 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)