Confirmed.
The dirstate file itself seems to have recorded this correctly (It shows that x was renamed to M, and that M with the old file id was deleted.
If you switch the removed file, it "works".
bzr init foo
cd foo
touch M x
bzr add
bzr commit -m 1
rm x
bzr rm x
bzr mv M x
bzr status
Will properly show M => x and x removed.
I think the problem is that _iter_changes is finding that x is renamed, and then looking up the record for M, and finding the deleted one, rather than the proper target.
And I *think* that is because the file-id "x-foobabrabou" is sorting after "M-aboeunthoeu", so whether we find the existing file, or the deleted one switches based on original filename (which effects file id).
Confirmed.
The dirstate file itself seems to have recorded this correctly (It shows that x was renamed to M, and that M with the old file id was deleted.
If you switch the removed file, it "works".
bzr init foo
cd foo
touch M x
bzr add
bzr commit -m 1
rm x
bzr rm x
bzr mv M x
bzr status
Will properly show M => x and x removed.
I think the problem is that _iter_changes is finding that x is renamed, and then looking up the record for M, and finding the deleted one, rather than the proper target.
And I *think* that is because the file-id "x-foobabrabou" is sorting after "M-aboeunthoeu", so whether we find the existing file, or the deleted one switches based on original filename (which effects file id).