All of lore.kernel.org
 help / color / mirror / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Mehul Jain <mehul.jain2029@gmail.com>
Cc: git@vger.kernel.org, Matthieu.Moy@grenoble-inp.fr,
	pyokagan@gmail.com, sunshine@sunshineco.com
Subject: Re: [PATCH v4] pull --rebase: add --[no-]autostash flag
Date: Sat, 05 Mar 2016 09:04:15 -0800	[thread overview]
Message-ID: <xmqqfuw4x3e8.fsf@gitster.mtv.corp.google.com> (raw)
In-Reply-To: <1457171545-14496-1-git-send-email-mehul.jain2029@gmail.com> (Mehul Jain's message of "Sat, 5 Mar 2016 15:22:25 +0530")

Mehul Jain <mehul.jain2029@gmail.com> writes:

> +--autostash::
> +--no-autostash::
> +	Before starting rebase, stash local modifications away (see
> +	linkgit:git-stash.txt[1]) if needed, and apply the stash when
> +	done.
> ++
> +This option is only valid when '--rebase' is used.
> ++
> +'--no-autostash' is useful to override the 'rebase.autoStash'
> +configuration variable (see linkgit:git-config[1]).
> ++
> +[NOTE]
> +Use with care: the final stash application after a successful
> +rebase might result in non-trivial conflicts.
> +

Should this entry be this verbose and have four separate paragraphs?

I think "This option is..." can and should be a part of the first
paragraph, and *NOTE* paragraph does not have to be there.  The
readers have already been referred to rebase.autoStash that warns
them to be prepared to deal with possible conflicts when replaying
the stashed change.

> -		git_config_get_bool("rebase.autostash", &autostash);
> -		if (!autostash)
> +		if (opt_autostash == -1)
> +			git_config_get_bool("rebase.autostash", &opt_autostash);
> +
> +		if (opt_autostash == 0 || opt_autostash == -1)
>  			die_on_unclean_work_tree(prefix);

If the command line didn't give --[no-]autostash when the control
reaches this section of the code, get_bool() is used to see if
rebase.autostash is set.  If it is explicitly set to false or unset,
the command will check if the work tree is clean and complain.

Makes sense.

This does not have to be in the scope of your change, by the way,
but it may make sense to reduce the use of git_config_get_*()
function when the program already contains a call to git_config().

Instead of calling git_default_config callback from there, introduce
a new callback function and read variables that matter from there,
i.e.

static int opt_autostash = -1;
static int config_autostash = -1;
...
static int git_pull_config(const char *var, const char *value, void *cb)
{
	if (!strcmp(var, "rebase.autostash")) {
        	config_autostash = git_config_bool(var, value);
		return 0;
	}
        return git_default_config(var, value, cb);
}

and then you do "the command line overrides the configured value"
with

	if (opt_autostash < 0)
        	opt_autostash = config_autostash;
	if (opt_autostash < 0)
        	die_on_unclean_work_tree(...);

Either way you have to read the config files in full at least once
anyway, but the program does not have to ask the config API to look
up the value with a separate git_config_get_bool() call if you did
so.

> diff --git a/t/t5520-pull.sh b/t/t5520-pull.sh
> index c952d5e..f5d1d31 100755
> --- a/t/t5520-pull.sh
> +++ b/t/t5520-pull.sh
> @@ -245,6 +245,25 @@ test_expect_success '--rebase fails with multiple branches' '
>  	test modified = "$(git show HEAD:file)"
>  '
>  
> +test_expect_success 'pull --rebase --no-autostash fails with dirty working directory and rebase.autstash set true' '

This is overly verbose, isn't it?

You are verifying that "--no-autostash overrides rebase.autostash"
in this test, so perhaps make it:

    test_expect_success 'pull --rebase: --no-autostash overrides rebase.autostash'

or something?

> +	test_config rebase.autostash true &&
> +	git reset --hard before-rebase &&
> +	echo dirty >new_file &&
> +	git add new_file &&
> +	test_must_fail git pull --rebase --no-autostash . copy
> +'
> +
> +test_expect_success 'pull --rebase --autostash succeeds with dirty working directory and rebase.autstash set false' '

Likewise.  This verifies that "--autostash overrides rebase.autostash".

> +	test_config rebase.autostash false &&
> +	git reset --hard before-rebase &&
> +	echo dirty >new_file &&
> +	git add new_file &&
> +	git pull --rebase --autostash . copy &&
> +	test_cmp_rev HEAD^ copy &&
> +	test "$(cat new_file)" = dirty &&
> +	test "$(cat file)" = "modified again"
> +'
> +

For completeness, there are two other cases, i.e. rebase.autostash
set to false and --no-autostash given from the command line, and the
variable set to true and --autostash from the command line.

It is worth considering if these two need to be tested.  There are
(at least) two things to take into account:

 - We know, after seeing the current implementation, that these two
   cases do not have to be tested, because the configuration is not
   even looked at when there is a command line option.

 - However, the real reason why we prepare these tests is not to
   demonstrate that the patch that introduces a new feature works as
   expected.  It is to prevent _future_ changes by other people, who
   may not be aware of the reason why we chose not to test these two
   cases, from breaking the code.  If a careless refactoring of the
   code can break our assumption (i.e. "the configuration is not
   even looked at when there is a command line option." above), such
   a change may introduce a bug that disables autostash when both
   variable and option tell the code to autostash, and having the
   two additional tests would catch such a breakage.

>  test_expect_success 'pull --rebase succeeds with dirty working directory and rebase.autostash set' '
>  	test_config rebase.autostash true &&
>  	git reset --hard before-rebase &&

These two new tests are inserted in a somewhat strange location, by
the way.  This existing test checks the basic working of rebase.autostash
without any command line override.  Shouldn't the more complex new cases
that deal with command line override come after this one?

Is it worth checking the case where autostash kicks in, rebase
itself is completed successfully, but the final "stash pop" fails in
conflict?  I am thinking aloud and just wondering, not suggesting
to add such a test, or even suggesting that having such a test is
worthwhile. I didn't even check if there is already an existing test
to cover that case.

Other than the above, looking better.  Thanks.

  parent reply	other threads:[~2016-03-05 17:04 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-02-27 17:41 [PATCH v2 1/2] pull --rebase: add --[no-]autostash flag Mehul Jain
2016-02-27 17:41 ` [PATCH v2 2/2] Documentation/git-pull.txt: teach 'git pull --rebase' the --[no-]autostash option Mehul Jain
2016-02-27 19:26 ` [PATCH v2 1/2] pull --rebase: add --[no-]autostash flag Junio C Hamano
2016-02-28  9:51   ` Mehul Jain
2016-02-28 10:12     ` Matthieu Moy
2016-02-28 12:28   ` Paul Tan
2016-02-28 19:39     ` Junio C Hamano
2016-03-03 16:13 ` [PATCH v3 1/3] " Mehul Jain
2016-03-03 16:13   ` [PATCH v3 2/3] test: add test for " Mehul Jain
2016-03-03 17:31     ` Matthieu Moy
2016-03-04  5:43       ` Mehul Jain
2016-03-03 16:13   ` [PATCH v3 3/3] Documentation/git-pull: document --[no-]autostash option Mehul Jain
2016-03-03 17:14     ` Junio C Hamano
2016-03-04  5:04       ` Mehul Jain
2016-03-04  7:00         ` Matthieu Moy
2016-03-04 15:56     ` Paul Tan
2016-03-03 17:24   ` [PATCH v3 1/3] pull --rebase: add --[no-]autostash flag Matthieu Moy
2016-03-04  1:01     ` Eric Sunshine
2016-03-04  6:50       ` Matthieu Moy
2016-03-04  5:37     ` Mehul Jain
2016-03-04  6:51       ` Matthieu Moy
2016-03-04 15:52   ` Paul Tan
2016-03-05  9:52 ` [PATCH v4] " Mehul Jain
2016-03-05 12:26   ` Mehul Jain
2016-03-05 17:04   ` Junio C Hamano [this message]
2016-03-07  8:23     ` Mehul Jain
2016-03-07 12:37 ` [PATCH v5] " Mehul Jain
2016-03-07 23:01   ` Junio C Hamano
2016-03-08 18:19 ` [PATCH v6 1/2] git-pull.c: introduce git_pull_config() Mehul Jain
2016-03-08 18:19   ` [PATCH v6 2/2] pull --rebase: add --[no-]autostash flag Mehul Jain
2016-03-09  4:18 ` [PATCH v7 1/2] git-pull.c: introduce git_pull_config() Mehul Jain
2016-03-09  4:18   ` [PATCH v7 2/2] pull --rebase: add --[no-]autostash flag Mehul Jain
2016-03-11  4:51     ` Paul Tan
2016-03-11 13:15       ` Mehul Jain
2016-03-11 13:30         ` Matthieu Moy
2016-03-11 14:38           ` Mehul Jain
2016-03-12  6:49       ` Mehul Jain
2016-03-15 17:11 ` [PATCH 1/2] git-pull.c: introduce git_pull_config() Mehul Jain
2016-03-15 17:11   ` [PATCH 2/2] pull --rebase: add --[no-]autostash flag Mehul Jain
2016-03-15 21:43     ` Eric Sunshine
2016-03-16  5:00       ` Mehul Jain
2016-03-18  3:32         ` Eric Sunshine
2016-03-17  8:17       ` Mehul Jain
2016-03-18  3:53         ` Eric Sunshine

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

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqfuw4x3e8.fsf@gitster.mtv.corp.google.com \
    --to=gitster@pobox.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=git@vger.kernel.org \
    --cc=mehul.jain2029@gmail.com \
    --cc=pyokagan@gmail.com \
    --cc=sunshine@sunshineco.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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.