Including proposed patch... Signed-off-by: Marius Paliga <marius.paliga@xxxxxxxxx> --- Documentation/git-push.txt | 3 +++ builtin/push.c | 11 ++++++++++- t/t5545-push-options.sh | 48 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 3e76e99f3..133c42183 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -161,6 +161,9 @@ already exists on the remote side. Transmit the given string to the server, which passes them to the pre-receive as well as the post-receive hook. The given string must not contain a NUL or LF character. + Default push options can also be specified with configuration + variable `push.optiondefault`. String(s) specified here will always + be passed to the server without need to specify it using `--push-option` --receive-pack=<git-receive-pack>:: --exec=<git-receive-pack>:: diff --git a/builtin/push.c b/builtin/push.c index 2ac810422..4dd5d6f0e 100644 --- a/builtin/push.c +++ b/builtin/push.c @@ -32,6 +32,8 @@ static const char **refspec; static int refspec_nr; static int refspec_alloc; +static struct string_list push_options = STRING_LIST_INIT_DUP; + static void add_refspec(const char *ref) { refspec_nr++; @@ -467,6 +469,8 @@ static int git_push_config(const char *k, const char *v, void *cb) { int *flags = cb; int status; + const struct string_list *default_push_options; + struct string_list_item *item; status = git_gpg_config(k, v, NULL); if (status) @@ -505,6 +509,12 @@ static int git_push_config(const char *k, const char *v, void *cb) recurse_submodules = val; } + default_push_options = git_config_get_value_multi("push.optiondefault"); + if (default_push_options) + for_each_string_list_item(item, default_push_options) + if (!string_list_has_string(&push_options, item->string)) + string_list_append(&push_options, item->string); + return git_default_config(k, v, NULL); } @@ -515,7 +525,6 @@ int cmd_push(int argc, const char **argv, const char *prefix) int push_cert = -1; int rc; const char *repo = NULL; /* default repository */ - struct string_list push_options = STRING_LIST_INIT_DUP; const struct string_list_item *item; struct option options[] = { diff --git a/t/t5545-push-options.sh b/t/t5545-push-options.sh index 90a4b0d2f..575f3dc38 100755 --- a/t/t5545-push-options.sh +++ b/t/t5545-push-options.sh @@ -140,6 +140,54 @@ test_expect_success 'push options and submodules' ' test_cmp expect parent_upstream/.git/hooks/post-receive.push_options ' +test_expect_success 'default push option' ' + mk_repo_pair && + git -C upstream config receive.advertisePushOptions true && + ( + cd workbench && + test_commit one && + git push --mirror up && + test_commit two && + git -c push.optiondefault=default push up master + ) && + test_refs master master && + echo "default" >expect && + test_cmp expect upstream/.git/hooks/pre-receive.push_options && + test_cmp expect upstream/.git/hooks/post-receive.push_options +' + +test_expect_success 'two default push options' ' + mk_repo_pair && + git -C upstream config receive.advertisePushOptions true && + ( + cd workbench && + test_commit one && + git push --mirror up && + test_commit two && + git -c push.optiondefault=default1 -c push.optiondefault=default2 push up master + ) && + test_refs master master && + printf "default1\ndefault2\n" >expect && + test_cmp expect upstream/.git/hooks/pre-receive.push_options && + test_cmp expect upstream/.git/hooks/post-receive.push_options +' + +test_expect_success 'default and manual push options' ' + mk_repo_pair && + git -C upstream config receive.advertisePushOptions true && + ( + cd workbench && + test_commit one && + git push --mirror up && + test_commit two && + git -c push.optiondefault=default push --push-option=manual up master + ) && + test_refs master master && + printf "default\nmanual\n" >expect && + test_cmp expect upstream/.git/hooks/pre-receive.push_options && + test_cmp expect upstream/.git/hooks/post-receive.push_options +' + . "$TEST_DIRECTORY"/lib-httpd.sh start_httpd -- 2.14.1 2017-10-04 17:20 GMT+02:00 Marius Paliga <marius.paliga@xxxxxxxxx>: > Hi Stefan, > > I will look at it. > > Thanks, > Marius > > > 2017-10-03 18:53 GMT+02:00 Stefan Beller <sbeller@xxxxxxxxxx>: >> On Tue, Oct 3, 2017 at 3:15 AM, Marius Paliga <marius.paliga@xxxxxxxxx> wrote: >>> There is a need to pass predefined push-option during "git push" >>> without need to specify it explicitly. >>> >>> In another words we need to have a new "git config" variable to >>> specify string that will be automatically passed as "--push-option" >>> when pushing to remote. >>> >>> Something like the following: >>> >>> git config push.optionDefault AllowMultipleCommits >>> >>> and then command >>> git push >>> would silently run >>> git push --push-option "AllowMultipleCommits" >> >> We would need to >> * design this feature (seems like you already have a good idea what you need) >> * implement it (see builtin/push.c): >> - move "struct string_list push_options = STRING_LIST_INIT_DUP;" >> to be a file-static variable, such that we have access to it outside >> of cmd_push. >> - In git_push_config in builtin/push.c that parses the config, we'd >> need to check >> for "push.optionDefault" and add these to the push_options (I assume multiple >> are allowed) >> * document it (Documentation/git-push.txt) >> * add a test for it ? (t/t5545-push-options.sh) >> >> Care to write a patch? Otherwise I'd mark it up as part of >> #leftoverbits for now, >> as it seems like a good starter project. >> >> Thanks, >> Stefan