08e9a21c2f15f44f7541667a2e3a8d911071bb4b
   1# This shell script fragment is sourced by git-rebase to implement
   2# its interactive mode.  "git rebase --interactive" makes it easy
   3# to fix up commits in the middle of a series and rearrange commits.
   4#
   5# Copyright (c) 2006 Johannes E. Schindelin
   6#
   7# The original idea comes from Eric W. Biederman, in
   8# https://public-inbox.org/git/m1odwkyuf5.fsf_-_@ebiederm.dsl.xmission.com/
   9#
  10# The file containing rebase commands, comments, and empty lines.
  11# This file is created by "git rebase -i" then edited by the user.  As
  12# the lines are processed, they are removed from the front of this
  13# file and written to the tail of $done.
  14todo="$state_dir"/git-rebase-todo
  15
  16GIT_CHERRY_PICK_HELP="$resolvemsg"
  17export GIT_CHERRY_PICK_HELP
  18
  19# Initiate an action. If the cannot be any
  20# further action it  may exec a command
  21# or exit and not return.
  22#
  23# TODO: Consider a cleaner return model so it
  24# never exits and always return 0 if process
  25# is complete.
  26#
  27# Parameter 1 is the action to initiate.
  28#
  29# Returns 0 if the action was able to complete
  30# and if 1 if further processing is required.
  31initiate_action () {
  32        case "$1" in
  33        continue)
  34                exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
  35                     --continue
  36                ;;
  37        skip)
  38                git rerere clear
  39                exec git rebase--helper ${force_rebase:+--no-ff} $allow_empty_message \
  40                     --continue
  41                ;;
  42        edit-todo)
  43                exec git rebase--helper --edit-todo
  44                ;;
  45        show-current-patch)
  46                exec git show REBASE_HEAD --
  47                ;;
  48        *)
  49                return 1 # continue
  50                ;;
  51        esac
  52}
  53
  54init_basic_state () {
  55        orig_head=$(git rev-parse --verify HEAD) || die "$(gettext "No HEAD?")"
  56        mkdir -p "$state_dir" || die "$(eval_gettext "Could not create temporary \$state_dir")"
  57        rm -f "$(git rev-parse --git-path REBASE_HEAD)"
  58
  59        : > "$state_dir"/interactive || die "$(gettext "Could not mark as interactive")"
  60        write_basic_state
  61}
  62
  63git_rebase__interactive () {
  64        initiate_action "$action"
  65        ret=$?
  66        if test $ret = 0; then
  67                return 0
  68        fi
  69
  70        git rebase--helper --prepare-branch "$switch_to" ${verbose:+--verbose}
  71        init_basic_state
  72
  73        git rebase--helper --make-script ${keep_empty:+--keep-empty} \
  74                ${rebase_merges:+--rebase-merges} \
  75                ${rebase_cousins:+--rebase-cousins} \
  76                ${upstream:+--upstream "$upstream"} ${onto:+--onto "$onto"} \
  77                ${squash_onto:+--squash-onto "$squash_onto"} \
  78                ${restrict_revision:+--restrict-revision ^"$restrict_revision"} >"$todo" ||
  79        die "$(gettext "Could not generate todo list")"
  80
  81        exec git rebase--helper --complete-action "$onto_name" "$cmd" \
  82                $allow_empty_message ${autosquash:+--autosquash} ${verbose:+--verbose} \
  83                ${keep_empty:+--keep-empty} ${force_rebase:+--no-ff} \
  84                ${upstream:+--upstream "$upstream"} ${onto:+--onto "$onto"}
  85}