Index: crup-runner.sh |
=================================================================== |
--- crup-runner.sh (revision 174746) |
+++ crup-runner.sh (working copy) |
@@ -1,5 +1,60 @@ |
#!/bin/bash |
+set_target_os () { |
+ # Get the os we're building for. On first run, this will be unset. |
+ target_os=$(git config target.os 2>/dev/null) |
+ if [ -z "$target_os" ]; then |
+ case $(uname -s) in |
+ Linux) target_os=unix ;; |
+ Darwin) target_os=mac ;; |
+ CYGWIN*|MINGW*) target_os=win ;; |
+ *) |
+ echo "[$solution] *** No target.os set in .git/config, and I can't" 1>&2 |
+ echo "[$solution] *** figure it out from 'uname -s'" 1>&2 |
+ exit 1 |
+ ;; |
+ esac |
+ git config target.os "$target_os" |
+ fi |
+} |
+ |
+update_submodule_url () { |
+ # If the submodule's URL in .gitmodules has changed, propagate the new |
+ # new URL down. This is the same as `git submodule sync`, but we do it |
+ # this way because `git submodule sync` is absurdly slow. |
+ new_url=$(git config -f .gitmodules "submodule.$1.url" 2>/dev/null) |
+ old_url=$(git config "submodule.$1.url" 2>/dev/null) |
+ if [ -n "$old_url" -a "$new_url" != "$old_url" ]; then |
+ git config "submodule.$1.url" "$new_url" |
+ if [ -e "$1"/.git ]; then |
+ ( cd $submod && git config remote.origin.url "$new_url" ) |
+ fi |
+ fi |
+} |
+ |
+process_submodule () { |
+ # Check whether this submodule should be ignored or updated. |
+ # If it's a new submodule, match the os specified in .gitmodules against |
+ # the os specified in .git/config. |
+ update_policy=$(git config --get "submodule.$1.update") |
+ if [ -z "$update_policy" ]; then |
+ submod_os=$(git config -f .gitmodules --get "submodule.$1.os") |
+ if [ -n "$submod_os" -a \ |
+ "$submod_os" != "all" -a \ |
+ "${submod_os/${target_os}/}" = "${submod_os}" ]; then |
+ update_policy=none |
+ else |
+ git submodule --quiet init "$1" |
+ update_policy=checkout |
+ fi |
+ git config "submodule.$1.update" $update_policy |
+ fi |
+ if [ "$update_policy" != "none" ]; then |
+ update_submodule_url "$1" |
+ echo "$solution/$1" |
+ fi |
+} |
+ |
if [ -z "$*" ]; then |
exit 0 |
fi |
@@ -7,9 +62,10 @@ |
dir="$1" |
solution="${1%%/*}" |
cd "$solution" |
+ |
if [ "$solution" = "$1" ]; then |
+ # Don't "pull" if checkout is not on a named branch |
shift |
- # Don't "pull" if checkout is not on a named branch |
if test "$2" = "pull" && ( ! git symbolic-ref HEAD >/dev/null 2>/dev/null ); then |
first_args="$1 fetch" |
else |
@@ -20,33 +76,18 @@ |
if [ $? -ne 0 ]; then |
exit $? |
fi |
- "$GIT_EXE" submodule --quiet sync |
+ |
+ set_target_os |
+ |
"$GIT_EXE" ls-files -s | grep ^160000 | awk '{print $4}' | |
while read submod; do |
- # Check whether this submodule should be ignored or updated. |
- # If it's a new submodule, match the os specified in .gitmodules against |
- # the os specified in .git/config. |
- update_policy=$(git config "submodule.$submod.update" 2>/dev/null) |
- if [ -z "$update_policy" ]; then |
- target_os=$(git config target.os 2>/dev/null) |
- submod_os=$(git config -f .gitmodules "submodule.$submod.os" 2>/dev/null) |
- if [ -n "$target_os" -a -n "$submod_os" ] && |
- [ "$submod_os" != "all" -a "$submod_os" != "$target_os" ]; then |
- update_policy=none |
- else |
- update_policy=checkout |
- fi |
- git config "submodule.$submod.update" $update_policy 2>/dev/null |
- fi |
- if [ "$update_policy" != "none" ]; then |
- echo "$solution/$submod" |
- fi |
+ process_submodule "$submod" |
done |
status=$? |
else |
submodule="${1#*/}" |
- echo "[$solution] updating $submodule ..." |
- "$GIT_EXE" submodule update --quiet --init "$submodule" | |
+ echo "[$solution] updating $submodule" |
+ "$GIT_EXE" submodule update --quiet "$submodule" | |
( grep -v '^Skipping submodule' || true ) | sed "s|^|[$1] |g" |
status=$? |
if [ "$status" -ne "0" ]; then |