[BUG?] 'git rebase --update-refs --whitespace=fix' incompatible, but not enforced
- From
Philippe Blain <levraiphilippeblain@gmail.com>
- Date
- Jan 17, 2023, 22:02 UTC
- Message-ID
- <b322c536-5a75-bb0c-8eac-1a99d3ba3230@gmail.com>
Hi Elijah and Stolee,
First, Stolee, thanks a lot for adding '--update-refs', it is very useful (I've added it to my config so I don't forget to use it).
I recently learned that 'git rebase --whitespace=fix' exists, which is also great but since it uses the apply backend, it can't be used with --update-refs. I understand this, and the fact that adding '--whitespace=fix' to the merge backend would be a big task; this is not what this email is about.
I think there is a bug in that the code does not enforce the fact that both options can't be used together. Whenever '--whitespace' or '-C' are used, the code defaults to the apply backend:
```builtin/rebase +1502
if (options.git_am_opts.nr || options.type == REBASE_APPLY) {
/* all am options except -q are compatible only with --apply */
for (i = options.git_am_opts.nr - 1; i >= 0; i--)
if (strcmp(options.git_am_opts.v[i], "-q"))
break; if (i >= 0) {
if (is_merge(&options))
die(_("apply options and merge options "
"cannot be used together"));
else
options.type = REBASE_APPLY;
}
```but 'is_merge' only checks if 'opts->type == REBASE_MERGE', so the check only works if --merge was given explicitely, but not when none of '--merge' or '--apply' were given (and so the default "merge" backend is used).
I would have expected the code to die telling me --update-refs and --whitespace are incompatible. But instead it defaulted to --apply, and (of course) did not update the refs in my history (which I found out later).
Thanks,
Philippe.