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>maint
							parent
							
								
									9765b6abeb
								
							
						
					
					
						commit
						cf432ca051
					
				|  | @ -10,31 +10,7 @@ | ||||||
| # The original idea comes from Eric W. Biederman, in | # The original idea comes from Eric W. Biederman, in | ||||||
| # http://article.gmane.org/gmane.comp.version-control.git/22407 | # 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 | . git-sh-setup | ||||||
| require_work_tree |  | ||||||
|  |  | ||||||
| dotest="$GIT_DIR/rebase-merge" | dotest="$GIT_DIR/rebase-merge" | ||||||
|  |  | ||||||
|  | @ -105,16 +81,6 @@ amend="$dotest"/amend | ||||||
| rewritten_list="$dotest"/rewritten-list | rewritten_list="$dotest"/rewritten-list | ||||||
| rewritten_pending="$dotest"/rewritten-pending | 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="\ | GIT_CHERRY_PICK_HELP="\ | ||||||
| hint: after resolving the conflicts, mark the corrected paths | hint: after resolving the conflicts, mark the corrected paths | ||||||
| hint: with 'git add <paths>' and run 'git rebase --continue'" | hint: with 'git add <paths>' and run 'git rebase --continue'" | ||||||
|  | @ -648,15 +614,6 @@ skip_unnecessary_picks () { | ||||||
| 	die "Could not skip unnecessary pick commands" | 	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 () { | get_saved_options () { | ||||||
| 	test -d "$rewritten" && preserve_merges=t | 	test -d "$rewritten" && preserve_merges=t | ||||||
| 	test -f "$dotest"/strategy && strategy="$(cat "$dotest"/strategy)" | 	test -f "$dotest"/strategy && strategy="$(cat "$dotest"/strategy)" | ||||||
|  | @ -744,134 +701,77 @@ parse_onto () { | ||||||
| 	git rev-parse --verify "$1^0" | 	git rev-parse --verify "$1^0" | ||||||
| } | } | ||||||
|  |  | ||||||
| while test $# != 0 | case "$action" in | ||||||
| do | continue) | ||||||
| 	case "$1" in | 	get_saved_options | ||||||
| 	--no-verify) | 	comment_for_reflog continue | ||||||
| 		ok_to_skip_pre_rebase=yes |  | ||||||
| 		;; |  | ||||||
| 	--verify) |  | ||||||
| 		ok_to_skip_pre_rebase= |  | ||||||
| 		;; |  | ||||||
| 	--continue) |  | ||||||
| 		is_standalone "$@" || usage |  | ||||||
| 		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 | 	# Sanity check | ||||||
| 		git rev-parse --verify HEAD >/dev/null || | 	git rev-parse --verify HEAD >/dev/null || | ||||||
| 			die "Cannot read HEAD" | 		die "Cannot read HEAD" | ||||||
| 		git update-index --ignore-submodules --refresh && | 	git update-index --ignore-submodules --refresh && | ||||||
| 			git diff-files --quiet --ignore-submodules || | 		git diff-files --quiet --ignore-submodules || | ||||||
| 			die "Working tree is dirty" | 		die "Working tree is dirty" | ||||||
|  |  | ||||||
| 		# do we have anything to commit? | 	# do we have anything to commit? | ||||||
| 		if git diff-index --cached --quiet --ignore-submodules HEAD -- | 	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 | 		then | ||||||
| 			: Nothing to commit -- skip this | 			current_head=$(git rev-parse --verify HEAD) | ||||||
| 		else | 			test "$current_head" = $(cat "$amend") || | ||||||
| 			. "$author_script" || | 			die "\ | ||||||
| 				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 "\ |  | ||||||
| You have uncommitted changes in your working tree. Please, commit them | You have uncommitted changes in your working tree. Please, commit them | ||||||
| first and then run 'git rebase --continue' again." | first and then run 'git rebase --continue' again." | ||||||
| 				git reset --soft HEAD^ || | 			git reset --soft HEAD^ || | ||||||
| 				die "Cannot rewind the 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 | 		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" | 	require_clean_work_tree "rebase" | ||||||
| 		do_rest | 	do_rest | ||||||
| 		;; | 	;; | ||||||
| 	--abort) | abort) | ||||||
| 		is_standalone "$@" || usage | 	get_saved_options | ||||||
| 		get_saved_options | 	comment_for_reflog abort | ||||||
| 		comment_for_reflog abort |  | ||||||
|  |  | ||||||
| 		git rerere clear | 	git rerere clear | ||||||
| 		test -d "$dotest" || die "No interactive rebase running" | 	test -d "$dotest" || die "No interactive rebase running" | ||||||
|  |  | ||||||
| 		headname=$(cat "$dotest"/head-name) | 	headname=$(cat "$dotest"/head-name) | ||||||
| 		head=$(cat "$dotest"/head) | 	head=$(cat "$dotest"/head) | ||||||
| 		case $headname in | 	case $headname in | ||||||
| 		refs/*) | 	refs/*) | ||||||
| 			git symbolic-ref HEAD $headname | 		git symbolic-ref HEAD $headname | ||||||
| 			;; |  | ||||||
| 		esac && |  | ||||||
| 		output git reset --hard $head && |  | ||||||
| 		rm -rf "$dotest" |  | ||||||
| 		exit |  | ||||||
| 		;; | 		;; | ||||||
| 	--skip) | 	esac && | ||||||
| 		is_standalone "$@" || usage | 	output git reset --hard $head && | ||||||
| 		get_saved_options | 	rm -rf "$dotest" | ||||||
| 		comment_for_reflog skip | 	exit | ||||||
|  | 	;; | ||||||
|  | skip) | ||||||
|  | 	get_saved_options | ||||||
|  | 	comment_for_reflog skip | ||||||
|  |  | ||||||
| 		git rerere clear | 	git rerere clear | ||||||
| 		test -d "$dotest" || die "No interactive rebase running" | 	test -d "$dotest" || die "No interactive rebase running" | ||||||
|  |  | ||||||
| 		output git reset --hard && do_rest | 	output git reset --hard && do_rest | ||||||
| 		;; | 	;; | ||||||
| 	-s) | esac | ||||||
| 		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 |  | ||||||
|  |  | ||||||
| if test -n "$onto" | if test -n "$onto" | ||||||
| then | then | ||||||
|  |  | ||||||
|  | @ -64,6 +64,9 @@ type= | ||||||
| state_dir= | state_dir= | ||||||
| # One of {'', continue, skip, abort}, as parsed from command line | # One of {'', continue, skip, abort}, as parsed from command line | ||||||
| action= | action= | ||||||
|  | preserve_merges= | ||||||
|  | autosquash= | ||||||
|  | test "$(git config --bool rebase.autosquash)" = "true" && autosquash=t | ||||||
|  |  | ||||||
| read_state () { | read_state () { | ||||||
| 	if test "$type" = merge | 	if test "$type" = merge | ||||||
|  | @ -176,27 +179,12 @@ finish_rb_merge () { | ||||||
| 	say All done. | 	say All done. | ||||||
| } | } | ||||||
|  |  | ||||||
| is_interactive () { | run_interactive_rebase () { | ||||||
| 	while test $# != 0 |  | ||||||
| 	do |  | ||||||
| 		case "$1" in |  | ||||||
| 			-i|--interactive) |  | ||||||
| 				interactive_rebase=explicit |  | ||||||
| 				break |  | ||||||
| 			;; |  | ||||||
| 			-p|--preserve-merges) |  | ||||||
| 				interactive_rebase=implied |  | ||||||
| 			;; |  | ||||||
| 		esac |  | ||||||
| 		shift |  | ||||||
| 	done |  | ||||||
|  |  | ||||||
| 	if [ "$interactive_rebase" = implied ]; then | 	if [ "$interactive_rebase" = implied ]; then | ||||||
| 		GIT_EDITOR=: | 		GIT_EDITOR=: | ||||||
| 		export GIT_EDITOR | 		export GIT_EDITOR | ||||||
| 	fi | 	fi | ||||||
|  | 	. git-rebase--interactive "$@" | ||||||
| 	test -n "$interactive_rebase" || test -f "$merge_dir"/interactive |  | ||||||
| } | } | ||||||
|  |  | ||||||
| run_pre_rebase_hook () { | run_pre_rebase_hook () { | ||||||
|  | @ -211,8 +199,6 @@ run_pre_rebase_hook () { | ||||||
| test -f "$apply_dir"/applying && | test -f "$apply_dir"/applying && | ||||||
| 	die 'It looks like git-am is in progress. Cannot rebase.' | 	die 'It looks like git-am is in progress. Cannot rebase.' | ||||||
|  |  | ||||||
| is_interactive "$@" && exec git-rebase--interactive "$@" |  | ||||||
|  |  | ||||||
| if test -d "$apply_dir" | if test -d "$apply_dir" | ||||||
| then | then | ||||||
| 	type=am | 	type=am | ||||||
|  | @ -249,6 +235,19 @@ do | ||||||
| 		onto="$2" | 		onto="$2" | ||||||
| 		shift | 		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) | 	-M|-m|--m|--me|--mer|--merg|--merge) | ||||||
| 		do_merge=t | 		do_merge=t | ||||||
| 		;; | 		;; | ||||||
|  | @ -339,7 +338,11 @@ do | ||||||
| done | done | ||||||
| test $# -gt 2 && usage | 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 | case "$action" in | ||||||
| continue) | continue) | ||||||
|  | @ -415,6 +418,21 @@ fi | ||||||
|  |  | ||||||
| test $# -eq 0 && test -z "$rebase_root" && usage | 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." | require_clean_work_tree "rebase" "Please commit or stash them." | ||||||
|  |  | ||||||
| if test -z "$rebase_root" | if test -z "$rebase_root" | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Martin von Zweigbergk
						Martin von Zweigbergk