All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ben Wijen <ben@wijen.net>
To: git@vger.kernel.org
Cc: Junio C Hamano <gitster@pobox.com>,
	Johannes Schindelin <johannes.schindelin@gmx.de>,
	Pratik Karki <predatoramigo@gmail.com>,
	Phillip Wood <phillip.wood123@gmail.com>,
	Eric Sunshine <sunshine@sunshineco.com>,
	Ben Wijen <ben@wijen.net>
Subject: [PATCH v3 1/1] rebase.c: make sure the active branch isn't moved when autostashing
Date: Wed, 21 Aug 2019 20:29:41 +0200	[thread overview]
Message-ID: <20190821182941.12674-2-ben@wijen.net> (raw)
In-Reply-To: <20190821182941.12674-1-ben@wijen.net>

Consider the following scenario:
    git checkout not-the-master
    work work work
    git rebase --autostash upstream master

Here 'rebase --autostash <upstream> <branch>' incorrectly moves the
active branch (not-the-master) to master (before the rebase).

The expected behavior: (58794775:/git-rebase.sh:526)
    AUTOSTASH=$(git stash create autostash)
    git reset --hard
    git checkout master
    git rebase upstream
    git stash apply $AUTOSTASH

The actual behavior: (6defce2b:/builtin/rebase.c:1062)
    AUTOSTASH=$(git stash create autostash)
    git reset --hard master
    git checkout master
    git rebase upstream
    git stash apply $AUTOSTASH


This commit reinstates the 'legacy script' behavior as introduced with
58794775: rebase: implement --[no-]autostash and rebase.autostash

As with this commit the reset must never change the active branch,
the 'HEAD is now at ...' message has now been removed.

Signed-off-by: Ben Wijen <ben@wijen.net>
---
 builtin/rebase.c            | 18 ++++++------------
 t/t3420-rebase-autostash.sh | 16 ++++++++++++----
 2 files changed, 18 insertions(+), 16 deletions(-)

diff --git a/builtin/rebase.c b/builtin/rebase.c
index 670096c065..a928f44941 100644
--- a/builtin/rebase.c
+++ b/builtin/rebase.c
@@ -1968,9 +1968,6 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 				state_dir_path("autostash", &options);
 			struct child_process stash = CHILD_PROCESS_INIT;
 			struct object_id oid;
-			struct commit *head =
-				lookup_commit_reference(the_repository,
-							&options.orig_head);
 
 			argv_array_pushl(&stash.args,
 					 "stash", "create", "autostash", NULL);
@@ -1991,17 +1988,14 @@ int cmd_rebase(int argc, const char **argv, const char *prefix)
 				    options.state_dir);
 			write_file(autostash, "%s", oid_to_hex(&oid));
 			printf(_("Created autostash: %s\n"), buf.buf);
-			if (reset_head(&head->object.oid, "reset --hard",
+
+			/*
+			 * We might not be on orig_head yet:
+			 * Make sure to reset w/o switching branches...
+			 */
+			if (reset_head(NULL, "reset --hard",
 				       NULL, RESET_HEAD_HARD, NULL, NULL) < 0)
 				die(_("could not reset --hard"));
-			printf(_("HEAD is now at %s"),
-			       find_unique_abbrev(&head->object.oid,
-						  DEFAULT_ABBREV));
-			strbuf_reset(&buf);
-			pp_commit_easy(CMIT_FMT_ONELINE, head, &buf);
-			if (buf.len > 0)
-				printf(" %s", buf.buf);
-			putchar('\n');
 
 			if (discard_index(the_repository->index) < 0 ||
 				repo_read_index(the_repository) < 0)
diff --git a/t/t3420-rebase-autostash.sh b/t/t3420-rebase-autostash.sh
index b8f4d03467..d1352096f2 100755
--- a/t/t3420-rebase-autostash.sh
+++ b/t/t3420-rebase-autostash.sh
@@ -37,7 +37,6 @@ test_expect_success setup '
 create_expected_success_am () {
 	cat >expected <<-EOF
 	$(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
-	HEAD is now at $(git rev-parse --short feature-branch) third commit
 	First, rewinding head to replay your work on top of it...
 	Applying: second commit
 	Applying: third commit
@@ -48,7 +47,6 @@ create_expected_success_am () {
 create_expected_success_interactive () {
 	q_to_cr >expected <<-EOF
 	$(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
-	HEAD is now at $(git rev-parse --short feature-branch) third commit
 	Applied autostash.
 	Successfully rebased and updated refs/heads/rebased-feature-branch.
 	EOF
@@ -57,7 +55,6 @@ create_expected_success_interactive () {
 create_expected_failure_am () {
 	cat >expected <<-EOF
 	$(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
-	HEAD is now at $(git rev-parse --short feature-branch) third commit
 	First, rewinding head to replay your work on top of it...
 	Applying: second commit
 	Applying: third commit
@@ -70,7 +67,6 @@ create_expected_failure_am () {
 create_expected_failure_interactive () {
 	cat >expected <<-EOF
 	$(grep "^Created autostash: [0-9a-f][0-9a-f]*\$" actual)
-	HEAD is now at $(git rev-parse --short feature-branch) third commit
 	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.
@@ -306,4 +302,16 @@ test_expect_success 'branch is left alone when possible' '
 	test unchanged-branch = "$(git rev-parse --abbrev-ref HEAD)"
 '
 
+test_expect_success 'never change active branch' '
+	git checkout -b upstream unrelated-onto-branch &&
+	test_when_finished "
+		git reset --hard &&
+		git checkout - &&
+		git branch -D upstream" &&
+	echo changed >file0 &&
+	git add file0 &&
+	git rebase --autostash upstream feature-branch &&
+	test_cmp_rev upstream unrelated-onto-branch
+'
+
 test_done
-- 
2.22.0


  reply	other threads:[~2019-08-21 18:30 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-18  9:53 [PATCH 0/2] git rebase: Make sure upstream branch is left alone Ben Wijen
2019-08-18  9:53 ` [PATCH 1/2] t3420: never change upstream branch Ben Wijen
2019-08-19 21:55   ` Junio C Hamano
2019-08-20  8:58   ` Phillip Wood
2019-08-18  9:53 ` [PATCH 2/2] rebase.c: make sure current branch isn't moved when autostashing Ben Wijen
2019-08-20  9:00   ` Phillip Wood
2019-08-20 19:53     ` Ben
2019-08-20 20:12   ` [PATCH v2 0/1] git rebase: Make sure upstream branch is left alone Ben Wijen
2019-08-20 20:12     ` [PATCH v2 1/1] rebase.c: make sure current branch isn't moved when autostashing Ben Wijen
2019-08-20 20:24       ` Eric Sunshine
2019-08-20 20:58       ` Junio C Hamano
2019-08-21 18:29     ` [PATCH v3 0/1] rebase.c: make sure the active " Ben Wijen
2019-08-21 18:29       ` Ben Wijen [this message]
2019-08-22 12:27         ` [PATCH v3 1/1] " Johannes Schindelin
2019-08-22 15:49           ` Junio C Hamano
2019-08-26 16:45       ` [PATCH v4 " Ben Wijen
2019-08-26 16:45         ` Ben Wijen
2019-08-26 17:10           ` SZEDER Gábor
2019-08-28 12:56         ` Johannes Schindelin
2019-08-28 15:34           ` Junio C Hamano
2019-08-28 16:03             ` Junio C Hamano
2019-08-29 16:47         ` [PATCH v5 0/2] rebase.c: make sure current " Ben Wijen
2019-08-29 16:47           ` [PATCH v5 1/2] builtin/rebase.c: make sure the active " Ben Wijen
2019-08-29 16:47           ` [PATCH v5 2/2] builtin/rebase.c: Remove pointless message Ben Wijen
2019-08-30 15:16           ` [PATCH v6 0/2] rebase.c: make sure current branch isn't moved when autostashing Ben Wijen
2019-08-30 15:16             ` [PATCH v6 1/2] builtin/rebase.c: make sure the active " Ben Wijen
2019-08-30 20:15               ` Junio C Hamano
2019-08-31  7:17                 ` Ben
2019-09-01 16:01                   ` Junio C Hamano
2019-09-01 16:27                     ` Ben
2019-09-02 17:33                       ` Junio C Hamano
2019-08-30 15:16             ` [PATCH v6 2/2] builtin/rebase.c: Remove pointless message Ben Wijen
2019-08-30 20:16               ` Junio C Hamano
2019-08-31  7:17                 ` Ben
2019-08-30 15:16             ` [PATCH " Ben Wijen
2019-08-19  9:26 ` [PATCH 0/2] git rebase: Make sure upstream branch is left alone Phillip Wood
2019-08-19 15:33   ` Ben
2019-08-19 18:21     ` Junio C Hamano

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=20190821182941.12674-2-ben@wijen.net \
    --to=ben@wijen.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=johannes.schindelin@gmx.de \
    --cc=phillip.wood123@gmail.com \
    --cc=predatoramigo@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.