git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Phillip Wood <phillip.wood@talktalk.net>
To: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Cc: git@vger.kernel.org
Subject: Re: [PATCH 2/2] rebase -i: silence stash apply
Date: Thu, 18 May 2017 15:51:31 +0100	[thread overview]
Message-ID: <decdfff1-dd21-4e10-44d5-9dbee38ba05f@talktalk.net> (raw)
In-Reply-To: <alpine.DEB.2.21.1.1705181246430.3610@virtualbox>

Hi Johannes

Thanks for your reply
On 18/05/17 11:49, Johannes Schindelin wrote:
> Hi Phillip,
> 
> On Thu, 18 May 2017, Phillip Wood wrote:
> 
>> diff --git a/sequencer.c b/sequencer.c
>> index f8bc18badf1a3fb1b39656501c5a316e229968d2..311728a145dfc66e230334221a2610468239932d 100644
>> --- a/sequencer.c
>> +++ b/sequencer.c
>> @@ -1914,6 +1914,8 @@ static int apply_autostash(struct replay_opts *opts)
>>   	strbuf_trim(&stash_sha1);
>>   
>>   	child.git_cmd = 1;
>> +	child.no_stdout = 1;
>> +	child.no_stderr = 1;
>>   	argv_array_push(&child.args, "stash");
>>   	argv_array_push(&child.args, "apply");
>>   	argv_array_push(&child.args, stash_sha1.buf);
> 
> If I remember correctly, then the shell version prints the output in case
> of an error.

The shell version prints it's own error message if there's an error, the 
C version does this as well

Shell version:
apply_autostash () {
	if test -f "$state_dir/autostash"
	then
		stash_sha1=$(cat "$state_dir/autostash")
		if git stash apply $stash_sha1 2>&1 >/dev/null
		then
			echo "$(gettext 'Applied autostash.')"
		else
			git stash store -m "autostash" -q $stash_sha1 ||
			die "$(eval_gettext "Cannot store \$stash_sha1")"
			gettext 'Applying autostash resulted in conflicts.
Your changes are safe in the stash.
You can run "git stash pop" or "git stash drop" at any time.
'
		fi
	fi
}

C version:
static int apply_autostash(struct replay_opts *opts)
{
	struct strbuf stash_sha1 = STRBUF_INIT;
	struct child_process child = CHILD_PROCESS_INIT;
	int ret = 0;

	if (!read_oneliner(&stash_sha1, rebase_path_autostash(), 1)) {
		strbuf_release(&stash_sha1);
		return 0;
	}
	strbuf_trim(&stash_sha1);

	child.git_cmd = 1;
	child.no_stdout = 1;
	child.no_stderr = 1;
	argv_array_push(&child.args, "stash");
	argv_array_push(&child.args, "apply");
	argv_array_push(&child.args, stash_sha1.buf);
	if (!run_command(&child))
		printf(_("Applied autostash.\n"));
	else {
		struct child_process store = CHILD_PROCESS_INIT;

		store.git_cmd = 1;
		argv_array_push(&store.args, "stash");
		argv_array_push(&store.args, "store");
		argv_array_push(&store.args, "-m");
		argv_array_push(&store.args, "autostash");
		argv_array_push(&store.args, "-q");
		argv_array_push(&store.args, stash_sha1.buf);
		if (run_command(&store))
			ret = error(_("cannot store %s"), stash_sha1.buf);
		else
			printf(_("Applying autostash resulted in conflicts.\n"
				"Your changes are safe in the stash.\n"
				"You can run \"git stash pop\" or"
				" \"git stash drop\" at any time.\n"));
	}

	strbuf_release(&stash_sha1);
	return ret;
}


> We already imitated that behavior in `git commit`
> (https://github.com/git-for-windows/git/blob/v2.13.0.windows.1/sequencer.c#L674-L684):
> 
> 		/* hide stderr on success */
> 		struct strbuf buf = STRBUF_INIT;
> 		int rc = pipe_command(&cmd,
> 				      NULL, 0,
> 				      /* stdout is already redirected */
> 				      NULL, 0,
> 				      &buf, 0);
> 		if (rc)
> 			fputs(buf.buf, stderr);
> 		strbuf_release(&buf);
> 
> I think that would be the appropriate approach here, too.

I can change it to do this if you think it is an improvement but the 
existing error message seems fairly clear to me and I think (though I 
haven't checked) that the call to stash store should print out the id of 
the stash for the user

> P.S.: it may be a very good idea to accompany this patch (as well as the
> previous one) by a patch to the test suite to verify that the fixed code
> does not regress.

I agree that a test for this (and probably my other changes) would be 
useful, I'll try and put something together but it won't be until after 
the end of next week.

Thanks

Phillip

  reply	other threads:[~2017-05-18 14:51 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-18 10:02 [PATCH 0/2] Fix a couple of minor rebase -i regressions Phillip Wood
2017-05-18 10:02 ` [PATCH 1/2] rebase -i: fix reflog message Phillip Wood
2017-05-18 10:02 ` [PATCH 2/2] rebase -i: silence stash apply Phillip Wood
2017-05-18 10:49   ` Johannes Schindelin
2017-05-18 14:51     ` Phillip Wood [this message]
2017-05-18 21:19       ` Johannes Schindelin

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=decdfff1-dd21-4e10-44d5-9dbee38ba05f@talktalk.net \
    --to=phillip.wood@talktalk.net \
    --cc=Johannes.Schindelin@gmx.de \
    --cc=git@vger.kernel.org \
    --cc=phillip.wood@dunelm.org.uk \
    /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).