git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH/RFC 13/20] rebase: factor out reference parsing

From
Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
Date
Nov 25, 2010, 19:57 UTC
Message-ID
<1290715083-16919-14-git-send-email-martin.von.zweigbergk@gmail.com>
In-Reply-To
<1290715083-16919-1-git-send-email-martin.von.zweigbergk@gmail.com>

Remove the parsing and validation of references (onto, upstream, branch) from git-rebase--interactive.sh and rely on the information exported from git-rebase.sh.

Signed-off-by: Martin von Zweigbergk <martin.von.zweigbergk@gmail.com>
---
 git-rebase--interactive.sh |   59 +++++++------------------------------------
 git-rebase.sh              |   12 +++++---
 2 files changed, 17 insertions(+), 54 deletions(-)
diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
index f07472a..fe56d98 100755
--- a/git-rebase--interactive.sh
+++ b/git-rebase--interactive.sh
@@ -682,25 +682,6 @@ rearrange_squash () {
 	rm -f "$1.sq" "$1.rearranged"
 }
 
-LF='
-'
-parse_onto () {
-	case "$1" in
-	*...*)
-		if	left=${1%...*} right=${1#*...} &&
-			onto=$(git merge-base --all ${left:-HEAD} ${right:-HEAD})
-		then
-			case "$onto" in
-			?*"$LF"?* | '')
-				exit 1 ;;
-			esac
-			echo "$onto"
-			exit 0
-		fi
-	esac
-	git rev-parse --verify "$1^0"
-}
-
 case "$action" in
 continue)
 	get_saved_options
@@ -769,48 +750,28 @@ skip)
 	;;
 esac
 
-if test -n "$onto"
-then
-	onto=$(parse_onto "$onto") || die "Does not point to a valid commit: $1"
-fi
 test -n "$strategy" && strategy="-s $strategy"
 
-test -z "$rebase_root" -a $# -ge 1 -a $# -le 2 ||
-test ! -z "$rebase_root" -a $# -le 1 || usage
-
 git var GIT_COMMITTER_IDENT >/dev/null ||
 	die "You need to set your committer info first"
 
-if test -z "$rebase_root"
-then
-	UPSTREAM_ARG="$1"
-	UPSTREAM=$(git rev-parse --verify "$1") || die "Invalid base"
-	test -z "$onto" && onto=$UPSTREAM
-	shift
-else
-	UPSTREAM=
-	UPSTREAM_ARG=--root
-	test -z "$onto" &&
-		die "You must specify --onto when using --root"
-fi
 require_clean_work_tree "rebase" "Please commit or stash them."
 
-run_pre_rebase_hook "$UPSTREAM_ARG" "$@"
+run_pre_rebase_hook "$upstream_arg" "$@"
 
 comment_for_reflog start
 
-if test ! -z "$1"
+if test ! -z "$switch_to"
 then
-	output git checkout "$1" ||
-		die "Could not checkout $1"
+	output git checkout "$switch_to" ||
+		die "Could not checkout $switch_to"
 fi
 
 HEAD=$(git rev-parse --verify HEAD) || die "No HEAD?"
 mkdir "$DOTEST" || die "Could not create temporary $DOTEST"
 
 : > "$DOTEST"/interactive || die "Could not mark as interactive"
-git symbolic-ref HEAD > "$DOTEST"/head-name 2> /dev/null ||
-	echo "detached HEAD" > "$DOTEST"/head-name
+echo "$head_name" > "$DOTEST"/head-name
 
 echo $HEAD > "$DOTEST"/head
 case "$rebase_root" in
@@ -827,7 +788,7 @@ then
 	if test -z "$rebase_root"
 	then
 		mkdir "$REWRITTEN" &&
-		for c in $(git merge-base --all $HEAD $UPSTREAM)
+		for c in $(git merge-base --all $HEAD $upstream)
 		do
 			echo $onto > "$REWRITTEN"/$c ||
 				die "Could not init rewritten commits"
@@ -841,7 +802,7 @@ then
 	# parents to rewrite and skipping dropped commits would
 	# prematurely end our probe
 	MERGES_OPTION=
-	first_after_upstream="$(git rev-list --reverse --first-parent $UPSTREAM..$HEAD | head -n 1)"
+	first_after_upstream="$(git rev-list --reverse --first-parent $upstream..$HEAD | head -n 1)"
 else
 	MERGES_OPTION="--no-merges --cherry-pick"
 fi
@@ -849,10 +810,10 @@ fi
 SHORTHEAD=$(git rev-parse --short $HEAD)
 SHORTONTO=$(git rev-parse --short $onto)
 if test -z "$rebase_root"
-	# this is now equivalent to ! -z "$UPSTREAM"
+	# this is now equivalent to ! -z "$upstream"
 then
-	SHORTUPSTREAM=$(git rev-parse --short $UPSTREAM)
-	REVISIONS=$UPSTREAM...$HEAD
+	SHORTUPSTREAM=$(git rev-parse --short $upstream)
+	REVISIONS=$upstream...$HEAD
 	SHORTREVISIONS=$SHORTUPSTREAM..$SHORTHEAD
 else
 	REVISIONS=$onto...$HEAD
diff --git a/git-rebase.sh b/git-rebase.sh
index 5b0b73a..17b5042 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -180,7 +180,8 @@ run_interactive_rebase () {
 		export GIT_EDITOR
 	fi
 	export onto autosquash strategy strategy_opts verbose rebase_root \
-	force_rebase action preserve_merges OK_TO_SKIP_PRE_REBASE
+	force_rebase action preserve_merges OK_TO_SKIP_PRE_REBASE upstream \
+	upstream_arg switch_to head_name
 	exec git-rebase--interactive "$@"
 }
 
@@ -415,8 +416,6 @@ abort)
 	;;
 esac
 
-test -n "$interactive_rebase" && run_interactive_rebase "$@"
-
 if test -z "$rebase_root"
 then
 	# The upstream head must be given.  Make sure it is valid.
@@ -427,7 +426,7 @@ then
 	unset root_flag
 	upstream_arg="$upstream_name"
 else
-	test -z "$onto" && die "--root must be used with --onto"
+	test -z "$onto" && die "You must specify --onto when using --root"
 	unset upstream_name
 	unset upstream
 	root_flag="--root"
@@ -454,7 +453,8 @@ case "$onto_name" in
 	fi
 	;;
 *)
-	onto=$(git rev-parse --verify "${onto_name}^0") || exit
+	onto=$(git rev-parse --verify "${onto_name}^0") ||
+	die "Does not point to a valid commit: $1"
 	;;
 esac
 
@@ -495,6 +495,8 @@ case "$#" in
 esac
 orig_head=$branch
 
+test -n "$interactive_rebase" && run_interactive_rebase "$@"
+
 require_clean_work_tree "rebase" "Please commit or stash them."
 
 # Now we are rebasing commits $upstream..$branch (or with --root,
-- 
1.7.3.2.864.gbbb96
Previous: Martin von ZweigbergkNext: Martin von Zweigbergk
Message 18 of 29 in “Refactor rebase”
  1. 00/20 Refactor rebaseMartin von Zweigbergk, Nov 25, 2010
  2. 01/20 rebase: clearer names for directory variablesMartin von Zweigbergk, Nov 25, 2010
  3. 02/20 rebase: refactor reading of stateMartin von Zweigbergk, Nov 25, 2010
  4. 03/20 rebase: read state outside loopMartin von Zweigbergk, Nov 25, 2010
  5. 04/20 rebase: remove unused rebase state 'prev_head'Martin von Zweigbergk, Nov 25, 2010
  6. Michael J GruberNov 26, 2010
  7. Martin von ZweigbergkNov 26, 2010
  8. Junio C HamanoNov 29, 2010
  9. Michael J GruberNov 30, 2010
  10. 05/20 rebase: act on command line outside parsing loopMartin von Zweigbergk, Nov 25, 2010
  11. 06/20 rebase: collect check for existing rebaseMartin von Zweigbergk, Nov 25, 2010
  12. 07/20 rebase: stricter check on argumentsMartin von Zweigbergk, Nov 25, 2010
  13. 08/20 rebase: align variable namesMartin von Zweigbergk, Nov 25, 2010
  14. 09/20 rebase: align variable contentMartin von Zweigbergk, Nov 25, 2010
  15. 10/20 rebase: factor out command line option processingMartin von Zweigbergk, Nov 25, 2010
  16. 11/20 rebase -i: remove now unnecessary directory checksMartin von Zweigbergk, Nov 25, 2010
  17. 12/20 rebase: reorder validation stepsMartin von Zweigbergk, Nov 25, 2010
  18. 13/20 rebase: factor out reference parsingMartin von Zweigbergk, Nov 25, 2010
  19. 14/20 rebase: factor out clean work tree checkMartin von Zweigbergk, Nov 25, 2010
  20. 15/20 rebase: factor out call to pre-rebase hookMartin von Zweigbergk, Nov 25, 2010
  21. 16/20 rebase -i: support --statMartin von Zweigbergk, Nov 25, 2010
  22. 17/20 rebase: improve detection of rebase in progressMartin von Zweigbergk, Nov 25, 2010
  23. 18/20 rebase -m: extract code to new source fileMartin von Zweigbergk, Nov 25, 2010
  24. 19/20 rebase: extract am code to new source fileMartin von Zweigbergk, Nov 25, 2010
  25. 20/20 rebase: show consistent conflict resolution hintMartin von Zweigbergk, Nov 25, 2010
  26. Martin von ZweigbergkNov 25, 2010
  27. Sverre RabbelierNov 26, 2010
  28. Martin von ZweigbergkNov 26, 2010
  29. Sverre RabbelierNov 27, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.