Jonathan Nieder | 11d6214 | 2013-11-25 13:03:52 -0800 | [diff] [blame] | 1 | # This shell script fragment is sourced by git-rebase to implement |
| 2 | # its default, fast, patch-based, non-interactive mode. |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 3 | # |
| 4 | # Copyright (c) 2010 Junio C Hamano. |
| 5 | # |
| 6 | |
Kyle J. McKay | 9f50d32 | 2014-04-11 01:28:17 -0700 | [diff] [blame] | 7 | # The whole contents of this file is run by dot-sourcing it from |
| 8 | # inside a shell function. It used to be that "return"s we see |
| 9 | # below were not inside any function, and expected to return |
| 10 | # to the function that dot-sourced us. |
| 11 | # |
| 12 | # However, FreeBSD /bin/sh misbehaves on such a construct and |
| 13 | # continues to run the statements that follow such a "return". |
| 14 | # As a work-around, we introduce an extra layer of a function |
| 15 | # here, and immediately call it after defining it. |
| 16 | git_rebase__am () { |
| 17 | |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 18 | case "$action" in |
| 19 | continue) |
Nicolas Vigier | 3ee5e54 | 2014-02-10 01:03:37 +0000 | [diff] [blame] | 20 | git am --resolved --resolvemsg="$resolvemsg" \ |
| 21 | ${gpg_sign_opt:+"$gpg_sign_opt"} && |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 22 | move_to_original_branch |
Ramkumar Ramachandra | a1549e1 | 2013-05-12 17:26:38 +0530 | [diff] [blame] | 23 | return |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 24 | ;; |
| 25 | skip) |
Martin von Zweigbergk | c5e610b | 2011-02-06 13:43:58 -0500 | [diff] [blame] | 26 | git am --skip --resolvemsg="$resolvemsg" && |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 27 | move_to_original_branch |
Ramkumar Ramachandra | a1549e1 | 2013-05-12 17:26:38 +0530 | [diff] [blame] | 28 | return |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 29 | ;; |
| 30 | esac |
| 31 | |
John Keeping | b6266dc | 2014-07-15 20:14:02 +0100 | [diff] [blame] | 32 | if test -z "$rebase_root" |
| 33 | # this is now equivalent to ! -z "$upstream" |
| 34 | then |
| 35 | revisions=$upstream...$orig_head |
| 36 | else |
| 37 | revisions=$onto...$orig_head |
| 38 | fi |
Martin von Zweigbergk | 46df82d | 2011-02-06 13:43:48 -0500 | [diff] [blame] | 39 | |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 40 | ret=0 |
Neil Horman | 90e1818 | 2012-04-20 10:36:17 -0400 | [diff] [blame] | 41 | if test -n "$keep_empty" |
| 42 | then |
| 43 | # we have to do this the hard way. git format-patch completely squashes |
| 44 | # empty commits and even if it didn't the format doesn't really lend |
| 45 | # itself well to recording empty patches. fortunately, cherry-pick |
| 46 | # makes this easy |
John Keeping | b6266dc | 2014-07-15 20:14:02 +0100 | [diff] [blame] | 47 | git cherry-pick ${gpg_sign_opt:+"$gpg_sign_opt"} --allow-empty \ |
John Keeping | 1e0dacd | 2014-07-16 20:23:49 +0100 | [diff] [blame] | 48 | --right-only "$revisions" \ |
| 49 | ${restrict_revision+^$restrict_revision} |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 50 | ret=$? |
Neil Horman | 90e1818 | 2012-04-20 10:36:17 -0400 | [diff] [blame] | 51 | else |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 52 | rm -f "$GIT_DIR/rebased-patches" |
| 53 | |
John Keeping | b6266dc | 2014-07-15 20:14:02 +0100 | [diff] [blame] | 54 | git format-patch -k --stdout --full-index --cherry-pick --right-only \ |
Felipe Contreras | 0597ffa | 2013-04-14 17:27:04 -0500 | [diff] [blame] | 55 | --src-prefix=a/ --dst-prefix=b/ --no-renames --no-cover-letter \ |
John Keeping | 1e0dacd | 2014-07-16 20:23:49 +0100 | [diff] [blame] | 56 | "$revisions" ${restrict_revision+^$restrict_revision} \ |
| 57 | >"$GIT_DIR/rebased-patches" |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 58 | ret=$? |
Neil Horman | 90e1818 | 2012-04-20 10:36:17 -0400 | [diff] [blame] | 59 | |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 60 | if test 0 != $ret |
| 61 | then |
| 62 | rm -f "$GIT_DIR/rebased-patches" |
| 63 | case "$head_name" in |
| 64 | refs/heads/*) |
| 65 | git checkout -q "$head_name" |
| 66 | ;; |
| 67 | *) |
| 68 | git checkout -q "$orig_head" |
| 69 | ;; |
| 70 | esac |
| 71 | |
| 72 | cat >&2 <<-EOF |
| 73 | |
| 74 | git encountered an error while preparing the patches to replay |
| 75 | these revisions: |
| 76 | |
| 77 | $revisions |
| 78 | |
| 79 | As a result, git cannot rebase them. |
| 80 | EOF |
Clemens Buchacher | 60d708b | 2015-07-02 11:11:33 +0200 | [diff] [blame] | 81 | return $ret |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 82 | fi |
| 83 | |
Nicolas Vigier | 3ee5e54 | 2014-02-10 01:03:37 +0000 | [diff] [blame] | 84 | git am $git_am_opt --rebasing --resolvemsg="$resolvemsg" \ |
| 85 | ${gpg_sign_opt:+"$gpg_sign_opt"} <"$GIT_DIR/rebased-patches" |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 86 | ret=$? |
| 87 | |
| 88 | rm -f "$GIT_DIR/rebased-patches" |
| 89 | fi |
| 90 | |
| 91 | if test 0 != $ret |
| 92 | then |
| 93 | test -d "$state_dir" && write_basic_state |
Ramkumar Ramachandra | a1549e1 | 2013-05-12 17:26:38 +0530 | [diff] [blame] | 94 | return $ret |
Andrew Wong | e481af0 | 2012-10-10 23:54:03 -0400 | [diff] [blame] | 95 | fi |
| 96 | |
| 97 | move_to_original_branch |
Kyle J. McKay | 9f50d32 | 2014-04-11 01:28:17 -0700 | [diff] [blame] | 98 | |
| 99 | } |
| 100 | # ... and then we call the whole thing. |
| 101 | git_rebase__am |