| 1 | #!/bin/sh |
| 2 | # |
| 3 | # This code is licensed under the GPL version 2 or later. See |
| 4 | # the COPYING file in the top-level directory. |
| 5 | |
| 6 | substat=".git-submodule-status" |
| 7 | |
| 8 | command=$1 |
| 9 | shift |
| 10 | maybe_modules="$@" |
| 11 | |
| 12 | test -z "$maybe_modules" && exit 0 |
| 13 | test -z "$GIT" && GIT=$(command -v git) |
| 14 | |
| 15 | cd "$(dirname "$0")/.." |
| 16 | |
| 17 | no_git_error= |
| 18 | if ! test -e ".git"; then |
| 19 | no_git_error='no git checkout exists' |
| 20 | elif test -z "$GIT"; then |
| 21 | no_git_error='git binary not found' |
| 22 | fi |
| 23 | |
| 24 | is_git() { |
| 25 | test -z "$no_git_error" |
| 26 | } |
| 27 | |
| 28 | update_error() { |
| 29 | echo "$0: $*" |
| 30 | echo |
| 31 | echo "Unable to automatically checkout GIT submodules '$modules'." |
| 32 | echo "If you require use of an alternative GIT binary (for example to" |
| 33 | echo "enable use of a transparent proxy), please disable automatic" |
| 34 | echo "GIT submodule checkout with:" |
| 35 | echo |
| 36 | echo " $ ./configure --disable-download" |
| 37 | echo |
| 38 | echo "and then manually update submodules prior to running make, with:" |
| 39 | echo |
| 40 | echo " $ GIT='tsocks git' scripts/git-submodule.sh update $modules" |
| 41 | echo |
| 42 | exit 1 |
| 43 | } |
| 44 | |
| 45 | validate_error() { |
| 46 | if is_git && test "$1" = "validate"; then |
| 47 | echo "GIT submodules checkout is out of date, and submodules" |
| 48 | echo "configured for validate only. Please run" |
| 49 | echo " scripts/git-submodule.sh update $maybe_modules" |
| 50 | echo "from the source directory or call configure with" |
| 51 | echo " --enable-download" |
| 52 | fi |
| 53 | exit 1 |
| 54 | } |
| 55 | |
| 56 | check_updated() { |
| 57 | local CURSTATUS OLDSTATUS |
| 58 | CURSTATUS=$($GIT submodule status $module) |
| 59 | OLDSTATUS=$(grep $module $substat) |
| 60 | test "$CURSTATUS" = "$OLDSTATUS" |
| 61 | } |
| 62 | |
| 63 | if is_git; then |
| 64 | test -e $substat || touch $substat |
| 65 | modules="" |
| 66 | for m in $maybe_modules |
| 67 | do |
| 68 | $GIT submodule status $m 1> /dev/null 2>&1 |
| 69 | if test $? = 0 |
| 70 | then |
| 71 | modules="$modules $m" |
| 72 | grep $m $substat > /dev/null 2>&1 || $GIT submodule status $module >> $substat |
| 73 | else |
| 74 | echo "warn: ignoring non-existent submodule $m" |
| 75 | fi |
| 76 | done |
| 77 | else |
| 78 | modules=$maybe_modules |
| 79 | fi |
| 80 | |
| 81 | case "$command" in |
| 82 | status|validate) |
| 83 | for module in $modules; do |
| 84 | if is_git; then |
| 85 | check_updated $module || validate_error "$command" |
| 86 | elif ! (set xyz "$module"/* && test -e "$2"); then |
| 87 | # The directory does not exist or it contains no files |
| 88 | echo "$0: sources not available for $module and $no_git_error" |
| 89 | validate_error "$command" |
| 90 | fi |
| 91 | done |
| 92 | ;; |
| 93 | |
| 94 | update) |
| 95 | is_git || { |
| 96 | echo "$0: unexpectedly called with submodules but $no_git_error" |
| 97 | exit 1 |
| 98 | } |
| 99 | |
| 100 | $GIT submodule update --init $modules 1>/dev/null |
| 101 | test $? -ne 0 && update_error "failed to update modules" |
| 102 | for module in $modules; do |
| 103 | check_updated $module || echo Updated "$module" |
| 104 | done |
| 105 | |
| 106 | (while read -r REPLY; do |
| 107 | for module in $modules; do |
| 108 | case $REPLY in |
| 109 | *" $module "*) continue 2 ;; |
| 110 | esac |
| 111 | done |
| 112 | printf '%s\n' "$REPLY" |
| 113 | done |
| 114 | $GIT submodule status $modules |
| 115 | test $? -ne 0 && update_error "failed to save git submodule status" >&2) < $substat > $substat.new |
| 116 | mv -f $substat.new $substat |
| 117 | ;; |
| 118 | esac |
| 119 | |
| 120 | exit 0 |