xref: /qemu/scripts/git-submodule.sh (revision f9540bb1)
1aef45d51SDaniel P. Berrange#!/bin/sh
2aef45d51SDaniel P. Berrange#
3aef45d51SDaniel P. Berrange# This code is licensed under the GPL version 2 or later.  See
4aef45d51SDaniel P. Berrange# the COPYING file in the top-level directory.
5aef45d51SDaniel P. Berrange
6aef45d51SDaniel P. Berrangesubstat=".git-submodule-status"
7aef45d51SDaniel P. Berrange
8aef45d51SDaniel P. Berrangecommand=$1
9aef45d51SDaniel P. Berrangeshift
1037b5e74eSDaniel P. Berrangemaybe_modules="$@"
11aef45d51SDaniel P. Berrange
128edddaa2SPaolo Bonzinitest -z "$maybe_modules" && exit 0
1350cfed80SPaolo Bonzinitest -z "$GIT" && GIT=$(command -v git)
14cc84d63aSDaniel P. Berrange
157d7dbf9dSDan Streetmancd "$(dirname "$0")/.."
167d7dbf9dSDan Streetman
178edddaa2SPaolo Bonzinino_git_error=
188edddaa2SPaolo Bonziniif ! test -e ".git"; then
198edddaa2SPaolo Bonzini    no_git_error='no git checkout exists'
208edddaa2SPaolo Bonzinielif test -z "$GIT"; then
218edddaa2SPaolo Bonzini    no_git_error='git binary not found'
228edddaa2SPaolo Bonzinifi
238edddaa2SPaolo Bonzini
248edddaa2SPaolo Bonziniis_git() {
258edddaa2SPaolo Bonzini    test -z "$no_git_error"
268edddaa2SPaolo Bonzini}
278edddaa2SPaolo Bonzini
287d7dbf9dSDan Streetmanupdate_error() {
29cc84d63aSDaniel P. Berrange    echo "$0: $*"
30cc84d63aSDaniel P. Berrange    echo
31cc84d63aSDaniel P. Berrange    echo "Unable to automatically checkout GIT submodules '$modules'."
32cc84d63aSDaniel P. Berrange    echo "If you require use of an alternative GIT binary (for example to"
3350cfed80SPaolo Bonzini    echo "enable use of a transparent proxy), please disable automatic"
3450cfed80SPaolo Bonzini    echo "GIT submodule checkout with:"
35f62bbee5SDaniel P. Berrange    echo
366f3ae23bSPaolo Bonzini    echo " $ ./configure --disable-download"
37f62bbee5SDaniel P. Berrange    echo
38f62bbee5SDaniel P. Berrange    echo "and then manually update submodules prior to running make, with:"
39f62bbee5SDaniel P. Berrange    echo
4050cfed80SPaolo Bonzini    echo " $ GIT='tsocks git' scripts/git-submodule.sh update $modules"
41f62bbee5SDaniel P. Berrange    echo
42cc84d63aSDaniel P. Berrange    exit 1
43cc84d63aSDaniel P. Berrange}
44cc84d63aSDaniel P. Berrange
457d7dbf9dSDan Streetmanvalidate_error() {
468edddaa2SPaolo Bonzini    if is_git && test "$1" = "validate"; then
477d7dbf9dSDan Streetman        echo "GIT submodules checkout is out of date, and submodules"
487d7dbf9dSDan Streetman        echo "configured for validate only. Please run"
497d7dbf9dSDan Streetman        echo "  scripts/git-submodule.sh update $maybe_modules"
507d7dbf9dSDan Streetman        echo "from the source directory or call configure with"
516f3ae23bSPaolo Bonzini        echo "  --enable-download"
527d7dbf9dSDan Streetman    fi
537d7dbf9dSDan Streetman    exit 1
547d7dbf9dSDan Streetman}
557d7dbf9dSDan Streetman
56d120116bSPaolo Bonzinicheck_updated() {
57d120116bSPaolo Bonzini    local CURSTATUS OLDSTATUS
58d120116bSPaolo Bonzini    CURSTATUS=$($GIT submodule status $module)
59d120116bSPaolo Bonzini    OLDSTATUS=$(grep $module $substat)
60d120116bSPaolo Bonzini    test "$CURSTATUS" = "$OLDSTATUS"
61d120116bSPaolo Bonzini}
62d120116bSPaolo Bonzini
638edddaa2SPaolo Bonziniif is_git; then
648edddaa2SPaolo Bonzini    test -e $substat || touch $substat
6537b5e74eSDaniel P. Berrange    modules=""
6637b5e74eSDaniel P. Berrange    for m in $maybe_modules
6737b5e74eSDaniel P. Berrange    do
6837b5e74eSDaniel P. Berrange        $GIT submodule status $m 1> /dev/null 2>&1
6937b5e74eSDaniel P. Berrange        if test $? = 0
7037b5e74eSDaniel P. Berrange        then
7137b5e74eSDaniel P. Berrange            modules="$modules $m"
728edddaa2SPaolo Bonzini            grep $m $substat > /dev/null 2>&1 || $GIT submodule status $module >> $substat
7337b5e74eSDaniel P. Berrange        else
7437b5e74eSDaniel P. Berrange            echo "warn: ignoring non-existent submodule $m"
7537b5e74eSDaniel P. Berrange        fi
7637b5e74eSDaniel P. Berrange    done
778edddaa2SPaolo Bonzinielse
788edddaa2SPaolo Bonzini    modules=$maybe_modules
798edddaa2SPaolo Bonzinifi
8037b5e74eSDaniel P. Berrange
81aef45d51SDaniel P. Berrangecase "$command" in
827d7dbf9dSDan Streetmanstatus|validate)
831a920d2bSJuan Quintela    for module in $modules; do
848edddaa2SPaolo Bonzini        if is_git; then
85d120116bSPaolo Bonzini            check_updated $module || validate_error "$command"
868edddaa2SPaolo Bonzini        elif ! (set xyz "$module"/* && test -e "$2"); then
878edddaa2SPaolo Bonzini            # The directory does not exist or it contains no files
888edddaa2SPaolo Bonzini            echo "$0: sources not available for $module and $no_git_error"
898edddaa2SPaolo Bonzini            validate_error "$command"
908edddaa2SPaolo Bonzini        fi
911a920d2bSJuan Quintela    done
92aef45d51SDaniel P. Berrange    ;;
938edddaa2SPaolo Bonzini
94aef45d51SDaniel P. Berrangeupdate)
958edddaa2SPaolo Bonzini    is_git || {
968edddaa2SPaolo Bonzini        echo "$0: unexpectedly called with submodules but $no_git_error"
978edddaa2SPaolo Bonzini        exit 1
988edddaa2SPaolo Bonzini    }
9949ad3cfaSDaniel P. Berrange
100cc84d63aSDaniel P. Berrange    $GIT submodule update --init $modules 1>/dev/null
1017d7dbf9dSDan Streetman    test $? -ne 0 && update_error "failed to update modules"
102d120116bSPaolo Bonzini    for module in $modules; do
103d120116bSPaolo Bonzini        check_updated $module || echo Updated "$module"
104d120116bSPaolo Bonzini    done
105cc84d63aSDaniel P. Berrange
106f9540bb1SPeter Maydell    (while read -r REPLY; do
107fdb8fd8cSPaolo Bonzini        for module in $modules; do
108fdb8fd8cSPaolo Bonzini            case $REPLY in
109fdb8fd8cSPaolo Bonzini                *" $module "*) continue 2 ;;
110fdb8fd8cSPaolo Bonzini            esac
111fdb8fd8cSPaolo Bonzini        done
112fdb8fd8cSPaolo Bonzini        printf '%s\n' "$REPLY"
113fdb8fd8cSPaolo Bonzini    done
114fdb8fd8cSPaolo Bonzini    $GIT submodule status $modules
115fdb8fd8cSPaolo Bonzini    test $? -ne 0 && update_error "failed to save git submodule status" >&2) < $substat > $substat.new
116fdb8fd8cSPaolo Bonzini    mv -f $substat.new $substat
117aef45d51SDaniel P. Berrange    ;;
118aef45d51SDaniel P. Berrangeesac
119cc84d63aSDaniel P. Berrange
120cc84d63aSDaniel P. Berrangeexit 0
121