Chris Packham <judge.packham@xxxxxxxxx> 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.packham@xxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html