summaryrefslogtreecommitdiff
path: root/git-submodule.sh
diff options
context:
space:
mode:
Diffstat (limited to 'git-submodule.sh')
-rwxr-xr-xgit-submodule.sh83
1 files changed, 44 insertions, 39 deletions
diff --git a/git-submodule.sh b/git-submodule.sh
index d189a24..c94218b 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -34,7 +34,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=/
@@ -121,12 +121,17 @@ module_clone()
path=$1
url=$2
reference="$3"
+ quiet=
+ if test -n "$GIT_QUIET"
+ then
+ quiet=-q
+ fi
if test -n "$reference"
then
- git-clone "$reference" -n "$url" "$path"
+ git-clone $quiet "$reference" -n "$url" "$path"
else
- git-clone -n "$url" "$path"
+ git-clone $quiet -n "$url" "$path"
fi ||
die "Clone of '$url' into submodule path '$path' failed"
}
@@ -238,15 +243,6 @@ cmd_add()
die "'$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
@@ -260,6 +256,7 @@ cmd_add()
esac
) || die "Unable to checkout submodule '$path'"
fi
+ git config submodule."$path".url "$realrepo"
git add $force "$path" ||
die "Failed to add submodule '$path'"
@@ -300,6 +297,10 @@ 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
@@ -316,7 +317,7 @@ cmd_foreach()
then
cmd_foreach "--recursive" "$@"
fi
- ) ||
+ ) <&3 3<&- ||
die "Stopping at '$path'; script returned non-zero status."
fi
done
@@ -355,25 +356,26 @@ 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 "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'"
+ 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'"
@@ -874,17 +876,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 "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
}