From: Marius Paliga <marius.paliga@gmail.com>
To: Stefan Beller <sbeller@google.com>
Cc: "git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: Enhancement request: git-push: Allow (configurable) default push-option
Date: Wed, 11 Oct 2017 11:18:45 +0200 [thread overview]
Message-ID: <CAK7vU=0tRu=MAtBWHaQ6pGOGMfYdEorNd_930jq_3n_tLY2hsg@mail.gmail.com> (raw)
In-Reply-To: <CAK7vU=22W9mYdSnw_LP2uWYyKZuTzF0JgTVWCX+nMhUnLjQ_Cw@mail.gmail.com>
Found one possible issue when looking for duplicates, we need to use
"unsorted_string_list_has_string" instead of "string_list_has_string"
- if (!string_list_has_string(&push_options,
item->string))
+ if
(!unsorted_string_list_has_string(&push_options, item->string)) {
New (fixed) patch follows...
Signed-off-by: Marius Paliga <marius.paliga@gmail.com>
---
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..ab458419a 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 (!unsorted_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-11 9:14 GMT+02:00 Marius Paliga <marius.paliga@gmail.com>:
> Including proposed patch...
>
>
> Signed-off-by: Marius Paliga <marius.paliga@gmail.com>
> ---
> 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@gmail.com>:
>> Hi Stefan,
>>
>> I will look at it.
>>
>> Thanks,
>> Marius
>>
>>
>> 2017-10-03 18:53 GMT+02:00 Stefan Beller <sbeller@google.com>:
>>> On Tue, Oct 3, 2017 at 3:15 AM, Marius Paliga <marius.paliga@gmail.com> 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
next prev parent reply other threads:[~2017-10-11 9:18 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-03 10:15 Enhancement request: git-push: Allow (configurable) default push-option Marius Paliga
2017-10-03 16:53 ` Stefan Beller
2017-10-04 15:20 ` Marius Paliga
2017-10-11 7:14 ` Marius Paliga
2017-10-11 9:18 ` Marius Paliga [this message]
2017-10-11 20:52 ` Stefan Beller
2017-10-11 11:13 ` Junio C Hamano
2017-10-11 13:38 ` Junio C Hamano
2017-10-12 14:59 ` Marius Paliga
2017-10-12 16:32 ` Marius Paliga
2017-10-12 16:51 ` Stefan Beller
2017-10-13 1:39 ` Junio C Hamano
2017-10-13 0:37 ` Junio C Hamano
2017-10-13 8:45 ` Marius Paliga
2017-10-11 20:25 ` Thais D. Braz
2017-10-11 20:25 ` [PATCH][Outreachy] New git config variable to specify string that will be automatically passed as --push-option Thais D. Braz
2017-10-12 1:21 ` Junio C Hamano
2017-10-12 2:41 ` Christian Couder
2017-10-12 3:26 ` Junio C Hamano
2017-10-17 3:47 ` [PATCH] patch reply Thais Diniz
2017-10-17 4:01 ` Junio C Hamano
2017-10-17 7:15 ` Marius Paliga
2017-10-17 3:58 ` [PATCH][Outreachy] New git config variable to specify string that will be automatically passed as --push-option thais braz
2017-10-11 20:40 ` Thais D. Braz
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: http://vger.kernel.org/majordomo-info.html
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAK7vU=0tRu=MAtBWHaQ6pGOGMfYdEorNd_930jq_3n_tLY2hsg@mail.gmail.com' \
--to=marius.paliga@gmail.com \
--cc=git@vger.kernel.org \
--cc=sbeller@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://80x24.org/mirrors/git.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).