зеркало из https://github.com/microsoft/git.git
rebase: factor out command line option processing
Factor out the command line processing in git-rebase--interactive.sh to git-rebase.sh. Store the options in variables in git-rebase.sh and then source git-rebase--interactive.sh. Suggested-by: Johannes Sixt <j6t@kdbg.org> Signed-off-by: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Родитель
9765b6abeb
Коммит
cf432ca051
|
@ -10,31 +10,7 @@
|
|||
# The original idea comes from Eric W. Biederman, in
|
||||
# http://article.gmane.org/gmane.comp.version-control.git/22407
|
||||
|
||||
OPTIONS_KEEPDASHDASH=
|
||||
OPTIONS_SPEC="\
|
||||
git-rebase [-i] [options] [--] <upstream> [<branch>]
|
||||
git-rebase [-i] (--continue | --abort | --skip)
|
||||
--
|
||||
Available options are
|
||||
v,verbose display a diffstat of what changed upstream
|
||||
onto= rebase onto given branch instead of upstream
|
||||
p,preserve-merges try to recreate merges instead of ignoring them
|
||||
s,strategy= use the given merge strategy
|
||||
no-ff cherry-pick all commits, even if unchanged
|
||||
m,merge always used (no-op)
|
||||
i,interactive always used (no-op)
|
||||
Actions:
|
||||
continue continue rebasing process
|
||||
abort abort rebasing process and restore original branch
|
||||
skip skip current patch and continue rebasing process
|
||||
no-verify override pre-rebase hook from stopping the operation
|
||||
verify allow pre-rebase hook to run
|
||||
root rebase all reachable commmits up to the root(s)
|
||||
autosquash move commits that begin with squash!/fixup! under -i
|
||||
"
|
||||
|
||||
. git-sh-setup
|
||||
require_work_tree
|
||||
|
||||
dotest="$GIT_DIR/rebase-merge"
|
||||
|
||||
|
@ -105,16 +81,6 @@ amend="$dotest"/amend
|
|||
rewritten_list="$dotest"/rewritten-list
|
||||
rewritten_pending="$dotest"/rewritten-pending
|
||||
|
||||
preserve_merges=
|
||||
strategy=
|
||||
onto=
|
||||
verbose=
|
||||
ok_to_skip_pre_rebase=
|
||||
rebase_root=
|
||||
autosquash=
|
||||
test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
|
||||
force_rebase=
|
||||
|
||||
GIT_CHERRY_PICK_HELP="\
|
||||
hint: after resolving the conflicts, mark the corrected paths
|
||||
hint: with 'git add <paths>' and run 'git rebase --continue'"
|
||||
|
@ -648,15 +614,6 @@ skip_unnecessary_picks () {
|
|||
die "Could not skip unnecessary pick commands"
|
||||
}
|
||||
|
||||
# check if no other options are set
|
||||
is_standalone () {
|
||||
test $# -eq 2 -a "$2" = '--' &&
|
||||
test -z "$onto" &&
|
||||
test -z "$preserve_merges" &&
|
||||
test -z "$strategy" &&
|
||||
test -z "$verbose"
|
||||
}
|
||||
|
||||
get_saved_options () {
|
||||
test -d "$rewritten" && preserve_merges=t
|
||||
test -f "$dotest"/strategy && strategy="$(cat "$dotest"/strategy)"
|
||||
|
@ -744,134 +701,77 @@ parse_onto () {
|
|||
git rev-parse --verify "$1^0"
|
||||
}
|
||||
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
--no-verify)
|
||||
ok_to_skip_pre_rebase=yes
|
||||
;;
|
||||
--verify)
|
||||
ok_to_skip_pre_rebase=
|
||||
;;
|
||||
--continue)
|
||||
is_standalone "$@" || usage
|
||||
get_saved_options
|
||||
comment_for_reflog continue
|
||||
case "$action" in
|
||||
continue)
|
||||
get_saved_options
|
||||
comment_for_reflog continue
|
||||
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
|
||||
# Sanity check
|
||||
git rev-parse --verify HEAD >/dev/null ||
|
||||
die "Cannot read HEAD"
|
||||
git update-index --ignore-submodules --refresh &&
|
||||
git diff-files --quiet --ignore-submodules ||
|
||||
die "Working tree is dirty"
|
||||
# Sanity check
|
||||
git rev-parse --verify HEAD >/dev/null ||
|
||||
die "Cannot read HEAD"
|
||||
git update-index --ignore-submodules --refresh &&
|
||||
git diff-files --quiet --ignore-submodules ||
|
||||
die "Working tree is dirty"
|
||||
|
||||
# do we have anything to commit?
|
||||
if git diff-index --cached --quiet --ignore-submodules HEAD --
|
||||
# do we have anything to commit?
|
||||
if git diff-index --cached --quiet --ignore-submodules HEAD --
|
||||
then
|
||||
: Nothing to commit -- skip this
|
||||
else
|
||||
. "$author_script" ||
|
||||
die "Cannot find the author identity"
|
||||
current_head=
|
||||
if test -f "$amend"
|
||||
then
|
||||
: Nothing to commit -- skip this
|
||||
else
|
||||
. "$author_script" ||
|
||||
die "Cannot find the author identity"
|
||||
current_head=
|
||||
if test -f "$amend"
|
||||
then
|
||||
current_head=$(git rev-parse --verify HEAD)
|
||||
test "$current_head" = $(cat "$amend") ||
|
||||
die "\
|
||||
current_head=$(git rev-parse --verify HEAD)
|
||||
test "$current_head" = $(cat "$amend") ||
|
||||
die "\
|
||||
You have uncommitted changes in your working tree. Please, commit them
|
||||
first and then run 'git rebase --continue' again."
|
||||
git reset --soft HEAD^ ||
|
||||
die "Cannot rewind the HEAD"
|
||||
fi
|
||||
do_with_author git commit --no-verify -F "$msg" -e || {
|
||||
test -n "$current_head" && git reset --soft $current_head
|
||||
die "Could not commit staged changes."
|
||||
}
|
||||
git reset --soft HEAD^ ||
|
||||
die "Cannot rewind the HEAD"
|
||||
fi
|
||||
do_with_author git commit --no-verify -F "$msg" -e || {
|
||||
test -n "$current_head" && git reset --soft $current_head
|
||||
die "Could not commit staged changes."
|
||||
}
|
||||
fi
|
||||
|
||||
record_in_rewritten "$(cat "$dotest"/stopped-sha)"
|
||||
record_in_rewritten "$(cat "$dotest"/stopped-sha)"
|
||||
|
||||
require_clean_work_tree "rebase"
|
||||
do_rest
|
||||
;;
|
||||
--abort)
|
||||
is_standalone "$@" || usage
|
||||
get_saved_options
|
||||
comment_for_reflog abort
|
||||
require_clean_work_tree "rebase"
|
||||
do_rest
|
||||
;;
|
||||
abort)
|
||||
get_saved_options
|
||||
comment_for_reflog abort
|
||||
|
||||
git rerere clear
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
git rerere clear
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
|
||||
headname=$(cat "$dotest"/head-name)
|
||||
head=$(cat "$dotest"/head)
|
||||
case $headname in
|
||||
refs/*)
|
||||
git symbolic-ref HEAD $headname
|
||||
;;
|
||||
esac &&
|
||||
output git reset --hard $head &&
|
||||
rm -rf "$dotest"
|
||||
exit
|
||||
headname=$(cat "$dotest"/head-name)
|
||||
head=$(cat "$dotest"/head)
|
||||
case $headname in
|
||||
refs/*)
|
||||
git symbolic-ref HEAD $headname
|
||||
;;
|
||||
--skip)
|
||||
is_standalone "$@" || usage
|
||||
get_saved_options
|
||||
comment_for_reflog skip
|
||||
esac &&
|
||||
output git reset --hard $head &&
|
||||
rm -rf "$dotest"
|
||||
exit
|
||||
;;
|
||||
skip)
|
||||
get_saved_options
|
||||
comment_for_reflog skip
|
||||
|
||||
git rerere clear
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
git rerere clear
|
||||
test -d "$dotest" || die "No interactive rebase running"
|
||||
|
||||
output git reset --hard && do_rest
|
||||
;;
|
||||
-s)
|
||||
case "$#,$1" in
|
||||
*,*=*)
|
||||
strategy=$(expr "z$1" : 'z-[^=]*=\(.*\)') ;;
|
||||
1,*)
|
||||
usage ;;
|
||||
*)
|
||||
strategy="$2"
|
||||
shift ;;
|
||||
esac
|
||||
;;
|
||||
-m)
|
||||
# we use merge anyway
|
||||
;;
|
||||
-v)
|
||||
verbose=t
|
||||
;;
|
||||
-p)
|
||||
preserve_merges=t
|
||||
;;
|
||||
-i)
|
||||
# yeah, we know
|
||||
;;
|
||||
--no-ff)
|
||||
force_rebase=t
|
||||
;;
|
||||
--root)
|
||||
rebase_root=t
|
||||
;;
|
||||
--autosquash)
|
||||
autosquash=t
|
||||
;;
|
||||
--no-autosquash)
|
||||
autosquash=
|
||||
;;
|
||||
--onto)
|
||||
test 2 -le "$#" || usage
|
||||
onto="$2"
|
||||
shift
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
output git reset --hard && do_rest
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -n "$onto"
|
||||
then
|
||||
|
|
|
@ -64,6 +64,9 @@ type=
|
|||
state_dir=
|
||||
# One of {'', continue, skip, abort}, as parsed from command line
|
||||
action=
|
||||
preserve_merges=
|
||||
autosquash=
|
||||
test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t
|
||||
|
||||
read_state () {
|
||||
if test "$type" = merge
|
||||
|
@ -176,27 +179,12 @@ finish_rb_merge () {
|
|||
say All done.
|
||||
}
|
||||
|
||||
is_interactive () {
|
||||
while test $# != 0
|
||||
do
|
||||
case "$1" in
|
||||
-i|--interactive)
|
||||
interactive_rebase=explicit
|
||||
break
|
||||
;;
|
||||
-p|--preserve-merges)
|
||||
interactive_rebase=implied
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
run_interactive_rebase () {
|
||||
if [ "$interactive_rebase" = implied ]; then
|
||||
GIT_EDITOR=:
|
||||
export GIT_EDITOR
|
||||
fi
|
||||
|
||||
test -n "$interactive_rebase" || test -f "$merge_dir"/interactive
|
||||
. git-rebase--interactive "$@"
|
||||
}
|
||||
|
||||
run_pre_rebase_hook () {
|
||||
|
@ -211,8 +199,6 @@ run_pre_rebase_hook () {
|
|||
test -f "$apply_dir"/applying &&
|
||||
die 'It looks like git-am is in progress. Cannot rebase.'
|
||||
|
||||
is_interactive "$@" && exec git-rebase--interactive "$@"
|
||||
|
||||
if test -d "$apply_dir"
|
||||
then
|
||||
type=am
|
||||
|
@ -249,6 +235,19 @@ do
|
|||
onto="$2"
|
||||
shift
|
||||
;;
|
||||
-i|--interactive)
|
||||
interactive_rebase=explicit
|
||||
;;
|
||||
-p|--preserve-merges)
|
||||
preserve_merges=t
|
||||
test -z "$interactive_rebase" && interactive_rebase=implied
|
||||
;;
|
||||
--autosquash)
|
||||
autosquash=t
|
||||
;;
|
||||
--no-autosquash)
|
||||
autosquash=
|
||||
;;
|
||||
-M|-m|--m|--me|--mer|--merg|--merge)
|
||||
do_merge=t
|
||||
;;
|
||||
|
@ -339,7 +338,11 @@ do
|
|||
done
|
||||
test $# -gt 2 && usage
|
||||
|
||||
test -n "$action" && test -z "$in_progress" && die "No rebase in progress?"
|
||||
if test -n "$action"
|
||||
then
|
||||
test -z "$in_progress" && die "No rebase in progress?"
|
||||
test "$type" = interactive && run_interactive_rebase
|
||||
fi
|
||||
|
||||
case "$action" in
|
||||
continue)
|
||||
|
@ -415,6 +418,21 @@ fi
|
|||
|
||||
test $# -eq 0 && test -z "$rebase_root" && usage
|
||||
|
||||
if test -n "$interactive_rebase"
|
||||
then
|
||||
type=interactive
|
||||
state_dir="$merge_dir"
|
||||
elif test -n "$do_merge"
|
||||
then
|
||||
type=merge
|
||||
state_dir="$merge_dir"
|
||||
else
|
||||
type=am
|
||||
state_dir="$apply_dir"
|
||||
fi
|
||||
|
||||
test "$type" = interactive && run_interactive_rebase "$@"
|
||||
|
||||
require_clean_work_tree "rebase" "Please commit or stash them."
|
||||
|
||||
if test -z "$rebase_root"
|
||||
|
|
Загрузка…
Ссылка в новой задаче