rebase -i: rewrite complete_action() in C
[gitweb.git] / git-rebase--interactive.sh
index 9884ecd71e35f0eeb24e43a1c302c5d79a50f060..59dc4888a6da11e9cd0164449e84412c9a82cccb 100644 (file)
@@ -28,49 +28,6 @@ case "$comment_char" in
        ;;
 esac
 
-orig_reflog_action="$GIT_REFLOG_ACTION"
-
-comment_for_reflog () {
-       case "$orig_reflog_action" in
-       ''|rebase*)
-               GIT_REFLOG_ACTION="rebase -i ($1)"
-               export GIT_REFLOG_ACTION
-               ;;
-       esac
-}
-
-append_todo_help () {
-       gettext "
-Commands:
-p, pick <commit> = use commit
-r, reword <commit> = use commit, but edit the commit message
-e, edit <commit> = use commit, but stop for amending
-s, squash <commit> = use commit, but meld into previous commit
-f, fixup <commit> = like \"squash\", but discard this commit's log message
-x, exec <commit> = run command (the rest of the line) using shell
-d, drop <commit> = remove commit
-l, label <label> = label current HEAD with a name
-t, reset <label> = reset HEAD to a label
-m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
-.       create a merge commit using the original merge commit's
-.       message (or the oneline, if no original merge commit was
-.       specified). Use -c <commit> to reword the commit message.
-
-These lines can be re-ordered; they are executed from top to bottom.
-" | git stripspace --comment-lines >>"$todo"
-
-       if test $(get_missing_commit_check_level) = error
-       then
-               gettext "
-Do not remove any line. Use 'drop' explicitly to remove a commit.
-" | git stripspace --comment-lines >>"$todo"
-       else
-               gettext "
-If you remove a line here THAT COMMIT WILL BE LOST.
-" | git stripspace --comment-lines >>"$todo"
-       fi
-}
-
 die_abort () {
        apply_autostash
        rm -rf "$state_dir"
@@ -102,13 +59,6 @@ collapse_todo_ids() {
        git rebase--helper --shorten-ids
 }
 
-# Switch to the branch in $into and notify it in the reflog
-checkout_onto () {
-       GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $onto_name"
-       output git checkout $onto || die_abort "$(gettext "could not detach HEAD")"
-       git update-ref ORIG_HEAD $orig_head
-}
-
 get_missing_commit_check_level () {
        check_level=$(git config --get rebase.missingCommitsCheck)
        check_level=${check_level:-ignore}
@@ -140,22 +90,7 @@ initiate_action () {
                     --continue
                ;;
        edit-todo)
-               git stripspace --strip-comments <"$todo" >"$todo".new
-               mv -f "$todo".new "$todo"
-               collapse_todo_ids
-               append_todo_help
-               gettext "
-You are editing the todo file of an ongoing interactive rebase.
-To continue rebase after editing, run:
-    git rebase --continue
-
-" | git stripspace --comment-lines >>"$todo"
-
-               git_sequence_editor "$todo" ||
-                       die "$(gettext "Could not execute editor")"
-               expand_todo_ids
-
-               exit
+               exec git rebase--helper --edit-todo
                ;;
        show-current-patch)
                exec git show REBASE_HEAD --
@@ -166,19 +101,6 @@ To continue rebase after editing, run:
        esac
 }
 
-setup_reflog_action () {
-       comment_for_reflog start
-
-       if test ! -z "$switch_to"
-       then
-               GIT_REFLOG_ACTION="$GIT_REFLOG_ACTION: checkout $switch_to"
-               output git checkout "$switch_to" -- ||
-                       die "$(eval_gettext "Could not checkout \$switch_to")"
-
-               comment_for_reflog start
-       fi
-}
-
 init_basic_state () {
        orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
        mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
@@ -205,62 +127,6 @@ init_revisions_and_shortrevisions () {
        fi
 }
 
-complete_action() {
-       test -s "$todo" || echo noop >> "$todo"
-       test -z "$autosquash" || git rebase--helper --rearrange-squash || exit
-       test -n "$cmd" && git rebase--helper --add-exec-commands "$cmd"
-
-       todocount=$(git stripspace --strip-comments <"$todo" | wc -l)
-       todocount=${todocount##* }
-
-cat >>"$todo" <<EOF
-
-$comment_char $(eval_ngettext \
-       "Rebase \$shortrevisions onto \$shortonto (\$todocount command)" \
-       "Rebase \$shortrevisions onto \$shortonto (\$todocount commands)" \
-       "$todocount")
-EOF
-       append_todo_help
-       gettext "
-       However, if you remove everything, the rebase will be aborted.
-
-       " | git stripspace --comment-lines >>"$todo"
-
-       if test -z "$keep_empty"
-       then
-               printf '%s\n' "$comment_char $(gettext "Note that empty commits are commented out")" >>"$todo"
-       fi
-
-
-       has_action "$todo" ||
-               return 2
-
-       cp "$todo" "$todo".backup
-       collapse_todo_ids
-       git_sequence_editor "$todo" ||
-               die_abort "$(gettext "Could not execute editor")"
-
-       has_action "$todo" ||
-               return 2
-
-       git rebase--helper --check-todo-list || {
-               ret=$?
-               checkout_onto
-               exit $ret
-       }
-
-       expand_todo_ids
-
-       test -n "$force_rebase" ||
-       onto="$(git rebase--helper --skip-unnecessary-picks)" ||
-       die "Could not skip unnecessary pick commands"
-
-       checkout_onto
-       require_clean_work_tree "rebase"
-       exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
-            --continue
-}
-
 git_rebase__interactive () {
        initiate_action "$action"
        ret=$?
@@ -268,7 +134,7 @@ git_rebase__interactive () {
                return 0
        fi
 
-       setup_reflog_action
+       git rebase--helper --prepare-branch "$switch_to" ${verbose:+--verbose}
        init_basic_state
 
        init_revisions_and_shortrevisions
@@ -279,5 +145,8 @@ git_rebase__interactive () {
                $revisions ${restrict_revision+^$restrict_revision} >"$todo" ||
        die "$(gettext "Could not generate todo list")"
 
-       complete_action
+       exec git rebase--helper --complete-action "$shortrevisions" "$onto_name" \
+               "$shortonto" "$orig_head" "$cmd" $allow_empty_message \
+               ${autosquash:+--autosquash} ${keep_empty:+--keep-empty} \
+               ${verbose:+--verbose} ${force_rebase:+--no-ff}
 }