diff mbox series

[v2,1/4] build: allow setting a custom GIT binary for transparent proxying

Message ID 20171027131412.18830-2-berrange@redhat.com
State New
Headers show
Series Various improvements to submodule handling | expand

Commit Message

Daniel P. Berrangé Oct. 27, 2017, 1:14 p.m. UTC
Some users can't run a bare 'git' command, due to need for a transparent
proxying solution such as 'tsocks'. This adds an argument to configure to
let users specify such a thing:

  ./configure --with-git="tsocks git"

The submodule script is also updated to give the user a hint about using this
flag, if we fail to checkout modules.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
 Makefile                 |  4 ++--
 configure                |  5 +++++
 scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
 3 files changed, 32 insertions(+), 7 deletions(-)

Comments

Alexey Kardashevskiy Oct. 28, 2017, 1:53 a.m. UTC | #1
On 28/10/17 00:14, Daniel P. Berrange wrote:
> Some users can't run a bare 'git' command, due to need for a transparent
> proxying solution such as 'tsocks'. This adds an argument to configure to
> let users specify such a thing:
> 
>   ./configure --with-git="tsocks git"
> 
> The submodule script is also updated to give the user a hint about using this
> flag, if we fail to checkout modules.
> 
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> ---
>  Makefile                 |  4 ++--
>  configure                |  5 +++++
>  scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
>  3 files changed, 32 insertions(+), 7 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 9372742f86..4c9d0eaef2 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -21,14 +21,14 @@ git-submodule-update:
>  ifeq (0,$(MAKELEVEL))
>    git_module_status := $(shell \
>      cd '$(SRC_PATH)' && \
> -    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
> +    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
>      echo $$?; \
>    )
>  
>  ifeq (1,$(git_module_status))
>  git-submodule-update:
>  	$(call quiet-command, \
> -          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
> +          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
>            "GIT","$(GIT_SUBMODULES)")
>  endif
>  endif
> diff --git a/configure b/configure
> index 03547cea6a..65765968f3 100755
> --- a/configure
> +++ b/configure
> @@ -271,6 +271,7 @@ then
>  else
>      git_submodules=""
>  fi
> +git="git"
>  
>  # Don't accept a target_list environment variable.
>  unset target_list
> @@ -1294,6 +1295,8 @@ for opt do
>            error_exit "vhost-user isn't available on win32"
>        fi
>    ;;
> +  --with-git=*) git="$optarg"
> +  ;;
>    *)
>        echo "ERROR: unknown option $opt"
>        echo "Try '$0 --help' for more information"
> @@ -5338,6 +5341,7 @@ echo "local state directory   queried at runtime"
>  echo "Windows SDK       $win_sdk"
>  fi
>  echo "Source path       $source_path"
> +echo "GIT binary        $git"
>  echo "GIT submodules    $git_submodules"
>  echo "C compiler        $cc"
>  echo "Host C compiler   $host_cc"
> @@ -5528,6 +5532,7 @@ echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
>  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
>  echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
>  echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
> +echo "GIT=$git" >> $config_host_mak
>  echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
>  
>  echo "ARCH=$ARCH" >> $config_host_mak
> diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
> index 08932a35f0..c66567d409 100755
> --- a/scripts/git-submodule.sh
> +++ b/scripts/git-submodule.sh
> @@ -3,14 +3,19 @@
>  # This code is licensed under the GPL version 2 or later.  See
>  # the COPYING file in the top-level directory.
>  
> -set -e
> -
>  substat=".git-submodule-status"
>  
>  command=$1
>  shift
>  modules="$@"
>  
> +test -z "$GIT" && GIT=git
> +
> +error() {
> +    printf "$0: %s\n" "$*" >&2
> +    exit 1
> +}
> +
>  if test -z "$modules"
>  then
>      test -e $substat || touch $substat
> @@ -27,12 +32,27 @@ case "$command" in
>  status)
>      test -f "$substat" || exit 1
>      trap "rm -f ${substat}.tmp" EXIT
> -    git submodule status $modules > "${substat}.tmp"
> +    $GIT submodule status $modules > "${substat}.tmp"
> +    test $? -ne 0 && error "failed to query git submodule status"
>      diff "${substat}" "${substat}.tmp" >/dev/null
>      exit $?
>      ;;
>  update)
> -    git submodule update --init $modules 1>/dev/null
> -    git submodule status $modules > "${substat}"
> +    $GIT submodule update --init $modules 1>/dev/null
> +    if test $? -ne 0 ; then
> +        echo
> +        echo "Unable to automatically checkout GIT submodules '$modules'."
> +        echo "If you require use of an alternative GIT binary (for example to"
> +        echo "enable use of a transparent proxy), then please specify it by"
> +        echo "running configure by with the '--with-git' argument. e.g."
> +        echo
> +        echo " $ ./configure --with-git='tsocks git'"
> +        echo
> +        exit 1
> +    fi
> +    $GIT submodule status $modules > "${substat}"
> +    test $? -ne 0 && error "failed to save git submodule status"


The way I am testing it - I simply delete .git-submodule-status (I used to
change it but deleting works as well) and then I get:

./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
.git-submodule-status: Read-only file system

because "git submodule update" returns 0 (as everything is up to date) but
updating status fails. Which is fine, I would just like to get a better
message as even after few days of reading this script, I do not remember in
what order I should pass submodules to scripts/git-submodule.sh. Yeah, I
can find it in output but even the name of script to run does not stick to
my brain :(

Something like this:

-    test $? -ne 0 && error "failed to save git submodule status"
+    test $? -ne 0 && error "\"$GIT submodule status $modules\" failed to
save git submodule status"



>      ;;
>  esac
> +
> +exit 0
>
Daniel P. Berrangé Oct. 28, 2017, 8:45 p.m. UTC | #2
On Sat, Oct 28, 2017 at 12:53:50PM +1100, Alexey Kardashevskiy wrote:
> On 28/10/17 00:14, Daniel P. Berrange wrote:
> > Some users can't run a bare 'git' command, due to need for a transparent
> > proxying solution such as 'tsocks'. This adds an argument to configure to
> > let users specify such a thing:
> > 
> >   ./configure --with-git="tsocks git"
> > 
> > The submodule script is also updated to give the user a hint about using this
> > flag, if we fail to checkout modules.
> > 
> > Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> > ---
> >  Makefile                 |  4 ++--
> >  configure                |  5 +++++
> >  scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
> >  3 files changed, 32 insertions(+), 7 deletions(-)
> > 
> > diff --git a/Makefile b/Makefile
> > index 9372742f86..4c9d0eaef2 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -21,14 +21,14 @@ git-submodule-update:
> >  ifeq (0,$(MAKELEVEL))
> >    git_module_status := $(shell \
> >      cd '$(SRC_PATH)' && \
> > -    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
> > +    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
> >      echo $$?; \
> >    )
> >  
> >  ifeq (1,$(git_module_status))
> >  git-submodule-update:
> >  	$(call quiet-command, \
> > -          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
> > +          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
> >            "GIT","$(GIT_SUBMODULES)")
> >  endif
> >  endif
> > diff --git a/configure b/configure
> > index 03547cea6a..65765968f3 100755
> > --- a/configure
> > +++ b/configure
> > @@ -271,6 +271,7 @@ then
> >  else
> >      git_submodules=""
> >  fi
> > +git="git"
> >  
> >  # Don't accept a target_list environment variable.
> >  unset target_list
> > @@ -1294,6 +1295,8 @@ for opt do
> >            error_exit "vhost-user isn't available on win32"
> >        fi
> >    ;;
> > +  --with-git=*) git="$optarg"
> > +  ;;
> >    *)
> >        echo "ERROR: unknown option $opt"
> >        echo "Try '$0 --help' for more information"
> > @@ -5338,6 +5341,7 @@ echo "local state directory   queried at runtime"
> >  echo "Windows SDK       $win_sdk"
> >  fi
> >  echo "Source path       $source_path"
> > +echo "GIT binary        $git"
> >  echo "GIT submodules    $git_submodules"
> >  echo "C compiler        $cc"
> >  echo "Host C compiler   $host_cc"
> > @@ -5528,6 +5532,7 @@ echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
> >  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
> >  echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
> >  echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
> > +echo "GIT=$git" >> $config_host_mak
> >  echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
> >  
> >  echo "ARCH=$ARCH" >> $config_host_mak
> > diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
> > index 08932a35f0..c66567d409 100755
> > --- a/scripts/git-submodule.sh
> > +++ b/scripts/git-submodule.sh
> > @@ -3,14 +3,19 @@
> >  # This code is licensed under the GPL version 2 or later.  See
> >  # the COPYING file in the top-level directory.
> >  
> > -set -e
> > -
> >  substat=".git-submodule-status"
> >  
> >  command=$1
> >  shift
> >  modules="$@"
> >  
> > +test -z "$GIT" && GIT=git
> > +
> > +error() {
> > +    printf "$0: %s\n" "$*" >&2
> > +    exit 1
> > +}
> > +
> >  if test -z "$modules"
> >  then
> >      test -e $substat || touch $substat
> > @@ -27,12 +32,27 @@ case "$command" in
> >  status)
> >      test -f "$substat" || exit 1
> >      trap "rm -f ${substat}.tmp" EXIT
> > -    git submodule status $modules > "${substat}.tmp"
> > +    $GIT submodule status $modules > "${substat}.tmp"
> > +    test $? -ne 0 && error "failed to query git submodule status"
> >      diff "${substat}" "${substat}.tmp" >/dev/null
> >      exit $?
> >      ;;
> >  update)
> > -    git submodule update --init $modules 1>/dev/null
> > -    git submodule status $modules > "${substat}"
> > +    $GIT submodule update --init $modules 1>/dev/null
> > +    if test $? -ne 0 ; then
> > +        echo
> > +        echo "Unable to automatically checkout GIT submodules '$modules'."
> > +        echo "If you require use of an alternative GIT binary (for example to"
> > +        echo "enable use of a transparent proxy), then please specify it by"
> > +        echo "running configure by with the '--with-git' argument. e.g."
> > +        echo
> > +        echo " $ ./configure --with-git='tsocks git'"
> > +        echo
> > +        exit 1
> > +    fi
> > +    $GIT submodule status $modules > "${substat}"
> > +    test $? -ne 0 && error "failed to save git submodule status"
> 
> 
> The way I am testing it - I simply delete .git-submodule-status (I used to
> change it but deleting works as well) and then I get:
> 
> ./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
> .git-submodule-status: Read-only file system
> 
> because "git submodule update" returns 0 (as everything is up to date) but
> updating status fails. Which is fine, I would just like to get a better
> message as even after few days of reading this script, I do not remember in
> what order I should pass submodules to scripts/git-submodule.sh. Yeah, I
> can find it in output but even the name of script to run does not stick to
> my brain :(
> 
> Something like this:
> 
> -    test $? -ne 0 && error "failed to save git submodule status"
> +    test $? -ne 0 && error "\"$GIT submodule status $modules\" failed to
> save git submodule status"

Take a look at the 3rd patch - it now prints out the exact command you
would need to run in the writable-source dir.

Regards,
Daniel
Alexey Kardashevskiy Oct. 29, 2017, 1:47 a.m. UTC | #3
On 29/10/17 07:45, Daniel P. Berrange wrote:
> On Sat, Oct 28, 2017 at 12:53:50PM +1100, Alexey Kardashevskiy wrote:
>> On 28/10/17 00:14, Daniel P. Berrange wrote:
>>> Some users can't run a bare 'git' command, due to need for a transparent
>>> proxying solution such as 'tsocks'. This adds an argument to configure to
>>> let users specify such a thing:
>>>
>>>   ./configure --with-git="tsocks git"
>>>
>>> The submodule script is also updated to give the user a hint about using this
>>> flag, if we fail to checkout modules.
>>>
>>> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
>>> ---
>>>  Makefile                 |  4 ++--
>>>  configure                |  5 +++++
>>>  scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
>>>  3 files changed, 32 insertions(+), 7 deletions(-)
>>>
>>> diff --git a/Makefile b/Makefile
>>> index 9372742f86..4c9d0eaef2 100644
>>> --- a/Makefile
>>> +++ b/Makefile
>>> @@ -21,14 +21,14 @@ git-submodule-update:
>>>  ifeq (0,$(MAKELEVEL))
>>>    git_module_status := $(shell \
>>>      cd '$(SRC_PATH)' && \
>>> -    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
>>> +    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
>>>      echo $$?; \
>>>    )
>>>  
>>>  ifeq (1,$(git_module_status))
>>>  git-submodule-update:
>>>  	$(call quiet-command, \
>>> -          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
>>> +          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
>>>            "GIT","$(GIT_SUBMODULES)")
>>>  endif
>>>  endif
>>> diff --git a/configure b/configure
>>> index 03547cea6a..65765968f3 100755
>>> --- a/configure
>>> +++ b/configure
>>> @@ -271,6 +271,7 @@ then
>>>  else
>>>      git_submodules=""
>>>  fi
>>> +git="git"
>>>  
>>>  # Don't accept a target_list environment variable.
>>>  unset target_list
>>> @@ -1294,6 +1295,8 @@ for opt do
>>>            error_exit "vhost-user isn't available on win32"
>>>        fi
>>>    ;;
>>> +  --with-git=*) git="$optarg"
>>> +  ;;
>>>    *)
>>>        echo "ERROR: unknown option $opt"
>>>        echo "Try '$0 --help' for more information"
>>> @@ -5338,6 +5341,7 @@ echo "local state directory   queried at runtime"
>>>  echo "Windows SDK       $win_sdk"
>>>  fi
>>>  echo "Source path       $source_path"
>>> +echo "GIT binary        $git"
>>>  echo "GIT submodules    $git_submodules"
>>>  echo "C compiler        $cc"
>>>  echo "Host C compiler   $host_cc"
>>> @@ -5528,6 +5532,7 @@ echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
>>>  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
>>>  echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
>>>  echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
>>> +echo "GIT=$git" >> $config_host_mak
>>>  echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
>>>  
>>>  echo "ARCH=$ARCH" >> $config_host_mak
>>> diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
>>> index 08932a35f0..c66567d409 100755
>>> --- a/scripts/git-submodule.sh
>>> +++ b/scripts/git-submodule.sh
>>> @@ -3,14 +3,19 @@
>>>  # This code is licensed under the GPL version 2 or later.  See
>>>  # the COPYING file in the top-level directory.
>>>  
>>> -set -e
>>> -
>>>  substat=".git-submodule-status"
>>>  
>>>  command=$1
>>>  shift
>>>  modules="$@"
>>>  
>>> +test -z "$GIT" && GIT=git
>>> +
>>> +error() {
>>> +    printf "$0: %s\n" "$*" >&2
>>> +    exit 1
>>> +}
>>> +
>>>  if test -z "$modules"
>>>  then
>>>      test -e $substat || touch $substat
>>> @@ -27,12 +32,27 @@ case "$command" in
>>>  status)
>>>      test -f "$substat" || exit 1
>>>      trap "rm -f ${substat}.tmp" EXIT
>>> -    git submodule status $modules > "${substat}.tmp"
>>> +    $GIT submodule status $modules > "${substat}.tmp"
>>> +    test $? -ne 0 && error "failed to query git submodule status"
>>>      diff "${substat}" "${substat}.tmp" >/dev/null
>>>      exit $?
>>>      ;;
>>>  update)
>>> -    git submodule update --init $modules 1>/dev/null
>>> -    git submodule status $modules > "${substat}"
>>> +    $GIT submodule update --init $modules 1>/dev/null
>>> +    if test $? -ne 0 ; then
>>> +        echo
>>> +        echo "Unable to automatically checkout GIT submodules '$modules'."
>>> +        echo "If you require use of an alternative GIT binary (for example to"
>>> +        echo "enable use of a transparent proxy), then please specify it by"
>>> +        echo "running configure by with the '--with-git' argument. e.g."
>>> +        echo
>>> +        echo " $ ./configure --with-git='tsocks git'"
>>> +        echo
>>> +        exit 1
>>> +    fi
>>> +    $GIT submodule status $modules > "${substat}"
>>> +    test $? -ne 0 && error "failed to save git submodule status"
>>
>>
>> The way I am testing it - I simply delete .git-submodule-status (I used to
>> change it but deleting works as well) and then I get:
>>
>> ./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
>> .git-submodule-status: Read-only file system
>>
>> because "git submodule update" returns 0 (as everything is up to date) but
>> updating status fails. Which is fine, I would just like to get a better
>> message as even after few days of reading this script, I do not remember in
>> what order I should pass submodules to scripts/git-submodule.sh. Yeah, I
>> can find it in output but even the name of script to run does not stick to
>> my brain :(
>>
>> Something like this:
>>
>> -    test $? -ne 0 && error "failed to save git submodule status"
>> +    test $? -ne 0 && error "\"$GIT submodule status $modules\" failed to
>> save git submodule status"
> 
> Take a look at the 3rd patch - it now prints out the exact command you
> would need to run in the writable-source dir.

For the message in 3/4 to show up, I need to 1) know about
--disable-git-update and 2) use it. My testcase is lot more common - I did
not use --disable-git-update, and a strange message about writing read-only
folder appears, exactly like when I started the conversation.
Daniel P. Berrangé Oct. 29, 2017, 7:57 a.m. UTC | #4
On Sun, Oct 29, 2017 at 12:47:07PM +1100, Alexey Kardashevskiy wrote:
> On 29/10/17 07:45, Daniel P. Berrange wrote:
> > On Sat, Oct 28, 2017 at 12:53:50PM +1100, Alexey Kardashevskiy wrote:
> >> On 28/10/17 00:14, Daniel P. Berrange wrote:
> >>> Some users can't run a bare 'git' command, due to need for a transparent
> >>> proxying solution such as 'tsocks'. This adds an argument to configure to
> >>> let users specify such a thing:
> >>>
> >>>   ./configure --with-git="tsocks git"
> >>>
> >>> The submodule script is also updated to give the user a hint about using this
> >>> flag, if we fail to checkout modules.
> >>>
> >>> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
> >>> ---
> >>>  Makefile                 |  4 ++--
> >>>  configure                |  5 +++++
> >>>  scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
> >>>  3 files changed, 32 insertions(+), 7 deletions(-)
> >>>
> >>> diff --git a/Makefile b/Makefile
> >>> index 9372742f86..4c9d0eaef2 100644
> >>> --- a/Makefile
> >>> +++ b/Makefile
> >>> @@ -21,14 +21,14 @@ git-submodule-update:
> >>>  ifeq (0,$(MAKELEVEL))
> >>>    git_module_status := $(shell \
> >>>      cd '$(SRC_PATH)' && \
> >>> -    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
> >>> +    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
> >>>      echo $$?; \
> >>>    )
> >>>  
> >>>  ifeq (1,$(git_module_status))
> >>>  git-submodule-update:
> >>>  	$(call quiet-command, \
> >>> -          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
> >>> +          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
> >>>            "GIT","$(GIT_SUBMODULES)")
> >>>  endif
> >>>  endif
> >>> diff --git a/configure b/configure
> >>> index 03547cea6a..65765968f3 100755
> >>> --- a/configure
> >>> +++ b/configure
> >>> @@ -271,6 +271,7 @@ then
> >>>  else
> >>>      git_submodules=""
> >>>  fi
> >>> +git="git"
> >>>  
> >>>  # Don't accept a target_list environment variable.
> >>>  unset target_list
> >>> @@ -1294,6 +1295,8 @@ for opt do
> >>>            error_exit "vhost-user isn't available on win32"
> >>>        fi
> >>>    ;;
> >>> +  --with-git=*) git="$optarg"
> >>> +  ;;
> >>>    *)
> >>>        echo "ERROR: unknown option $opt"
> >>>        echo "Try '$0 --help' for more information"
> >>> @@ -5338,6 +5341,7 @@ echo "local state directory   queried at runtime"
> >>>  echo "Windows SDK       $win_sdk"
> >>>  fi
> >>>  echo "Source path       $source_path"
> >>> +echo "GIT binary        $git"
> >>>  echo "GIT submodules    $git_submodules"
> >>>  echo "C compiler        $cc"
> >>>  echo "Host C compiler   $host_cc"
> >>> @@ -5528,6 +5532,7 @@ echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
> >>>  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
> >>>  echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
> >>>  echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
> >>> +echo "GIT=$git" >> $config_host_mak
> >>>  echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
> >>>  
> >>>  echo "ARCH=$ARCH" >> $config_host_mak
> >>> diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
> >>> index 08932a35f0..c66567d409 100755
> >>> --- a/scripts/git-submodule.sh
> >>> +++ b/scripts/git-submodule.sh
> >>> @@ -3,14 +3,19 @@
> >>>  # This code is licensed under the GPL version 2 or later.  See
> >>>  # the COPYING file in the top-level directory.
> >>>  
> >>> -set -e
> >>> -
> >>>  substat=".git-submodule-status"
> >>>  
> >>>  command=$1
> >>>  shift
> >>>  modules="$@"
> >>>  
> >>> +test -z "$GIT" && GIT=git
> >>> +
> >>> +error() {
> >>> +    printf "$0: %s\n" "$*" >&2
> >>> +    exit 1
> >>> +}
> >>> +
> >>>  if test -z "$modules"
> >>>  then
> >>>      test -e $substat || touch $substat
> >>> @@ -27,12 +32,27 @@ case "$command" in
> >>>  status)
> >>>      test -f "$substat" || exit 1
> >>>      trap "rm -f ${substat}.tmp" EXIT
> >>> -    git submodule status $modules > "${substat}.tmp"
> >>> +    $GIT submodule status $modules > "${substat}.tmp"
> >>> +    test $? -ne 0 && error "failed to query git submodule status"
> >>>      diff "${substat}" "${substat}.tmp" >/dev/null
> >>>      exit $?
> >>>      ;;
> >>>  update)
> >>> -    git submodule update --init $modules 1>/dev/null
> >>> -    git submodule status $modules > "${substat}"
> >>> +    $GIT submodule update --init $modules 1>/dev/null
> >>> +    if test $? -ne 0 ; then
> >>> +        echo
> >>> +        echo "Unable to automatically checkout GIT submodules '$modules'."
> >>> +        echo "If you require use of an alternative GIT binary (for example to"
> >>> +        echo "enable use of a transparent proxy), then please specify it by"
> >>> +        echo "running configure by with the '--with-git' argument. e.g."
> >>> +        echo
> >>> +        echo " $ ./configure --with-git='tsocks git'"
> >>> +        echo
> >>> +        exit 1
> >>> +    fi
> >>> +    $GIT submodule status $modules > "${substat}"
> >>> +    test $? -ne 0 && error "failed to save git submodule status"
> >>
> >>
> >> The way I am testing it - I simply delete .git-submodule-status (I used to
> >> change it but deleting works as well) and then I get:
> >>
> >> ./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
> >> .git-submodule-status: Read-only file system
> >>
> >> because "git submodule update" returns 0 (as everything is up to date) but
> >> updating status fails. Which is fine, I would just like to get a better
> >> message as even after few days of reading this script, I do not remember in
> >> what order I should pass submodules to scripts/git-submodule.sh. Yeah, I
> >> can find it in output but even the name of script to run does not stick to
> >> my brain :(
> >>
> >> Something like this:
> >>
> >> -    test $? -ne 0 && error "failed to save git submodule status"
> >> +    test $? -ne 0 && error "\"$GIT submodule status $modules\" failed to
> >> save git submodule status"
> > 
> > Take a look at the 3rd patch - it now prints out the exact command you
> > would need to run in the writable-source dir.
> 
> For the message in 3/4 to show up, I need to 1) know about
> --disable-git-update and 2) use it. My testcase is lot more common - I did
> not use --disable-git-update, and a strange message about writing read-only
> folder appears, exactly like when I started the conversation.

That isn't the behaviour I get with this patch series applied. I made my
source dir readonly, and then tried a VPATH build and got the expected
messages

  ...snip....
  GIT     ui/keycodemapdb
error: could not lock config file .git/config: Permission denied
error: could not lock config file .git/config: Permission denied
fatal: Failed to register url for submodule path 'ui/keycodemapdb'

Unable to automatically checkout GIT submodules ' ui/keycodemapdb'.
If you require use of an alternative GIT binary (for example to
enable use of a transparent proxy), then please specify it by
running configure by with the '--with-git' argument. e.g.

 $ ./configure --with-git='tsocks git'

Alternatively you may disable automatic GIT submodule checkout
with:

 $ ./configure --disable-git-update'

and then manually update submodules prior to running make, with:

 $ scripts/git-sbumodule.sh update  ui/keycodemapdb

make: *** [Makefile:40: git-submodule-update] Error 1

Regards,
Daniel
Alexey Kardashevskiy Oct. 29, 2017, 2:08 p.m. UTC | #5
On 29/10/17 18:57, Daniel P. Berrange wrote:
> On Sun, Oct 29, 2017 at 12:47:07PM +1100, Alexey Kardashevskiy wrote:
>> On 29/10/17 07:45, Daniel P. Berrange wrote:
>>> On Sat, Oct 28, 2017 at 12:53:50PM +1100, Alexey Kardashevskiy wrote:
>>>> On 28/10/17 00:14, Daniel P. Berrange wrote:
>>>>> Some users can't run a bare 'git' command, due to need for a transparent
>>>>> proxying solution such as 'tsocks'. This adds an argument to configure to
>>>>> let users specify such a thing:
>>>>>
>>>>>   ./configure --with-git="tsocks git"
>>>>>
>>>>> The submodule script is also updated to give the user a hint about using this
>>>>> flag, if we fail to checkout modules.
>>>>>
>>>>> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
>>>>> ---
>>>>>  Makefile                 |  4 ++--
>>>>>  configure                |  5 +++++
>>>>>  scripts/git-submodule.sh | 30 +++++++++++++++++++++++++-----
>>>>>  3 files changed, 32 insertions(+), 7 deletions(-)
>>>>>
>>>>> diff --git a/Makefile b/Makefile
>>>>> index 9372742f86..4c9d0eaef2 100644
>>>>> --- a/Makefile
>>>>> +++ b/Makefile
>>>>> @@ -21,14 +21,14 @@ git-submodule-update:
>>>>>  ifeq (0,$(MAKELEVEL))
>>>>>    git_module_status := $(shell \
>>>>>      cd '$(SRC_PATH)' && \
>>>>> -    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
>>>>> +    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
>>>>>      echo $$?; \
>>>>>    )
>>>>>  
>>>>>  ifeq (1,$(git_module_status))
>>>>>  git-submodule-update:
>>>>>  	$(call quiet-command, \
>>>>> -          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
>>>>> +          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
>>>>>            "GIT","$(GIT_SUBMODULES)")
>>>>>  endif
>>>>>  endif
>>>>> diff --git a/configure b/configure
>>>>> index 03547cea6a..65765968f3 100755
>>>>> --- a/configure
>>>>> +++ b/configure
>>>>> @@ -271,6 +271,7 @@ then
>>>>>  else
>>>>>      git_submodules=""
>>>>>  fi
>>>>> +git="git"
>>>>>  
>>>>>  # Don't accept a target_list environment variable.
>>>>>  unset target_list
>>>>> @@ -1294,6 +1295,8 @@ for opt do
>>>>>            error_exit "vhost-user isn't available on win32"
>>>>>        fi
>>>>>    ;;
>>>>> +  --with-git=*) git="$optarg"
>>>>> +  ;;
>>>>>    *)
>>>>>        echo "ERROR: unknown option $opt"
>>>>>        echo "Try '$0 --help' for more information"
>>>>> @@ -5338,6 +5341,7 @@ echo "local state directory   queried at runtime"
>>>>>  echo "Windows SDK       $win_sdk"
>>>>>  fi
>>>>>  echo "Source path       $source_path"
>>>>> +echo "GIT binary        $git"
>>>>>  echo "GIT submodules    $git_submodules"
>>>>>  echo "C compiler        $cc"
>>>>>  echo "Host C compiler   $host_cc"
>>>>> @@ -5528,6 +5532,7 @@ echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
>>>>>  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
>>>>>  echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
>>>>>  echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
>>>>> +echo "GIT=$git" >> $config_host_mak
>>>>>  echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
>>>>>  
>>>>>  echo "ARCH=$ARCH" >> $config_host_mak
>>>>> diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
>>>>> index 08932a35f0..c66567d409 100755
>>>>> --- a/scripts/git-submodule.sh
>>>>> +++ b/scripts/git-submodule.sh
>>>>> @@ -3,14 +3,19 @@
>>>>>  # This code is licensed under the GPL version 2 or later.  See
>>>>>  # the COPYING file in the top-level directory.
>>>>>  
>>>>> -set -e
>>>>> -
>>>>>  substat=".git-submodule-status"
>>>>>  
>>>>>  command=$1
>>>>>  shift
>>>>>  modules="$@"
>>>>>  
>>>>> +test -z "$GIT" && GIT=git
>>>>> +
>>>>> +error() {
>>>>> +    printf "$0: %s\n" "$*" >&2
>>>>> +    exit 1
>>>>> +}
>>>>> +
>>>>>  if test -z "$modules"
>>>>>  then
>>>>>      test -e $substat || touch $substat
>>>>> @@ -27,12 +32,27 @@ case "$command" in
>>>>>  status)
>>>>>      test -f "$substat" || exit 1
>>>>>      trap "rm -f ${substat}.tmp" EXIT
>>>>> -    git submodule status $modules > "${substat}.tmp"
>>>>> +    $GIT submodule status $modules > "${substat}.tmp"
>>>>> +    test $? -ne 0 && error "failed to query git submodule status"
>>>>>      diff "${substat}" "${substat}.tmp" >/dev/null
>>>>>      exit $?
>>>>>      ;;
>>>>>  update)
>>>>> -    git submodule update --init $modules 1>/dev/null
>>>>> -    git submodule status $modules > "${substat}"
>>>>> +    $GIT submodule update --init $modules 1>/dev/null
>>>>> +    if test $? -ne 0 ; then
>>>>> +        echo
>>>>> +        echo "Unable to automatically checkout GIT submodules '$modules'."
>>>>> +        echo "If you require use of an alternative GIT binary (for example to"
>>>>> +        echo "enable use of a transparent proxy), then please specify it by"
>>>>> +        echo "running configure by with the '--with-git' argument. e.g."
>>>>> +        echo
>>>>> +        echo " $ ./configure --with-git='tsocks git'"
>>>>> +        echo
>>>>> +        exit 1
>>>>> +    fi
>>>>> +    $GIT submodule status $modules > "${substat}"
>>>>> +    test $? -ne 0 && error "failed to save git submodule status"
>>>>
>>>>
>>>> The way I am testing it - I simply delete .git-submodule-status (I used to
>>>> change it but deleting works as well) and then I get:
>>>>
>>>> ./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
>>>> .git-submodule-status: Read-only file system
>>>>
>>>> because "git submodule update" returns 0 (as everything is up to date) but
>>>> updating status fails. Which is fine, I would just like to get a better
>>>> message as even after few days of reading this script, I do not remember in
>>>> what order I should pass submodules to scripts/git-submodule.sh. Yeah, I
>>>> can find it in output but even the name of script to run does not stick to
>>>> my brain :(
>>>>
>>>> Something like this:
>>>>
>>>> -    test $? -ne 0 && error "failed to save git submodule status"
>>>> +    test $? -ne 0 && error "\"$GIT submodule status $modules\" failed to
>>>> save git submodule status"
>>>
>>> Take a look at the 3rd patch - it now prints out the exact command you
>>> would need to run in the writable-source dir.
>>
>> For the message in 3/4 to show up, I need to 1) know about
>> --disable-git-update and 2) use it. My testcase is lot more common - I did
>> not use --disable-git-update, and a strange message about writing read-only
>> folder appears, exactly like when I started the conversation.
> 
> That isn't the behaviour I get with this patch series applied. I made my
> source dir readonly, and then tried a VPATH build and got the expected
> messages

I run ./scripts/git-submodule.sh on a server (where source directory is
writeable), them "rm .git-submodule-status", then run "Makefile" on a build
machine (which has the source directory mounted as read-only). I basically
recreate the situation where I was when I just discovered this brand new
./scripts/git-submodule.sh.

> 
>   ...snip....
>   GIT     ui/keycodemapdb
> error: could not lock config file .git/config: Permission denied
> error: could not lock config file .git/config: Permission denied
> fatal: Failed to register url for submodule path 'ui/keycodemapdb'


I added "set -x" to the script and this is what I got:

make: Entering directory '/home/aik/pbuild/qemu-fstn1-ppc64'
+ substat=.git-submodule-status
+ command=status
+ shift
+ maybe_modules=ui/keycodemapdb dtc
+ test -z git
+ test -z ui/keycodemapdb dtc
+ modules=
+ git submodule status ui/keycodemapdb
+ test 0 -eq 0
+ modules= ui/keycodemapdb
+ git submodule status dtc
+ test 0 -eq 0
+ modules= ui/keycodemapdb dtc
+ test -e .git
+ test -f .git-submodule-status
+ exit 1
  GIT     ui/keycodemapdb dtc
+ substat=.git-submodule-status
+ command=update
+ shift
+ maybe_modules=ui/keycodemapdb dtc
+ test -z git
+ test -z ui/keycodemapdb dtc
+ modules=
+ git submodule status ui/keycodemapdb
+ test 0 -eq 0
+ modules= ui/keycodemapdb
+ git submodule status dtc
+ test 0 -eq 0
+ modules= ui/keycodemapdb dtc
+ test -e .git
+ git submodule update --init ui/keycodemapdb dtc
+ test 0 -ne 0
./scripts/git-submodule.sh: 74: ./scripts/git-submodule.sh: cannot create
.git-submodule-status: Read-only file system
+ git submodule status ui/keycodemapdb dtc
+ test 2 -ne 0
+ error failed to save git submodule status
+ printf ./scripts/git-submodule.sh: %s\n failed to save git submodule status
./scripts/git-submodule.sh: failed to save git submodule status
+ exit 1
Makefile:40: recipe for target 'git-submodule-update' failed
make: *** [git-submodule-update] Error 1
make: *** Waiting for unfinished jobs....
make: Leaving directory '/home/aik/pbuild/qemu-fstn1-ppc64'


"git submodule update" does not fail, why would it - the submodules are up
to date.


> 
> Unable to automatically checkout GIT submodules ' ui/keycodemapdb'.
> If you require use of an alternative GIT binary (for example to
> enable use of a transparent proxy), then please specify it by
> running configure by with the '--with-git' argument. e.g.
> 
>  $ ./configure --with-git='tsocks git'
> 
> Alternatively you may disable automatic GIT submodule checkout
> with:
> 
>  $ ./configure --disable-git-update'
> 
> and then manually update submodules prior to running make, with:
> 
>  $ scripts/git-sbumodule.sh update  ui/keycodemapdb


I know that now, all I am asking is an error message to print exact command
to run...


> 
> make: *** [Makefile:40: git-submodule-update] Error 1
> 
> Regards,
> Daniel
>
Daniel P. Berrangé Oct. 29, 2017, 4:29 p.m. UTC | #6
On Mon, Oct 30, 2017 at 01:08:56AM +1100, Alexey Kardashevskiy wrote:
> 
> I run ./scripts/git-submodule.sh on a server (where source directory is
> writeable), them "rm .git-submodule-status", then run "Makefile" on a build
> machine (which has the source directory mounted as read-only). I basically
> recreate the situation where I was when I just discovered this brand new
> ./scripts/git-submodule.sh.

Don't rm the .git-submodule-status. That means 'make' thinks the modules
are out of date.

Just run 'scripts/git-submodules.sh ...mods..' on the writable source
dir, and then run 'make' on the build machine.

> I know that now, all I am asking is an error message to print exact command
> to run...

If you hadn't deleted the .git-submodule-status, it would have worked fine.


Regards,
Daniel
Alexey Kardashevskiy Oct. 29, 2017, 11:49 p.m. UTC | #7
On 30/10/17 03:29, Daniel P. Berrange wrote:
> On Mon, Oct 30, 2017 at 01:08:56AM +1100, Alexey Kardashevskiy wrote:
>>
>> I run ./scripts/git-submodule.sh on a server (where source directory is
>> writeable), them "rm .git-submodule-status", then run "Makefile" on a build
>> machine (which has the source directory mounted as read-only). I basically
>> recreate the situation where I was when I just discovered this brand new
>> ./scripts/git-submodule.sh.
> 
> Don't rm the .git-submodule-status. That means 'make' thinks the modules
> are out of date.
> 
> Just run 'scripts/git-submodules.sh ...mods..' on the writable source
> dir, and then run 'make' on the build machine.
> 
>> I know that now, all I am asking is an error message to print exact command
>> to run...
> 
> If you hadn't deleted the .git-submodule-status, it would have worked fine.

No.

I do this on a server:

[vpl1 qemu]$ git co v2.10.0
At this point no .git-submodule-status is expected/required/exist.

[vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
-j24

Configure succeeds, compiles just fine, it has been working like this for
years.


Now:

[vpl1 qemu]$ git co git-submodule  (this is your stuff)
[vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
-j24
touch: cannot touch ‘.git-submodule-status’: Read-only file system
make: Entering directory `/home/aik/pbuild/qemu-aikhostos2-ppc64'
  GEN     ppc64-softmmu/config-devices.mak.tmp
[...]

./scripts/git-submodule.sh: line 74: .git-submodule-status: Read-only file
system
./scripts/git-submodule.sh: failed to save git submodule status
make: *** [git-submodule-update] Error 1


What, why? Out of nowhere we write to read-only folder and we do not even
bother telling why.

Am I the only one who would be confused by this change?


I only delete that file because I am testing the real situation which I
saw. Looks like nobody else is really testing this :(
Daniel P. Berrangé Oct. 30, 2017, 7:52 a.m. UTC | #8
On Mon, Oct 30, 2017 at 10:49:01AM +1100, Alexey Kardashevskiy wrote:
> On 30/10/17 03:29, Daniel P. Berrange wrote:
> > On Mon, Oct 30, 2017 at 01:08:56AM +1100, Alexey Kardashevskiy wrote:
> >>
> >> I run ./scripts/git-submodule.sh on a server (where source directory is
> >> writeable), them "rm .git-submodule-status", then run "Makefile" on a build
> >> machine (which has the source directory mounted as read-only). I basically
> >> recreate the situation where I was when I just discovered this brand new
> >> ./scripts/git-submodule.sh.
> > 
> > Don't rm the .git-submodule-status. That means 'make' thinks the modules
> > are out of date.
> > 
> > Just run 'scripts/git-submodules.sh ...mods..' on the writable source
> > dir, and then run 'make' on the build machine.
> > 
> >> I know that now, all I am asking is an error message to print exact command
> >> to run...
> > 
> > If you hadn't deleted the .git-submodule-status, it would have worked fine.
> 
> No.
> 
> I do this on a server:
> 
> [vpl1 qemu]$ git co v2.10.0
> At this point no .git-submodule-status is expected/required/exist.
> 
> [vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
> -j24
> 
> Configure succeeds, compiles just fine, it has been working like this for
> years.
> 
> 
> Now:
> 
> [vpl1 qemu]$ git co git-submodule  (this is your stuff)
> [vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
> -j24
> touch: cannot touch ‘.git-submodule-status’: Read-only file system
> make: Entering directory `/home/aik/pbuild/qemu-aikhostos2-ppc64'
>   GEN     ppc64-softmmu/config-devices.mak.tmp
> [...]
> 
> ./scripts/git-submodule.sh: line 74: .git-submodule-status: Read-only file
> system
> ./scripts/git-submodule.sh: failed to save git submodule status
> make: *** [git-submodule-update] Error 1

Oh I see, the git submodules list is empty because you have a previous
built source tree, so its shortcircuiting the extra check I added. Tihs
is easy enough to address


Regards,
Daniel
Alexey Kardashevskiy Oct. 31, 2017, 3:30 a.m. UTC | #9
On 30/10/17 18:52, Daniel P. Berrange wrote:
> On Mon, Oct 30, 2017 at 10:49:01AM +1100, Alexey Kardashevskiy wrote:
>> On 30/10/17 03:29, Daniel P. Berrange wrote:
>>> On Mon, Oct 30, 2017 at 01:08:56AM +1100, Alexey Kardashevskiy wrote:
>>>>
>>>> I run ./scripts/git-submodule.sh on a server (where source directory is
>>>> writeable), them "rm .git-submodule-status", then run "Makefile" on a build
>>>> machine (which has the source directory mounted as read-only). I basically
>>>> recreate the situation where I was when I just discovered this brand new
>>>> ./scripts/git-submodule.sh.
>>>
>>> Don't rm the .git-submodule-status. That means 'make' thinks the modules
>>> are out of date.
>>>
>>> Just run 'scripts/git-submodules.sh ...mods..' on the writable source
>>> dir, and then run 'make' on the build machine.
>>>
>>>> I know that now, all I am asking is an error message to print exact command
>>>> to run...
>>>
>>> If you hadn't deleted the .git-submodule-status, it would have worked fine.
>>
>> No.
>>
>> I do this on a server:
>>
>> [vpl1 qemu]$ git co v2.10.0
>> At this point no .git-submodule-status is expected/required/exist.
>>
>> [vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
>> -j24
>>
>> Configure succeeds, compiles just fine, it has been working like this for
>> years.
>>
>>
>> Now:
>>
>> [vpl1 qemu]$ git co git-submodule  (this is your stuff)
>> [vpl1 qemu]$ ssh aikhostos2 make -C /home/aik/pbuild/qemu-aikhostos2-ppc64/
>> -j24
>> touch: cannot touch ‘.git-submodule-status’: Read-only file system
>> make: Entering directory `/home/aik/pbuild/qemu-aikhostos2-ppc64'
>>   GEN     ppc64-softmmu/config-devices.mak.tmp
>> [...]
>>
>> ./scripts/git-submodule.sh: line 74: .git-submodule-status: Read-only file
>> system
>> ./scripts/git-submodule.sh: failed to save git submodule status
>> make: *** [git-submodule-update] Error 1
> 
> Oh I see, the git submodules list is empty because you have a previous
> built source tree, so its shortcircuiting the extra check I added. Tihs
> is easy enough to address


btw why is the name "git-submodule.sh", not update-submodule.sh or
update-git-submodule.sh on a par with update-linux-headers.sh?
diff mbox series

Patch

diff --git a/Makefile b/Makefile
index 9372742f86..4c9d0eaef2 100644
--- a/Makefile
+++ b/Makefile
@@ -21,14 +21,14 @@  git-submodule-update:
 ifeq (0,$(MAKELEVEL))
   git_module_status := $(shell \
     cd '$(SRC_PATH)' && \
-    ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
+    GIT="$(GIT)" ./scripts/git-submodule.sh status $(GIT_SUBMODULES); \
     echo $$?; \
   )
 
 ifeq (1,$(git_module_status))
 git-submodule-update:
 	$(call quiet-command, \
-          (cd $(SRC_PATH) && ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
+          (cd $(SRC_PATH) && GIT="$(GIT)" ./scripts/git-submodule.sh update $(GIT_SUBMODULES)), \
           "GIT","$(GIT_SUBMODULES)")
 endif
 endif
diff --git a/configure b/configure
index 03547cea6a..65765968f3 100755
--- a/configure
+++ b/configure
@@ -271,6 +271,7 @@  then
 else
     git_submodules=""
 fi
+git="git"
 
 # Don't accept a target_list environment variable.
 unset target_list
@@ -1294,6 +1295,8 @@  for opt do
           error_exit "vhost-user isn't available on win32"
       fi
   ;;
+  --with-git=*) git="$optarg"
+  ;;
   *)
       echo "ERROR: unknown option $opt"
       echo "Try '$0 --help' for more information"
@@ -5338,6 +5341,7 @@  echo "local state directory   queried at runtime"
 echo "Windows SDK       $win_sdk"
 fi
 echo "Source path       $source_path"
+echo "GIT binary        $git"
 echo "GIT submodules    $git_submodules"
 echo "C compiler        $cc"
 echo "Host C compiler   $host_cc"
@@ -5528,6 +5532,7 @@  echo "extra_cxxflags=$EXTRA_CXXFLAGS" >> $config_host_mak
 echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
 echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
 echo "libs_softmmu=$libs_softmmu" >> $config_host_mak
+echo "GIT=$git" >> $config_host_mak
 echo "GIT_SUBMODULES=$git_submodules" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
diff --git a/scripts/git-submodule.sh b/scripts/git-submodule.sh
index 08932a35f0..c66567d409 100755
--- a/scripts/git-submodule.sh
+++ b/scripts/git-submodule.sh
@@ -3,14 +3,19 @@ 
 # This code is licensed under the GPL version 2 or later.  See
 # the COPYING file in the top-level directory.
 
-set -e
-
 substat=".git-submodule-status"
 
 command=$1
 shift
 modules="$@"
 
+test -z "$GIT" && GIT=git
+
+error() {
+    printf "$0: %s\n" "$*" >&2
+    exit 1
+}
+
 if test -z "$modules"
 then
     test -e $substat || touch $substat
@@ -27,12 +32,27 @@  case "$command" in
 status)
     test -f "$substat" || exit 1
     trap "rm -f ${substat}.tmp" EXIT
-    git submodule status $modules > "${substat}.tmp"
+    $GIT submodule status $modules > "${substat}.tmp"
+    test $? -ne 0 && error "failed to query git submodule status"
     diff "${substat}" "${substat}.tmp" >/dev/null
     exit $?
     ;;
 update)
-    git submodule update --init $modules 1>/dev/null
-    git submodule status $modules > "${substat}"
+    $GIT submodule update --init $modules 1>/dev/null
+    if test $? -ne 0 ; then
+        echo
+        echo "Unable to automatically checkout GIT submodules '$modules'."
+        echo "If you require use of an alternative GIT binary (for example to"
+        echo "enable use of a transparent proxy), then please specify it by"
+        echo "running configure by with the '--with-git' argument. e.g."
+        echo
+        echo " $ ./configure --with-git='tsocks git'"
+        echo
+        exit 1
+    fi
+    $GIT submodule status $modules > "${substat}"
+    test $? -ne 0 && error "failed to save git submodule status"
     ;;
 esac
+
+exit 0