Re: [RFC/PATCHv4] submodule update: allow custom update command
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 3, 2013, 17:17 UTC
- Message-ID
- <7v4ncbh8ap.fsf@alter.siamese.dyndns.org>
- In-Reply-To
- <1372842122-15568-1-git-send-email-judge.packham@gmail.com>
Chris Packham <judge.packham@gmail.com> writes:
Show 11 quoted lines
> Users can set submodule.$name.update to '!command' which will cause > 'command' to be run instead of checkout/merge/rebase. This allows the > user some finer grained control over how the update is done. The primary > motivation for this was interoperability with stgit however being able > to intercept the submodule update process may prove useful for > integrating with or extensions to other tools. > > Signed-off-by: Chris Packham <judge.packham@gmail.com> > --- > v4 adds a couple of simple tests - an equivalent of update=checkout and a test > to make sure we detect a failure reported by the update command.
I think this can drop RFC/ now ;-)
Will replace what was queued and merge to 'next' unless I hear otherwise within a few days.
Thanks.
Show 78 quoted lines
>
> Documentation/git-submodule.txt | 4 +++-
> git-submodule.sh | 6 ++++++
> t/t7406-submodule-update.sh | 29 +++++++++++++++++++++++++++++
> 3 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
> index e576713..2f18f7d 100644
> --- a/Documentation/git-submodule.txt
> +++ b/Documentation/git-submodule.txt
> @@ -159,7 +159,9 @@ update::
> This will make the submodules HEAD be detached unless `--rebase` or
> `--merge` is specified or the key `submodule.$name.update` is set to
> `rebase`, `merge` or `none`. `none` can be overridden by specifying
> - `--checkout`.
> + `--checkout`. Setting the key `submodule.$name.update` to `!command`
> + will cause `command` to be run. `command` can be any arbitrary shell
> + command that takes a single argument, namely the sha1 to update to.
> +
> If the submodule is not yet initialized, and you just want to use the
> setting as stored in .gitmodules, you can automatically initialize the
> diff --git a/git-submodule.sh b/git-submodule.sh
> index eb58c8e..e7579f0 100755
> --- a/git-submodule.sh
> +++ b/git-submodule.sh
> @@ -799,6 +799,12 @@ Maybe you want to use 'update --init'?")"
> say_msg="$(eval_gettext "Submodule path '\$prefix\$sm_path': merged in '\$sha1'")"
> must_die_on_failure=yes
> ;;
> + !*)
> + command="${update_module#!}"
> + die_msg="$(eval_gettext "Execution of '\$command \$sha1' failed in submodule path '\$prefix\$sm_path'")"
> + say_msg="$(eval_gettext "Submodule path '\$prefix\$sm_path': '\$command \$sha1'")"
> + must_die_on_failure=yes
> + ;;
> *)
> command="git checkout $subforce -q"
> die_msg="$(eval_gettext "Unable to checkout '\$sha1' in submodule path '\$prefix\$sm_path'")"
> diff --git a/t/t7406-submodule-update.sh b/t/t7406-submodule-update.sh
> index a4ffea0..48d1279 100755
> --- a/t/t7406-submodule-update.sh
> +++ b/t/t7406-submodule-update.sh
> @@ -279,6 +279,35 @@ test_expect_success 'submodule update - checkout in .git/config' '
> )
> '
>
> +test_expect_success 'submodule update - command in .git/config' '
> + (cd super &&
> + git config submodule.submodule.update "!git checkout"
> + ) &&
> + (cd super/submodule &&
> + git reset --hard HEAD^
> + ) &&
> + (cd super &&
> + (cd submodule &&
> + compare_head
> + ) &&
> + git submodule update submodule &&
> + cd submodule &&
> + ! compare_head
> + )
> +'
> +
> +test_expect_success 'submodule update - command in .git/config catches failure' '
> + (cd super &&
> + git config submodule.submodule.update "!false"
> + ) &&
> + (cd super/submodule &&
> + git reset --hard HEAD^
> + ) &&
> + (cd super &&
> + test_must_fail git submodule update submodule
> + )
> +'
> +
> test_expect_success 'submodule init picks up rebase' '
> (cd super &&
> git config -f .gitmodules submodule.rebasing.update rebase &&