merge: store ACTION_KEEP_ABSENT when we are keeping the file absent locally
If a file is not present on the local side, and it's unchanged between other
merge parent and ancestor, we don't use any action, neither we had a if-else
branch for that condition. This leads to bid-merge missing that there is a
such action possible which can be performed.
As test changes demonstrate, we now choose the locally deleted side instead
of choosing the remote one consistently. This is also wrong behavior which is
resulted because of missing possible action. It will be fixed in next patch.
This whole logic is not acurrate as we should prompt user on what to do
when this kind of criss-cross merge is in play.
Differential Revision: https://phab.mercurial-scm.org/D8940
Create a repo and add some commits
$ hg init mm
$ cd mm
$ echo "Test content" > testfile1
$ hg add testfile1
$ hg commit -m "First commit" -u "Proper <commit@m.c>"
$ echo "Test content 2" > testfile2
$ hg add testfile2
$ hg commit -m "Second commit" -u "Commit Name 2 <commit2@m.c>"
$ echo "Test content 3" > testfile3
$ hg add testfile3
$ hg commit -m "Third commit" -u "Commit Name 3 <commit3@m.c>"
$ echo "Test content 4" > testfile4
$ hg add testfile4
$ hg commit -m "Fourth commit" -u "Commit Name 4 <commit4@m.c>"
Add a .mailmap file with each possible entry type plus comments
$ cat > .mailmap << EOF
> # Comment shouldn't break anything
> <proper@m.c> <commit@m.c> # Should update email only
> Proper Name 2 <commit2@m.c> # Should update name only
> Proper Name 3 <proper@m.c> <commit3@m.c> # Should update name, email due to email
> Proper Name 4 <proper@m.c> Commit Name 4 <commit4@m.c> # Should update name, email due to name, email
> EOF
$ hg add .mailmap
$ hg commit -m "Add mailmap file" -u "Testuser <test123@m.c>"
Output of commits should be normal without filter
$ hg log -T "{author}\n" -r "all()"
Proper <commit@m.c>
Commit Name 2 <commit2@m.c>
Commit Name 3 <commit3@m.c>
Commit Name 4 <commit4@m.c>
Testuser <test123@m.c>
Output of commits with filter shows their mailmap values
$ hg log -T "{mailmap(author)}\n" -r "all()"
Proper <proper@m.c>
Proper Name 2 <commit2@m.c>
Proper Name 3 <proper@m.c>
Proper Name 4 <proper@m.c>
Testuser <test123@m.c>
Add new mailmap entry for testuser
$ cat >> .mailmap << EOF
> <newmmentry@m.c> <test123@m.c>
> EOF
Output of commits with filter shows their updated mailmap values
$ hg log -T "{mailmap(author)}\n" -r "all()"
Proper <proper@m.c>
Proper Name 2 <commit2@m.c>
Proper Name 3 <proper@m.c>
Proper Name 4 <proper@m.c>
Testuser <newmmentry@m.c>
A commit with improperly formatted user field should not break the filter
$ echo "some more test content" > testfile1
$ hg commit -m "Commit with improper user field" -u "Improper user"
$ hg log -T "{mailmap(author)}\n" -r "all()"
Proper <proper@m.c>
Proper Name 2 <commit2@m.c>
Proper Name 3 <proper@m.c>
Proper Name 4 <proper@m.c>
Testuser <newmmentry@m.c>
Improper user
No TypeError beacause of invalid input
$ hg log -T '{mailmap(termwidth)}\n' -r0
80