4ca47aed1eca502837293ac5b099175da56c7f8d
   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
  63init_revisions_and_shortrevisions () {
  64        shorthead=$(git rev-parse --short $orig_head)
  65        shortonto=$(git rev-parse --short $onto)
  66        if test -z "$rebase_root"
  67                # this is now equivalent to ! -z "$upstream"
  68        then
  69                shortupstream=$(git rev-parse --short $upstream)
  70                revisions=$upstream...$orig_head
  71                shortrevisions=$shortupstream..$shorthead
  72        else
  73                revisions=$onto...$orig_head
  74                shortrevisions=$shorthead
  75                test -z "$squash_onto" ||
  76                echo "$squash_onto" >"$state_dir"/squash-onto
  77        fi
  78}
  79
  80git_rebase__interactive () {
  81        initiate_action "$action"
  82        ret=$?
  83        if test $ret = 0; then
  84                return 0
  85        fi
  86
  87        git rebase--helper --prepare-branch "$switch_to" ${verbose:+--verbose}
  88        init_basic_state
  89
  90        init_revisions_and_shortrevisions
  91
  92        git rebase--helper --make-script ${keep_empty:+--keep-empty} \
  93                ${rebase_merges:+--rebase-merges} \
  94                ${rebase_cousins:+--rebase-cousins} \
  95                ${upstream:+--upstream "$upstream"} ${onto:+--onto "$onto"} \
  96                ${squash_onto:+--squash-onto "$squash_onto"} \
  97                ${restrict_revision:+--restrict-revision ^"$restrict_revision"} >"$todo" ||
  98        die "$(gettext "Could not generate todo list")"
  99
 100        exec git rebase--helper --complete-action "$shortrevisions" "$onto_name" \
 101                "$shortonto" "$orig_head" "$cmd" $allow_empty_message \
 102                ${autosquash:+--autosquash} ${keep_empty:+--keep-empty} \
 103                ${verbose:+--verbose} ${force_rebase:+--no-ff}
 104}