Re: [PATCH 10/12] t/lib-rebase: prepare for testing `git rebase --rebase-merges`
- From
brian m. carlson <sandals@crustytoothpaste.net>
- Date
- Jul 26, 2019, 21:08 UTC
- Message-ID
- <20190726210820.GF9319@genre.crustytoothpaste.net>
- In-Reply-To
- <nycvar.QRO.7.76.6.1907261555410.21907@tvgsbejvaqbjf.bet>
On 2019-07-26 at 14:01:03, Johannes Schindelin wrote:
> Actually, the part that uses it is not shown in the patch (one of the > many, many reasons why I try to discourage patch review and encourage > code review instead). The relevant section currently looks somewhat like > this:
I feel like I may have communicated poorly earlier, so let me retry asking this in a different way.
Show 23 quoted lines
> -- snip --
> set_fake_editor () {
> write_script fake-editor.sh <<-\EOF
> case "$1" in
> */COMMIT_EDITMSG)
> test -z "$EXPECT_HEADER_COUNT" ||
> test "$EXPECT_HEADER_COUNT" = "$(sed -n '1s/^# This is a combination of \(.*\) commits\./\1/p' < "$1")" ||
> test "# # GETTEXT POISON #" = "$(sed -n '1p' < "$1")" ||
> exit
> test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1"
> test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1"
> exit
> ;;
> esac
> test -z "$EXPECT_COUNT" ||
> test "$EXPECT_COUNT" = $(sed -e '/^#/d' -e '/^$/d' < "$1" | wc -l) ||
> exit
> test -z "$FAKE_LINES" && exit
> grep -v '^#' < "$1" > "$1".tmp
> rm -f "$1"
> echo 'rebase -i script before editing:'
> cat "$1".tmp
> action=pickI believe you changed this line to "action=\&".
Show 14 quoted lines
> for line in $FAKE_LINES; do > case $line in > pick|p|squash|s|fixup|f|edit|e|reword|r|drop|d) > action="$line";; > exec_*|x_*|break|b) > echo "$line" | sed 's/_/ /g' >> "$1";; > "#") > echo '# comment' >> "$1";; > ">") > echo >> "$1";; > bad) > action="badcmd";; > fakesha) > echo "$action XXXXXXX False commit" >> "$1"
And my question was about this line.
Show 30 quoted lines
> action=pick;;
> *)
> sed -n "${line}s/^pick/$action/p" < "$1".tmp >> "$1"
> action=pick;;
> esac
> done
> echo 'rebase -i script after editing:'
> cat "$1"
> EOF
>
> test_set_editor "$(pwd)/fake-editor.sh"
> }
> -- snap --
>
> Most importantly, `action` is used here:
>
> sed -n "${line}s/^pick/$action/p" < "$1".tmp >> "$1"
>
> and I changed it to
>
> sed -n "${line}s/^[a-z][a-z]*/$action/p" < "$1".tmp >> "$1"
>
> In other words, rather than expecting the lines that are used by the
> fake editor to start with `pick`, after this patch, the tests expect the
> todo lists to start with a command consisting of lower-case ASCII
> letters (which catches `pick`, of course, but also `label`, `reset` and
> `merge`).
>
> After this patch, the fake editor also does not try to replace whatever
> command it finds by `pick`, but it keeps it as-is instead.Right, that's how I read it, and that part I agree with. I think my question is this: in what case do we execute the "fakesha" case? Are we guaranteed that when we do, action isn't "&"? "&" seems fine for the right-hand side of a sed s-statement, but not as the beginning of a typical line in a sequencer file.
I ask because if we're testing a failure case, we want it to fail for the right reason (e.g., the commit doesn't exist), and not because we're producing invalid data. If the answer in this case is, "Well, we'll always have something else before it which will set $action properly," then that's fine. This is test code, so it need not be bulletproof, but I did want to ask.
If I'm still misunderstanding something, I apologize.
-- brian m. carlson: Houston, Texas, US OpenPGP: https://keybase.io/bk2204