Code

rebase: factor out reference parsing
authorMartin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Tue, 28 Dec 2010 09:30:30 +0000 (10:30 +0100)
committerJunio C Hamano <gitster@pobox.com>
Tue, 28 Dec 2010 23:04:48 +0000 (15:04 -0800)
Remove the parsing and validation of references (onto, upstream, branch)
from git-rebase--interactive.sh and rely on the information exported from
git-rebase.sh.

By using the parsing of the --onto parameter in git-rebase.sh, this
improves the error message when the parameter is invalid.

Signed-off-by: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-rebase--interactive.sh
git-rebase.sh

index 5a8f5829e21b30a14ed297f93a5eb48f3e1f6567..c055fc4947cb6e15900eec1844d86f7484715c0a 100755 (executable)
@@ -682,25 +682,6 @@ rearrange_squash () {
        rm -f "$1.sq" "$1.rearranged"
 }
 
-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"
-}
-
 case "$action" in
 continue)
        get_saved_options
@@ -769,47 +750,26 @@ skip)
        ;;
 esac
 
-if test -n "$onto"
-then
-       onto=$(parse_onto "$onto") || die "Does not point to a valid commit: $1"
-fi
-
-test -z "$rebase_root" -a $# -ge 1 -a $# -le 2 ||
-test ! -z "$rebase_root" -a $# -le 1 || usage
-
 git var GIT_COMMITTER_IDENT >/dev/null ||
        die "You need to set your committer info first"
 
-if test -z "$rebase_root"
-then
-       upstream_arg="$1"
-       upstream=$(git rev-parse --verify "$1") || die "Invalid base"
-       test -z "$onto" && onto=$upstream
-       shift
-else
-       upstream=
-       upstream_arg=--root
-       test -z "$onto" &&
-               die "You must specify --onto when using --root"
-fi
 require_clean_work_tree "rebase" "Please commit or stash them."
 
 run_pre_rebase_hook "$upstream_arg" "$@"
 
 comment_for_reflog start
 
-if test ! -z "$1"
+if test ! -z "$switch_to"
 then
-       output git checkout "$1" ||
-               die "Could not checkout $1"
+       output git checkout "$switch_to" ||
+               die "Could not checkout $switch_to"
 fi
 
 HEAD=$(git rev-parse --verify HEAD) || die "No HEAD?"
 mkdir "$DOTEST" || die "Could not create temporary $DOTEST"
 
 : > "$DOTEST"/interactive || die "Could not mark as interactive"
-git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null ||
-       echo "detached HEAD" > "$DOTEST"/head-name
+echo "$head_name" > "$DOTEST"/head-name
 
 echo $HEAD > "$DOTEST"/head
 case "$rebase_root" in
index 26e4218479137e3970add8701752caf9537b44c3..d8c7c8d2c5b463219eb45c424d0580df1e1f4228 100755 (executable)
@@ -185,7 +185,8 @@ run_interactive_rebase () {
                export GIT_EDITOR
        fi
        export onto autosquash strategy strategy_opts verbose rebase_root \
-       force_rebase action preserve_merges OK_TO_SKIP_PRE_REBASE
+       force_rebase action preserve_merges OK_TO_SKIP_PRE_REBASE upstream \
+       upstream_arg switch_to head_name
        exec git-rebase--interactive "$@"
 }
 
@@ -433,8 +434,6 @@ else
        state_dir="$apply_dir"
 fi
 
-test "$type" = interactive && run_interactive_rebase "$@"
-
 if test -z "$rebase_root"
 then
        # The upstream head must be given.  Make sure it is valid.
@@ -445,7 +444,7 @@ then
        unset root_flag
        upstream_arg="$upstream_name"
 else
-       test -z "$onto" && die "--root must be used with --onto"
+       test -z "$onto" && die "You must specify --onto when using --root"
        unset upstream_name
        unset upstream
        root_flag="--root"
@@ -472,7 +471,8 @@ case "$onto_name" in
        fi
        ;;
 *)
-       onto=$(git rev-parse --verify "${onto_name}^0") || exit
+       onto=$(git rev-parse --verify "${onto_name}^0") ||
+       die "Does not point to a valid commit: $1"
        ;;
 esac
 
@@ -513,6 +513,8 @@ case "$#" in
 esac
 orig_head=$branch
 
+test "$type" = interactive && run_interactive_rebase "$@"
+
 require_clean_work_tree "rebase" "Please commit or stash them."
 
 # Now we are rebasing commits $upstream..$branch (or with --root,