threads / patch / 33583

patchrebase: find orig_head unambiguously

Subject: [PATCH] rebase: find orig_head unambiguously

## tl;dr

2 messages between Apr 23, 2013 and Apr 23, 2013. Diffs are folded; open one to read it.

replies: 1people: 2as markdown or json

Phil Hord· Apr 23, 2013, 22:51 UTC · lore

When we 'git rebase $upstream', git uses 'rev-parse --verify $current_branch' to find ORIG_HEAD. But if $current_branch is ambiguous, 'rev-parse --verify' emits a warning and returns a SHA1 anyway. When the wrong ambiguous choice is used, git-rebase fails non-gracefully: it emits a warning about failing to lock $current_branch, an error about being unable to checkout $current_branch again, and it might even decide the rebase is a fast-forward when it is not.

In the 'rebase $upstream' case, we already know the unambiguous spelling of $current_branch is "HEAD". Fix git-rebase to find $orig_head unambiguously.

Add a test in t3400-rebase.sh which creates an ambiguous branch name and rebases it implicitly with 'git rebase $other'.

Signed-off-by: Phil Hord <hordp@cisco.com>
---
 git-rebase.sh     | 2 +-
 t/t3400-rebase.sh | 7 +++++++
 2 files changed, 8 insertions(+), 1 deletion(-)
Show changes to 2 files +8 −1

git-rebase.sh, t/t3400-rebase.sh

diff --git a/git-rebase.sh b/git-rebase.sh
index b2f1c76..2c692c3 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -473,7 +473,7 @@ case "$#" in
 		head_name="detached HEAD"
 		branch_name=HEAD ;# detached
 	fi
-	orig_head=$(git rev-parse --verify "${branch_name}^0") || exit
+	orig_head=$(git rev-parse --verify HEAD) || exit
 	;;
 *)
 	die "BUG: unexpected number of arguments left to parse"
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index f6cc102..b58fa1a 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -101,7 +101,14 @@ test_expect_success 'HEAD was detached during rebase' '
 	test $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})
 '
 
+test_expect_success 'rebase from ambiguous branch name' '
+	git checkout -b topic side &&
+	git rebase master
+'
+
 test_expect_success 'rebase after merge master' '
+	git checkout --detach refs/tags/topic &&
+	git branch -D topic &&
 	git reset --hard topic &&
 	git merge master &&
 	git rebase master &&
-- 
1.8.2.1.854.g46dda50.dirty
Junio C Hamano· Apr 23, 2013, 23:31 UTC · re: Phil Hord · lore

Re: [PATCH] rebase: find orig_head unambiguously

Phil Hord <hordp@cisco.com> writes:
Show 12 quoted lines
> When we 'git rebase $upstream', git uses 'rev-parse --verify
> $current_branch' to find ORIG_HEAD.  But if $current_branch
> is ambiguous, 'rev-parse --verify' emits a warning and returns
> a SHA1 anyway.  When the wrong ambiguous choice is used,
> git-rebase fails non-gracefully:  it emits a warning about
> failing to lock $current_branch, an error about being unable to
> checkout $current_branch again, and it might even decide the
> rebase is a fast-forward when it is not.
>
> In the 'rebase $upstream' case, we already know the unambiguous
> spelling of $current_branch is "HEAD".  Fix git-rebase to find
> $orig_head unambiguously.

Well explained; $current_branch that never appears as a variable in the section of the code in question made me scratch my head while reading it, though.

Will queue; thanks.
Show 41 quoted lines
> Add a test in t3400-rebase.sh which creates an ambiguous branch
> name and rebases it implicitly with 'git rebase $other'.
>
> Signed-off-by: Phil Hord <hordp@cisco.com>
> ---
>  git-rebase.sh     | 2 +-
>  t/t3400-rebase.sh | 7 +++++++
>  2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/git-rebase.sh b/git-rebase.sh
> index b2f1c76..2c692c3 100755
> --- a/git-rebase.sh
> +++ b/git-rebase.sh
> @@ -473,7 +473,7 @@ case "$#" in
>  		head_name="detached HEAD"
>  		branch_name=HEAD ;# detached
>  	fi
> -	orig_head=$(git rev-parse --verify "${branch_name}^0") || exit
> +	orig_head=$(git rev-parse --verify HEAD) || exit
>  	;;
>  *)
>  	die "BUG: unexpected number of arguments left to parse"
> diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
> index f6cc102..b58fa1a 100755
> --- a/t/t3400-rebase.sh
> +++ b/t/t3400-rebase.sh
> @@ -101,7 +101,14 @@ test_expect_success 'HEAD was detached during rebase' '
>  	test $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})
>  '
>  
> +test_expect_success 'rebase from ambiguous branch name' '
> +	git checkout -b topic side &&
> +	git rebase master
> +'
> +
>  test_expect_success 'rebase after merge master' '
> +	git checkout --detach refs/tags/topic &&
> +	git branch -D topic &&
>  	git reset --hard topic &&
>  	git merge master &&
>  	git rebase master &&

← back to recent threads