git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] rebase -x: do not die without -i
@ 2016-03-17  1:19 Stefan Beller
  2016-03-17  6:20 ` Johannes Sixt
                   ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Stefan Beller @ 2016-03-17  1:19 UTC (permalink / raw)
  To: gitster
  Cc: git, Matthieu.Moy, j6t, johannes.schindelin, Lucien.Kong,
	Stefan Beller

In the later steps of preparing a patch series I do not want to edit the
patches any more, but just make sure the test suite passes after each
patch. Currently I would run

  EDITOR=true git rebase -i <anchor> -x "make test"

In an ideal world the command would be simpler and just be

  git rebase <anchor> -x "make test"

to run the test for each commit I am about to send out for review.
This patch enables the short line.

While at it, remove the double empty lines in t3404.

Signed-off-by: Stefan Beller <sbeller@google.com>
---

 Junio,
 
 This is a slightly different approach.
 
 -x doesn't imply -i any more, but just the internal code does that. The user
 will see --exec working just fine without the -i option given.

 Thanks,
 Stefan

 git-rebase.sh                 |  4 +++-
 t/t3404-rebase-interactive.sh | 18 +++++-------------
 2 files changed, 8 insertions(+), 14 deletions(-)

diff --git a/git-rebase.sh b/git-rebase.sh
index cf60c43..232484a 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -351,7 +351,9 @@ test $# -gt 2 && usage
 if test -n "$cmd" &&
    test "$interactive_rebase" != explicit
 then
-	die "$(gettext "The --exec option must be used with the --interactive option")"
+	interactive_rebase=implicit
+	GIT_EDITOR=true
+	export GIT_EDITOR
 fi
 
 if test -n "$action"
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 544f9ad..2064d88 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -771,7 +771,6 @@ test_expect_success 'rebase-i history with funny messages' '
 	test_cmp expect actual
 '
 
-
 test_expect_success 'prepare for rebase -i --exec' '
 	git checkout master &&
 	git checkout -b execute &&
@@ -780,7 +779,6 @@ test_expect_success 'prepare for rebase -i --exec' '
 	test_commit three_exec main.txt three_exec
 '
 
-
 test_expect_success 'running "git rebase -i --exec git show HEAD"' '
 	set_fake_editor &&
 	git rebase -i --exec "git show HEAD" HEAD~2 >actual &&
@@ -793,7 +791,6 @@ test_expect_success 'running "git rebase -i --exec git show HEAD"' '
 	test_cmp expected actual
 '
 
-
 test_expect_success 'running "git rebase --exec git show HEAD -i"' '
 	git reset --hard execute &&
 	set_fake_editor &&
@@ -807,7 +804,6 @@ test_expect_success 'running "git rebase --exec git show HEAD -i"' '
 	test_cmp expected actual
 '
 
-
 test_expect_success 'running "git rebase -ix git show HEAD"' '
 	git reset --hard execute &&
 	set_fake_editor &&
@@ -835,7 +831,6 @@ test_expect_success 'rebase -ix with several <CMD>' '
 	test_cmp expected actual
 '
 
-
 test_expect_success 'rebase -ix with several instances of --exec' '
 	git reset --hard execute &&
 	set_fake_editor &&
@@ -850,7 +845,6 @@ test_expect_success 'rebase -ix with several instances of --exec' '
 	test_cmp expected actual
 '
 
-
 test_expect_success 'rebase -ix with --autosquash' '
 	git reset --hard execute &&
 	git checkout -b autosquash &&
@@ -876,16 +870,14 @@ test_expect_success 'rebase -ix with --autosquash' '
 	test_cmp expected actual
 '
 
-
-test_expect_success 'rebase --exec without -i shows error message' '
+test_expect_success 'rebase --exec works without -i ' '
 	git reset --hard execute &&
-	set_fake_editor &&
-	test_must_fail git rebase --exec "git show HEAD" HEAD~2 2>actual &&
-	echo "The --exec option must be used with the --interactive option" >expected &&
-	test_i18ncmp expected actual
+	git rebase --exec true HEAD~2 2>actual2 >actual1 &&
+	echo "Successfully rebased and updated refs/heads/autosquash_expected." >expected &&
+	test_i18ncmp expected actual2 &&
+	test_line_count = 2 actual1
 '
 
-
 test_expect_success 'rebase -i --exec without <CMD>' '
 	git reset --hard execute &&
 	set_fake_editor &&
-- 
2.8.0.rc3.1.ge1ac87c.dirty

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] rebase -x: do not die without -i
  2016-03-17  1:19 [PATCH] rebase -x: do not die without -i Stefan Beller
@ 2016-03-17  6:20 ` Johannes Sixt
  2016-03-17  6:48 ` Johannes Schindelin
  2016-03-17  7:50 ` Junio C Hamano
  2 siblings, 0 replies; 6+ messages in thread
From: Johannes Sixt @ 2016-03-17  6:20 UTC (permalink / raw)
  To: Stefan Beller
  Cc: gitster, git, Matthieu.Moy, johannes.schindelin, Lucien.Kong

Am 17.03.2016 um 02:19 schrieb Stefan Beller:
> -test_expect_success 'rebase --exec without -i shows error message' '
> +test_expect_success 'rebase --exec works without -i ' '
>   	git reset --hard execute &&
> -	set_fake_editor &&
> -	test_must_fail git rebase --exec "git show HEAD" HEAD~2 2>actual &&
> -	echo "The --exec option must be used with the --interactive option" >expected &&
> -	test_i18ncmp expected actual
> +	git rebase --exec true HEAD~2 2>actual2 >actual1 &&
> +	echo "Successfully rebased and updated refs/heads/autosquash_expected." >expected &&
> +	test_i18ncmp expected actual2 &&
> +	test_line_count = 2 actual1

We don't have an explicit guideline, but please do not check stderr 
output using test_cmp or test_i18ncmp. The reason is that some shells 
write trace output to stderr when run under 'set -x'. That is, when you 
run this test as

      ./t3404-rebase-interactive.sh -x -v

it will fail because there is now more text in actual2 than expected. We 
have a number of cases like this elsewhere, but we should not stack new 
cases on the pile.

Please use test_i18ngrep:

	test_i18ngrep "Successfully rebased and updated" actual2 &&
	test_line_count = 2 actual1

-- Hannes

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] rebase -x: do not die without -i
  2016-03-17  1:19 [PATCH] rebase -x: do not die without -i Stefan Beller
  2016-03-17  6:20 ` Johannes Sixt
@ 2016-03-17  6:48 ` Johannes Schindelin
  2016-03-17  7:50 ` Junio C Hamano
  2 siblings, 0 replies; 6+ messages in thread
From: Johannes Schindelin @ 2016-03-17  6:48 UTC (permalink / raw)
  To: Stefan Beller; +Cc: gitster, git, Matthieu.Moy, j6t, Lucien.Kong

Hi Stefan,

On Wed, 16 Mar 2016, Stefan Beller wrote:

> In the later steps of preparing a patch series I do not want to edit the
> patches any more, but just make sure the test suite passes after each
> patch. Currently I would run
> 
>   EDITOR=true git rebase -i <anchor> -x "make test"
> 
> In an ideal world the command would be simpler and just be
> 
>   git rebase <anchor> -x "make test"
> 
> to run the test for each commit I am about to send out for review.
> This patch enables the short line.

Makes sense.

> While at it, remove the double empty lines in t3404.

Could you split those out? They may interfere with some of my work, and
it's easier to figure things out from a trivial patch than from one
combining unrelated changes.

> -test_expect_success 'rebase --exec without -i shows error message' '
> +test_expect_success 'rebase --exec works without -i ' '
>  	git reset --hard execute &&
> -	set_fake_editor &&
> -	test_must_fail git rebase --exec "git show HEAD" HEAD~2 2>actual &&
> -	echo "The --exec option must be used with the --interactive option" >expected &&
> -	test_i18ncmp expected actual
> +	git rebase --exec true HEAD~2 2>actual2 >actual1 &&

How about '--exec "touch executed"'? You'd want to verify that the command
really was executed...

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] rebase -x: do not die without -i
  2016-03-17  1:19 [PATCH] rebase -x: do not die without -i Stefan Beller
  2016-03-17  6:20 ` Johannes Sixt
  2016-03-17  6:48 ` Johannes Schindelin
@ 2016-03-17  7:50 ` Junio C Hamano
  2016-03-17 13:11   ` Johannes Schindelin
  2 siblings, 1 reply; 6+ messages in thread
From: Junio C Hamano @ 2016-03-17  7:50 UTC (permalink / raw)
  To: Stefan Beller; +Cc: git, Matthieu.Moy, j6t, johannes.schindelin, Lucien.Kong

Stefan Beller <sbeller@google.com> writes:

> In the later steps of preparing a patch series I do not want to edit the
> patches any more, but just make sure the test suite passes after each
> patch. Currently I would run
>
>   EDITOR=true git rebase -i <anchor> -x "make test"

Hmm, I guess that may "work" but it sounds like quite a roundabout
way to "test all commits".  "rebase" is about replaying history to
end up with a set of newly minted commits, and being able to poke at
the state each commit records in the working tree is a side effect.
"rebase -i" may use the same commit object if you didn't actually
make new commit as an optimization, but otherwise, it is like going
through pages of a book, tearing each page to examine it, and
replacing each page with a photocopy of it before going to examine
the next page.  Which makes me feel somewhat dirty X-<.

In other words, that looks like a workaround for not having

    $ git for-each-rev -x "$command" old..new

where you can write "sh -c 'git checkout $1 && make test' -" as
your $command.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] rebase -x: do not die without -i
  2016-03-17  7:50 ` Junio C Hamano
@ 2016-03-17 13:11   ` Johannes Schindelin
  2016-03-17 18:10     ` Junio C Hamano
  0 siblings, 1 reply; 6+ messages in thread
From: Johannes Schindelin @ 2016-03-17 13:11 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: Stefan Beller, git, Matthieu.Moy, j6t, Lucien.Kong

Hi Junio,

On Thu, 17 Mar 2016, Junio C Hamano wrote:

> I guess that may "work" but it sounds like quite a roundabout
> way to "test all commits".  "rebase" is about replaying history to
> end up with a set of newly minted commits, and being able to poke at
> the state each commit records in the working tree is a side effect.

I think there is a misunderstanding here. Stefan does not only want to
test all of the commits in the patch series. Stefan wants to make sure
that all patches in the series result in revisions that pass the test
suite.

In other words, it is not only about testing, it is also about fixing when
things break.

And that is very, very much the purpose of the interactive rebase.

>     $ git for-each-rev -x "$command" old..new
> 
> where you can write "sh -c 'git checkout $1 && make test' -" as
> your $command.

You meant

	git rev-list old...new |
	while read rev
	do
		$command || break
	done

?

Again, this might *test* the revisions. But it does nothing to help fixing
any patch in the series.

Ciao,
Dscho

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] rebase -x: do not die without -i
  2016-03-17 13:11   ` Johannes Schindelin
@ 2016-03-17 18:10     ` Junio C Hamano
  0 siblings, 0 replies; 6+ messages in thread
From: Junio C Hamano @ 2016-03-17 18:10 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: Stefan Beller, git, Matthieu.Moy, j6t, Lucien.Kong

Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> And that is very, very much the purpose of the interactive rebase.
>
>>     $ git for-each-rev -x "$command" old..new
>> 
>> where you can write "sh -c 'git checkout $1 && make test' -" as
>> your $command.
>
> You meant
>
> 	git rev-list old...new |
> 	while read rev
> 	do
> 		$command || break
> 	done
>
> ?

Yeah, if I actually felt the lack of "for-each-ref -x" a problem (I
don't), that is what I would have used instead (but with just two
dots ;-).

But you are correct to point out that I didn't consider that
"... and I want to fix right there if it breaks" is a part of the
use case, mainly because the log message said this:

    In the later steps of preparing a patch series I do not want to
    edit the patches any more, but just make sure the test suite
    passes after each patch.

and partly I lack imagination.

If you throw in that extra "I want to fix right there if it breaks"
requirement, it makes perfect sense to make use of the sequencing
machinery we implement for "rebase -i", as the while loop above does
not give you the same sequencing without extra work.

So perhaps the idea of the patch is good with a better explanation.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2016-03-17 18:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-17  1:19 [PATCH] rebase -x: do not die without -i Stefan Beller
2016-03-17  6:20 ` Johannes Sixt
2016-03-17  6:48 ` Johannes Schindelin
2016-03-17  7:50 ` Junio C Hamano
2016-03-17 13:11   ` Johannes Schindelin
2016-03-17 18:10     ` Junio C Hamano

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 NNTP newsgroup(s).