diff options
Diffstat (limited to 'git-submodule.sh')
| -rwxr-xr-x | git-submodule.sh | 207 | 
1 files changed, 127 insertions, 80 deletions
diff --git a/git-submodule.sh b/git-submodule.sh index d189a24c71..bc1d3fa663 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -14,6 +14,7 @@ USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <r     or: $dashless [--quiet] sync [--] [<path>...]"  OPTIONS_SPEC=  . git-sh-setup +. git-sh-i18n  . git-parse-remote  require_work_tree @@ -34,7 +35,7 @@ resolve_relative_url ()  {  	remote=$(get_default_remote)  	remoteurl=$(git config "remote.$remote.url") || -		die "remote ($remote) does not have a url defined in .git/config" +		remoteurl=$(pwd) # the repository is its own authoritative upstream  	url="$1"  	remoteurl=${remoteurl%/}  	sep=/ @@ -52,7 +53,7 @@ resolve_relative_url ()  				sep=:  				;;  			*) -				die "cannot strip one component off url '$remoteurl'" +				die "$(eval_gettext "cannot strip one component off url '\$remoteurl'")"  				;;  			esac  			;; @@ -104,7 +105,7 @@ module_name()  	name=$( git config -f .gitmodules --get-regexp '^submodule\..*\.path$' |  		sed -n -e 's|^submodule\.\(.*\)\.path '"$re"'$|\1|p' )         test -z "$name" && -       die "No submodule mapping found in .gitmodules for path '$path'" +       die "$(eval_gettext "No submodule mapping found in .gitmodules for path '\$path'")"         echo "$name"  } @@ -128,7 +129,7 @@ module_clone()  	else  		git-clone -n "$url" "$path"  	fi || -	die "Clone of '$url' into submodule path '$path' failed" +	die "$(eval_gettext "Clone of '\$url' into submodule path '\$path' failed")"  }  # @@ -201,7 +202,7 @@ cmd_add()  		realrepo=$repo  		;;  	*) -		die "repo URL: '$repo' must be absolute or begin with ./|../" +		die "$(eval_gettext "repo URL: '\$repo' must be absolute or begin with ./|../")"  	;;  	esac @@ -218,13 +219,16 @@ cmd_add()  			s|/*$||  		')  	git ls-files --error-unmatch "$path" > /dev/null 2>&1 && -	die "'$path' already exists in the index" +	die "$(eval_gettext "'\$path' already exists in the index")"  	if test -z "$force" && ! git add --dry-run --ignore-missing "$path" > /dev/null 2>&1  	then -		echo >&2 "The following path is ignored by one of your .gitignore files:" && -		echo >&2 $path && -		echo >&2 "Use -f if you really want to add it." +		( +			eval_gettext "The following path is ignored by one of your .gitignore files: +\$path +Use -f if you really want to add it." && +			echo +		) >&2  		exit 1  	fi @@ -233,20 +237,11 @@ cmd_add()  	then  		if test -d "$path"/.git -o -f "$path"/.git  		then -			echo "Adding existing repo at '$path' to the index" +			eval_gettext "Adding existing repo at '\$path' to the index"; echo  		else -			die "'$path' already exists and is not a valid git repo" +			die "$(eval_gettext "'\$path' already exists and is not a valid git repo")"  		fi -		case "$repo" in -		./*|../*) -			url=$(resolve_relative_url "$repo") || exit -		    ;; -		*) -			url="$repo" -			;; -		esac -		git config submodule."$path".url "$url"  	else  		module_clone "$path" "$realrepo" "$reference" || exit @@ -258,16 +253,17 @@ cmd_add()  			'') git checkout -f -q ;;  			?*) git checkout -f -q -B "$branch" "origin/$branch" ;;  			esac -		) || die "Unable to checkout submodule '$path'" +		) || die "$(eval_gettext "Unable to checkout submodule '\$path'")"  	fi +	git config submodule."$path".url "$realrepo"  	git add $force "$path" || -	die "Failed to add submodule '$path'" +	die "$(eval_gettext "Failed to add submodule '\$path'")"  	git config -f .gitmodules submodule."$path".path "$path" &&  	git config -f .gitmodules submodule."$path".url "$repo" &&  	git add --force .gitmodules || -	die "Failed to register submodule '$path'" +	die "$(eval_gettext "Failed to register submodule '\$path'")"  }  # @@ -300,12 +296,16 @@ cmd_foreach()  	toplevel=$(pwd) +	# dup stdin so that it can be restored when running the external +	# command in the subshell (and a recursive call to this function) +	exec 3<&0 +  	module_list |  	while read mode sha1 stage path  	do  		if test -e "$path"/.git  		then -			say "Entering '$prefix$path'" +			say "$(eval_gettext "Entering '\$prefix\$path'")"  			name=$(module_name "$path")  			(  				prefix="$prefix$path/" @@ -316,8 +316,8 @@ cmd_foreach()  				then  					cmd_foreach "--recursive" "$@"  				fi -			) || -			die "Stopping at '$path'; script returned non-zero status." +			) <&3 3<&- || +			die "$(eval_gettext "Stopping at '\$path'; script returned non-zero status.")"  		fi  	done  } @@ -355,29 +355,30 @@ cmd_init()  	do  		# Skip already registered paths  		name=$(module_name "$path") || exit -		url=$(git config submodule."$name".url) -		test -z "$url" || continue - -		url=$(git config -f .gitmodules submodule."$name".url) -		test -z "$url" && -		die "No url found for submodule path '$path' in .gitmodules" - -		# Possibly a url relative to parent -		case "$url" in -		./*|../*) -			url=$(resolve_relative_url "$url") || exit -			;; -		esac - -		git config submodule."$name".url "$url" || -		die "Failed to register url for submodule path '$path'" +		if test -z "$(git config "submodule.$name.url")" +		then +			url=$(git config -f .gitmodules submodule."$name".url) +			test -z "$url" && +			die "$(eval_gettext "No url found for submodule path '\$path' in .gitmodules")" + +			# Possibly a url relative to parent +			case "$url" in +			./*|../*) +				url=$(resolve_relative_url "$url") || exit +				;; +			esac +			git config submodule."$name".url "$url" || +			die "$(eval_gettext "Failed to register url for submodule path '\$path'")" +		fi +		# Copy "update" setting when it is not set yet  		upd="$(git config -f .gitmodules submodule."$name".update)"  		test -z "$upd" || +		test -n "$(git config submodule."$name".update)" ||  		git config submodule."$name".update "$upd" || -		die "Failed to register update mode for submodule path '$path'" +		die "$(eval_gettext "Failed to register update mode for submodule path '\$path'")" -		say "Submodule '$name' ($url) registered for path '$path'" +		say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$path'")"  	done  } @@ -444,7 +445,8 @@ cmd_update()  	fi  	cloned_modules= -	module_list "$@" | +	module_list "$@" | { +	err=  	while read mode sha1 stage path  	do  		if test "$stage" = U @@ -460,8 +462,8 @@ cmd_update()  			# Only mention uninitialized submodules when its  			# path have been specified  			test "$#" != "0" && -			say "Submodule path '$path' not initialized" && -			say "Maybe you want to use 'update --init'?" +			say "$(eval_gettext "Submodule path '\$path' not initialized +Maybe you want to use 'update --init'?")"  			continue  		fi @@ -473,7 +475,7 @@ cmd_update()  		else  			subsha1=$(clear_local_git_env; cd "$path" &&  				git rev-parse --verify HEAD) || -			die "Unable to find current revision in submodule path '$path'" +			die "$(eval_gettext "Unable to find current revision in submodule path '\$path'")"  		fi  		if ! test -z "$update" @@ -497,7 +499,7 @@ cmd_update()  				(clear_local_git_env; cd "$path" &&  					( (rev=$(git rev-list -n 1 $sha1 --not --all 2>/dev/null) &&  					 test -z "$rev") || git-fetch)) || -				die "Unable to fetch in submodule path '$path'" +				die "$(eval_gettext "Unable to fetch in submodule path '\$path'")"  			fi  			# Is this something we just cloned? @@ -507,35 +509,72 @@ cmd_update()  				update_module= ;;  			esac +			must_die_on_failure=  			case "$update_module" in  			rebase)  				command="git rebase" -				action="rebase" -				msg="rebased onto" +				die_msg="$(eval_gettext "Unable to rebase '\$sha1' in submodule path '\$path'")" +				say_msg="$(eval_gettext "Submodule path '\$path': rebased into '\$sha1'")" +				must_die_on_failure=yes  				;;  			merge)  				command="git merge" -				action="merge" -				msg="merged in" +				die_msg="$(eval_gettext "Unable to merge '\$sha1' in submodule path '\$path'")" +				say_msg="$(eval_gettext "Submodule path '\$path': merged in '\$sha1'")" +				must_die_on_failure=yes  				;;  			*)  				command="git checkout $subforce -q" -				action="checkout" -				msg="checked out" +				die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$path'")" +				say_msg="$(eval_gettext "Submodule path '\$path': checked out '\$sha1'")"  				;;  			esac -			(clear_local_git_env; cd "$path" && $command "$sha1") || -			die "Unable to $action '$sha1' in submodule path '$path'" -			say "Submodule path '$path': $msg '$sha1'" +			if (clear_local_git_env; cd "$path" && $command "$sha1") +			then +				say "$say_msg" +			elif test -n "$must_die_on_failure" +			then +				die_with_status 2 "$die_msg" +			else +				err="${err};$die_msg" +				continue +			fi  		fi  		if test -n "$recursive"  		then -			(clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") || -			die "Failed to recurse into submodule path '$path'" +			(clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") +			res=$? +			if test $res -gt 0 +			then +				die_msg="$(eval_gettext "Failed to recurse into submodule path '\$path'")" +				if test $res -eq 1 +				then +					err="${err};$die_msg" +					continue +				else +					die_with_status $res "$die_msg" +				fi +			fi  		fi  	done + +	if test -n "$err" +	then +		OIFS=$IFS +		IFS=';' +		for e in $err +		do +			if test -n "$e" +			then +				echo >&2 "$e" +			fi +		done +		IFS=$OIFS +		exit 1 +	fi +	}  }  set_name_rev () { @@ -617,7 +656,7 @@ cmd_summary() {  	if [ -n "$files" ]  	then  		test -n "$cached" && -		die "--cached cannot be used with --files" +		die "$(gettext -- "--cached cannot be used with --files")"  		diff_cmd=diff-files  		head=  	fi @@ -657,7 +696,10 @@ cmd_summary() {  				;; # removed  			*)  				# unexpected type -				echo >&2 "unexpected mode $mod_dst" +				( +					eval_gettext "unexpected mode \$mod_dst" && +					echo +				) >&2  				continue ;;  			esac  		fi @@ -675,13 +717,13 @@ cmd_summary() {  		total_commits=  		case "$missing_src,$missing_dst" in  		t,) -			errmsg="  Warn: $name doesn't contain commit $sha1_src" +			errmsg="$(eval_gettext "  Warn: \$name doesn't contain commit \$sha1_src")"  			;;  		,t) -			errmsg="  Warn: $name doesn't contain commit $sha1_dst" +			errmsg="$(eval_gettext "  Warn: \$name doesn't contain commit \$sha1_dst")"  			;;  		t,t) -			errmsg="  Warn: $name doesn't contain commits $sha1_src and $sha1_dst" +			errmsg="$(eval_gettext "  Warn: \$name doesn't contain commits \$sha1_src and \$sha1_dst")"  			;;  		*)  			errmsg= @@ -706,11 +748,13 @@ cmd_summary() {  		sha1_abbr_dst=$(echo $sha1_dst | cut -c1-7)  		if test $status = T  		then +			blob="$(gettext "blob")" +			submodule="$(gettext "submodule")"  			if test $mod_dst = 160000  			then -				echo "* $name $sha1_abbr_src(blob)->$sha1_abbr_dst(submodule)$total_commits:" +				echo "* $name $sha1_abbr_src($blob)->$sha1_abbr_dst($submodule)$total_commits:"  			else -				echo "* $name $sha1_abbr_src(submodule)->$sha1_abbr_dst(blob)$total_commits:" +				echo "* $name $sha1_abbr_src($submodule)->$sha1_abbr_dst($blob)$total_commits:"  			fi  		else  			echo "* $name $sha1_abbr_src...$sha1_abbr_dst$total_commits:" @@ -742,9 +786,9 @@ cmd_summary() {  	done |  	if test -n "$for_status"; then  		if [ -n "$files" ]; then -			echo "# Submodules changed but not updated:" +			gettext "# Submodules changed but not updated:"; echo  		else -			echo "# Submodule changes to be committed:" +			gettext "# Submodule changes to be committed:"; echo  		fi  		echo "#"  		sed -e 's|^|# |' -e 's|^# $|#|' @@ -830,7 +874,7 @@ cmd_status()  				cd "$path" &&  				eval cmd_status "$orig_args"  			) || -			die "Failed to recurse into submodule path '$path'" +			die "$(eval_gettext "Failed to recurse into submodule path '\$path'")"  		fi  	done  } @@ -874,17 +918,20 @@ cmd_sync()  			;;  		esac -		say "Synchronizing submodule url for '$name'" -		git config submodule."$name".url "$url" - -		if test -e "$path"/.git +		if git config "submodule.$name.url" >/dev/null 2>/dev/null  		then -		( -			clear_local_git_env -			cd "$path" -			remote=$(get_default_remote) -			git config remote."$remote".url "$url" -		) +			say "$(eval_gettext "Synchronizing submodule url for '\$name'")" +			git config submodule."$name".url "$url" + +			if test -e "$path"/.git +			then +			( +				clear_local_git_env +				cd "$path" +				remote=$(get_default_remote) +				git config remote."$remote".url "$url" +			) +			fi  		fi  	done  }  | 
