From: Junio C Hamano Date: Thu, 07 Jan 2010 20:19:54 GMT Subject: Re: [PATCH (v2) 2/2] rebase -i: teach --onto A...B syntax Message-ID: <7vtyux3bx1.fsf@alter.siamese.dyndns.org> In-Reply-To: <20100107200509.6117@nanako3.lavabit.com> Nanako Shiraishi writes: > When rewriting commits on a topic branch, sometimes it is easier to > compare the version of commits before and after the rewrite if they are > based on the same commit that forked from the upstream. An earlier commit > by Junio (fixed up by the previous commit) gives "--onto A...B" syntax to > rebase command, and rebases on top of the merge base between A and B; > teach the same to the interactive version, too. > > Signed-off-by: しらいし ななこ > --- > git-rebase--interactive.sh | 21 ++++++++++++++++++++- > t/t3415-rebase-onto-threedots.sh | 30 ++++++++++++++++++++++++++++++ > 2 files changed, 50 insertions(+), 1 deletions(-) > > diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh > index 23ded48..f7ae02c 100755 > --- a/git-rebase--interactive.sh > +++ b/git-rebase--interactive.sh > @@ -482,6 +482,25 @@ get_saved_options () { > test -f "$DOTEST"/rebase-root && REBASE_ROOT=t > } > > +LF=' > +' > +parse_onto () { > + case "$1" in > + *...*) > + if left=${1%...*} right=${1#*...} && > + onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD}) > + then > + case "$onto" in > + ?*"$LF"?* | '') > + exit 1 ;; > + esac > + echo "$onto" > + exit 0 > + fi > + esac > + git rev-parse --verify "$1^0" > +} > + > while test $# != 0 > do > case "$1" in I am a bit unhappy about the duplication. The text of this function is different from the one in "rebase" proper, but they implement essentially the same logic. I was tempted to suggest having a common helper function, but as Dscho mentioned "rebase -i" implementation does not share much with "rebase" (even though it shares the external command line interface from the end user's point of view), and I don't see a readily available place (other than in git-sh-setup) to do so. Ideas?