Chris Packham <judge.pack...@gmail.com> writes:

> 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.pack...@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.

>
>  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 &&
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to