Skip to content

Commit

Permalink
git-rebase--interactive.sh: rework skip_unnecessary_picks
Browse files Browse the repository at this point in the history
Commit cd035b1 introduced the exec command to interactive rebase.  In
doing so, it modified the way that skip_unnecessary_picks iterates through
the list of rebase commands so that it avoided collapsing multiple spaces
into a single space.  This is necessary for example if the argument to the
exec command contains a path with multiple spaces in it.

The way it did this was by reading each line of rebase commands into a
single variable, and then breaking the individual components out using
echo, sed, and cut.  It used the individual broken-out components for
decision making, and was still able to write the original line to the
output file from the variable it had saved it in.  But, since we only
really need to look at anything other than the first element of the line
when a 'pick' command is encountered, and even that is only necessary when
we are still searching for "unnecessary" picks, and since newer rebase
commands like 'exec' may not even require a sha1 field, let's make our read
statement parse its input into a "command" variable, and a "rest" variable,
and then only break out the sha1 from $rest, and call git-rev-parse, when
absolutely necessary.

I think this future proofs this subroutine, avoids calling git-rev-parse
unnecessarily, and possibly with bogus arguments, and still accomplishes
the goal of not mangling the $rest of the rebase command.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Brandon Casey authored and Junio C Hamano committed Aug 13, 2010
1 parent 2caf20c commit 2d6ca6e
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions git-rebase--interactive.sh
Original file line number Diff line number Diff line change
Expand Up @@ -619,25 +619,30 @@ do_rest () {
# skip picking commits whose parents are unchanged
skip_unnecessary_picks () {
fd=3
while read -r line
while read -r command rest
do
command=$(echo "$line" | sed 's/ */ /' | cut -d ' ' -f 1)
sha1=$(echo "$line" | sed 's/ */ /' | cut -d ' ' -f 2)
rest=$(echo "$line" | sed 's/ */ /' | cut -d ' ' -f 3-)
# fd=3 means we skip the command
case "$fd,$command,$(git rev-parse --verify --quiet "$sha1"^)" in
3,pick,"$ONTO"*|3,p,"$ONTO"*)
case "$fd,$command" in
3,pick|3,p)
# pick a commit whose parent is current $ONTO -> skip
ONTO=$sha1
sha1=$(echo "$rest" | cut -d ' ' -f 1)
case "$(git rev-parse --verify --quiet "$sha1"^)" in
"$ONTO"*)
ONTO=$sha1
;;
*)
fd=1
;;
esac
;;
3,#*|3,,*)
3,#*|3,)
# copy comments
;;
*)
fd=1
;;
esac
echo "$line" >&$fd
echo "$command${rest:+ }$rest" >&$fd
done <"$TODO" >"$TODO.new" 3>>"$DONE" &&
mv -f "$TODO".new "$TODO" &&
case "$(peek_next_command)" in
Expand Down

0 comments on commit 2d6ca6e

Please sign in to comment.