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

Re: working out where git-rebase is up to?

From
Thomas Rast <trast@student.ethz.ch>
Date
Feb 22, 2010, 10:49 UTC
Message-ID
<201002221149.32504.trast@student.ethz.ch>
In-Reply-To
<201002221126.47372.trast@student.ethz.ch>
On Monday 22 February 2010 11:26:47 Thomas Rast wrote:
Show 11 quoted lines
> On Monday 22 February 2010 11:09:18 Jon Seymour wrote:
> > For my funky "compensating rebases" I need to know where an automated
> > rebase has stopped. In particular, I need to know the sha1 of the
> > commit that caused the rebase to stop.
> > 
> > No doubt rebase is tracking this info, but is there a supported way to
> > discover it?
> 
> It's in .git/rebase-merge/done (and .git/rebase-merge/git-rebase-todo
> for the remaining TODO file).  Maybe we should add a 'git rebase
> --whydiditstop' command ;-)

Here's a lightly tested draft patch. I should stop stealing work time for this, but you're welcome to fill in docs and tests and submit it.

diff --git i/git-rebase--interactive.sh w/git-rebase--interactive.sh
index 415ae72..d34c057 100755
--- i/git-rebase--interactive.sh
+++ w/git-rebase--interactive.sh
@@ -13,7 +13,7 @@
 OPTIONS_KEEPDASHDASH=
 OPTIONS_SPEC="\
 git-rebase [-i] [options] [--] <upstream> [<branch>]
-git-rebase [-i] (--continue | --abort | --skip)
+git-rebase [-i] (--continue | --abort | --skip | --status)
 --
  Available options are
 v,verbose          display a diffstat of what changed upstream
@@ -26,6 +26,7 @@ i,interactive      always used (no-op)
 continue           continue rebasing process
 abort              abort rebasing process and restore original branch
 skip               skip current patch and continue rebasing process
+status	           show where the rebasing process stopped
 no-verify          override pre-rebase hook from stopping the operation
 root               rebase all reachable commmits up to the root(s)
 autosquash         move commits that begin with squash!/fixup! under -i
@@ -103,6 +104,10 @@ AMEND="$DOTEST"/amend
 REWRITTEN_LIST="$DOTEST"/rewritten-list
 REWRITTEN_PENDING="$DOTEST"/rewritten-pending
 
+# This file holds the status message that we showed to the user when
+# stopping, so that it can be retrieved by 'git rebase --status'.
+STATUS="$DOTEST"/status
+
 PRESERVE_MERGES=
 STRATEGY=
 ONTO=
@@ -204,11 +209,16 @@ make_patch () {
 		get_author_ident_from_commit "$1" > "$AUTHOR_SCRIPT"
 }
 
+status_message () {
+	cat >> "$STATUS"
+	"$1" "$(cat "$STATUS")"
+}
+
 die_with_patch () {
 	echo "$1" > "$DOTEST"/stopped-sha
 	make_patch "$1"
 	git rerere
-	die "$2"
+	status_message die "$2"
 }
 
 die_abort () {
@@ -429,8 +439,10 @@ die_failed_squash() {
 	mv "$SQUASH_MSG" "$MSG" || exit
 	rm -f "$FIXUP_MSG"
 	cp "$MSG" "$GIT_DIR"/MERGE_MSG || exit
-	warn
-	warn "Could not apply $1... $2"
+	status_message warn <<EOF
+
+Could not apply $1... $2
+EOF
 	die_with_patch $1 ""
 }
 
@@ -455,7 +467,7 @@ record_in_rewritten() {
 }
 
 do_next () {
-	rm -f "$MSG" "$AUTHOR_SCRIPT" "$AMEND" || exit
+	rm -f "$MSG" "$AUTHOR_SCRIPT" "$AMEND" "$STATUS" || exit
 	read command sha1 rest < "$TODO"
 	case "$command" in
 	'#'*|''|noop)
@@ -487,15 +499,17 @@ do_next () {
 		echo "$1" > "$DOTEST"/stopped-sha
 		make_patch $sha1
 		git rev-parse --verify HEAD > "$AMEND"
-		warn "Stopped at $sha1... $rest"
-		warn "You can amend the commit now, with"
-		warn
-		warn "	git commit --amend"
-		warn
-		warn "Once you are satisfied with your changes, run"
-		warn
-		warn "	git rebase --continue"
-		warn
+		status_message warn <<EOF
+Stopped at $sha1... $rest
+You can amend the commit now, with
+
+	git commit --amend
+
+Once you are satisfied with your changes, run
+
+	git rebase --continue
+
+EOF
 		exit 0
 		;;
 	squash|s|fixup|f)
@@ -767,6 +781,24 @@ first and then run 'git rebase --continue' again."
 
 		output git reset --hard && do_rest
 		;;
+	--status)
+		is_standalone "$@" || usage
+		warn "Your rebase stopped at the following action:"
+		warn
+		warn "    $(tail -1 "$DOTEST"/done)"
+		warn
+		next="$(sed -n -e "/^#/d" -e '/^$/d' -e "/ /p" -e "q" < "$TODO")"
+		if test -n "$next"; then
+			warn "The next action will be:"
+			warn
+			warn "    $next"
+		else
+			warn "There are no more actions left after this one."
+		fi
+		warn
+		cat "$STATUS" >&2
+		exit
+		;;
 	-s)
 		case "$#,$1" in
 		*,*=*)
-- 
Thomas Rast
trast@{inf,student}.ethz.ch
Previous: Jon SeymourNext: Jon Seymour
Message 5 of 6 in “working out where git-rebase is up to?”
  1. Jon SeymourFeb 22, 2010
  2. Marc WeberFeb 22, 2010
  3. Thomas RastFeb 22, 2010
  4. Jon SeymourFeb 22, 2010
  5. Thomas RastFeb 22, 2010
  6. Jon SeymourFeb 22, 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.