Re: [PATCH] rebase -i: avoid 'git reset' when possible
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
Show 28 quoted lines
> diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh
> index 3dc659d..a9617a2 100755
> --- a/git-rebase--interactive.sh
> +++ b/git-rebase--interactive.sh
> @@ -442,6 +442,27 @@ do_rest () {
> done
> }
>
> +# skip picking commits whose parents are unchanged
> +skip_unnecessary_picks () {
> + current=$ONTO
> + i=0
> + while read command sha1 rest
> + do
> + test pick = "$command" &&
> + test $current = "$(git rev-parse $sha1^)" ||
> + break
> + current=$(git rev-parse $sha1)
> + i=$(($i+1))
> + done < "$TODO"
> + test $i = 0 || {
> + sed -e "${i}q" < "$TODO" >> "$DONE" &&
> + sed -e "1,${i}d" < "$TODO" >> "$TODO".new &&
> + mv -f "$TODO".new "$TODO" &&
> + ONTO=$current ||
> + die "Could not skip $i pick commands"
> + }
> +}I do not think you have to count and then run two sed.
this=$ONTO
skip_pick=t
while read command sha1 rest
do
sha1=$(git rev-parse "$sha1")
case "$skip_pick,$command" in
t,pick | t,p)
if test "$this" = "$sha1"
then
echo >&3 "$command $sha1 $rest"
this="$sha1"
continue
fi
esac
skip_pick=f
echo "$command $sha1 $rest"
done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
...