rebase --update-refs: avoid unintended ref deletion
commit44da9e08413ec6a579ce4238acf1937b333836fe
authorVictoria Dye <vdye@github.com>
Mon, 7 Nov 2022 17:47:52 +0000 (7 09:47 -0800)
committerTaylor Blau <me@ttaylorr.com>
Mon, 7 Nov 2022 19:16:45 +0000 (7 14:16 -0500)
tree0095cf082e93db1e597e008e4df5f5693e2d1d38
parent3b08839926fcc7cc48cf4c759737c1a71af430c1
rebase --update-refs: avoid unintended ref deletion

In b3b1a21d1a5 (sequencer: rewrite update-refs as user edits todo list,
2022-07-19), the 'todo_list_filter_update_refs()' step was added to handle
the removal of 'update-ref' lines from a 'rebase-todo'. Specifically, it
removes potential ref updates from the "update refs state" if a ref does not
have a corresponding 'update-ref' line.

However, because 'write_update_refs_state()' will not update the state if
the 'refs_to_oids' list was empty, removing *all* 'update-ref' lines will
result in the state remaining unchanged from how it was initialized (with
all refs' "after" OID being null). Then, when the ref update is applied, all
refs will be updated to null and consequently deleted.

To fix this, delete the 'update-refs' state file when 'refs_to_oids' is
empty. Additionally, add a tests covering "all update-ref lines removed"
cases.

Reported-by: herr.kaste <herr.kaste@gmail.com>
Helped-by: Phillip Wood <phillip.wood@dunelm.org.uk>
Helped-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Victoria Dye <vdye@github.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
sequencer.c
t/t3404-rebase-interactive.sh