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

Re: [RFC] rebase: Handle cases where format-patch fails

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 8, 2012, 22:38 UTC
Message-ID
<7vtxu4io7o.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1349724988-14625-2-git-send-email-andrew.kw.w@gmail.com>
Andrew Wong <andrew.kw.w@gmail.com> writes:
Show 32 quoted lines
> 'format-patch' could fail due to reasons such as out of memory. Such
> failures are not detected or handled, which causes rebase to incorrectly
> think that it completed successfully and continue with cleanup. i.e.
> calling move_to_original_branch
>
> Instead of using a pipe, we separate 'format-patch' and 'am' by using an
> intermediate file. This gurantees that we can invoke 'am' with the
> complete input, or not invoking 'am' at all if 'format-patch' failed.
>
> Also print messages to help user with how to recover from such failures.
>
> Signed-off-by: Andrew Wong <andrew.kw.w@gmail.com>
> ---
>  git-rebase--am.sh | 28 +++++++++++++++++++++++++---
>  1 file changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/git-rebase--am.sh b/git-rebase--am.sh
> index 392ebc9..a955b38 100644
> --- a/git-rebase--am.sh
> +++ b/git-rebase--am.sh
> @@ -26,10 +26,32 @@ then
>  	# makes this easy
>  	git cherry-pick --allow-empty "$revisions"
>  else
> -	git format-patch -k --stdout --full-index --ignore-if-in-upstream \
> +	rm -f "$GIT_DIR/format-patch"
> +	if ! git format-patch -k --stdout --full-index --ignore-if-in-upstream \
>  		--src-prefix=a/ --dst-prefix=b/ \
> -		--no-renames $root_flag "$revisions" |
> -	git am $git_am_opt --rebasing --resolvemsg="$resolvemsg"
> +		--no-renames $root_flag "$revisions" > "$GIT_DIR/format-patch" && ret=$?
> +	then
Is it just me?  I find this construct
	if ! cmd && ret=$?
        then
very hard to wrap my mind around.  Why not
	git format-patch ... just as before ... \
          ... >"$GIT_DIR/formatted-patches" || {
		# error handling or advices come here...
                rm -f "$GIT_DIR/formatted-patches"
		exit 1
	}
	git am ... just as before ... "$GIT_DIR/formatted-patches" || {
		# possibly another error handling or advices come here...
		rm -f "$GIT_DIR/formatted-patches"
		exit 1
	}
without changing anything else?
Show 14 quoted lines
> +		rm "$GIT_DIR/format-patch"
> +		echo
> +		echo "'git format-patch' seems to have failed."
> +		echo "It is impossible to continue or abort rebasing."
> +		echo "You have to use the following to return to your original head:"
> +		echo
> +		case "$head_name" in
> +		refs/*)
> +			echo "    git checkout $head_name"
> +			;;
> +		*)
> +			echo "    git checkout $orig_head"
> +			;;
> +		esac

You _know_ format-patch failed, not just "seems to have", at this point, no? Why is it impossible to abort?

What have we done before reaching to this point? We know we are doing the basic "git rebase", without any funny "-m/-i/-p" business, so the only thing we have done are (1) detached HEAD at the new onto, (2) set ORIG_HEAD to point at the original tip of the branch being rebased (or the commit we were sitting at, if we are rebasing a detached history), and (3) head_name has the refname of the original branch (or detached HEAD) and branch_name has the name of the branch (or HEAD).

Shouldn't we be just rewinding what we have done so far and error the whole thing out instead? Perhaps the first "# error handling or advises come here..." part may simply be

	case "$head_name" in
	refs/heads/*)
		git checkout "$head_name"
                ;;
	*)
		git checkout "$orig_head"
                ;;
	esac
	cat >&2 <<-\EOF
	Error was found while preparing the patches ($revisions) to
        replay on the rewound head. You cannot rebase this history.
        EOF

or something like that. The format-patch output (and its error) may be of interest in getting help going forward.

Previous: Andrew WongNext: Andrew Wong
Message 13 of 17 in “Rebase doesn't restore branch pointer back on out of memory”
  1. Alexander KostikovOct 3, 2012
  2. Andrew WongOct 3, 2012
  3. Andrew WongOct 4, 2012
  4. Alexander KostikovOct 4, 2012
  5. Alexander KostikovOct 4, 2012
  6. Andrew WongOct 4, 2012
  7. Alexander KostikovOct 4, 2012
  8. Andrew WongOct 5, 2012
  9. [RFC] rebase: Handle cases where format-patch failsAndrew Wong, Oct 5, 2012
  10. Junio C HamanoOct 5, 2012
  11. Andrew WongOct 8, 2012
  12. [RFC] rebase: Handle cases where format-patch failsAndrew Wong, Oct 8, 2012
  13. Junio C HamanoOct 8, 2012
  14. Andrew WongOct 11, 2012
  15. rebase: Handle cases where format-patch failsAndrew Wong, Oct 11, 2012
  16. Alexander KostikovOct 19, 2012
  17. Junio C HamanoOct 19, 2012

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.