summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2013-06-24 13:48:40 -0700
committerJunio C Hamano <gitster@pobox.com>2013-06-24 13:48:40 -0700
commitbc918acf708a839bbc350e014d599fdd458319ca (patch)
tree3b93414f5146cf1e76ecfd005162feedc19f30e5
parent8d8975aca7c2b031a2386cd8f266109a8c6e1973 (diff)
parent2e6e276decde2a9f04fc29bce734a49d3ba8f484 (diff)
downloadgit-bc918acf708a839bbc350e014d599fdd458319ca.tar.gz
Merge branch 'rr/rebase-sha1-by-string-query'
Allow various commit objects to be given to "git rebase" by ':/look for this string' syntax, e.g. "git rebase --onto ':/there'". * rr/rebase-sha1-by-string-query: rebase: use peel_committish() where appropriate sh-setup: add new peel_committish() helper t/rebase: add failing tests for a peculiar revision
-rwxr-xr-xgit-rebase.sh4
-rw-r--r--git-sh-setup.sh12
-rwxr-xr-xt/t3400-rebase.sh11
-rwxr-xr-xt/t3404-rebase-interactive.sh11
4 files changed, 36 insertions, 2 deletions
diff --git a/git-rebase.sh b/git-rebase.sh
index 2d5c2bd0fc..54015e3eaf 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -436,7 +436,7 @@ then
shift
;;
esac
- upstream=`git rev-parse --verify "${upstream_name}^0"` ||
+ upstream=$(peel_committish "${upstream_name}") ||
die "$(eval_gettext "invalid upstream \$upstream_name")"
upstream_arg="$upstream_name"
else
@@ -472,7 +472,7 @@ case "$onto_name" in
fi
;;
*)
- onto=$(git rev-parse --verify "${onto_name}^0") ||
+ onto=$(peel_committish "$onto_name") ||
die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
;;
esac
diff --git a/git-sh-setup.sh b/git-sh-setup.sh
index 2f7835941e..7a964ad2ff 100644
--- a/git-sh-setup.sh
+++ b/git-sh-setup.sh
@@ -313,3 +313,15 @@ then
}
: ${GIT_OBJECT_DIRECTORY="$GIT_DIR/objects"}
fi
+
+peel_committish () {
+ case "$1" in
+ :/*)
+ peeltmp=$(git rev-parse --verify "$1") &&
+ git rev-parse --verify "${peeltmp}^0"
+ ;;
+ *)
+ git rev-parse --verify "${1}^0"
+ ;;
+ esac
+}
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index ff86725b7b..ebf93b0695 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -59,6 +59,17 @@ test_expect_success 'rebase against master' '
git rebase master
'
+test_expect_success 'rebase, with <onto> and <upstream> specified as :/quuxery' '
+ test_when_finished "git branch -D torebase" &&
+ git checkout -b torebase my-topic-branch^ &&
+ upstream=$(git rev-parse ":/Add B") &&
+ onto=$(git rev-parse ":/Add A") &&
+ git rebase --onto $onto $upstream &&
+ git reset --hard my-topic-branch^ &&
+ git rebase --onto ":/Add A" ":/Add B" &&
+ git checkout my-topic-branch
+'
+
test_expect_success 'the rebase operation should not have destroyed author information' '
! (git log | grep "Author:" | grep "<>")
'
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 0d3c57340e..d6b4143773 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -939,4 +939,15 @@ test_expect_success 'rebase -i respects core.commentchar' '
test B = $(git cat-file commit HEAD^ | sed -ne \$p)
'
+test_expect_success 'rebase -i, with <onto> and <upstream> specified as :/quuxery' '
+ test_when_finished "git branch -D torebase" &&
+ git checkout -b torebase branch1 &&
+ upstream=$(git rev-parse ":/J") &&
+ onto=$(git rev-parse ":/A") &&
+ git rebase --onto $onto $upstream &&
+ git reset --hard branch1 &&
+ git rebase --onto ":/A" ":/J" &&
+ git checkout branch1
+'
+
test_done