I can get the history of a file, which shows me every commit that changed that file.
I can also get a history of a particular branch and have it show me every single file change for every commit under that branch.
I want to combine both. I want every commit that is both 1) in a particular branch and 2) has had a particular file change since the previous commit.
If I have a messy repo like this:
O main (merge release_7.2)
|\
| O release_7.2 (merge ticket_16)
| |\
| O \ release_7.2 (merge ticket_15)
| |\ \
| O | \ release_7.2 (version.txt)
| | | |
| | O | ticket_15 (file_A)
| | O / ticket_15 (file_A, file_B)
| |/ /
| | O ticket_16 (file_C)
| |/
| O release_7.1 (version.txt)
|/
O main (merge ticket_14)
|\
| O ticket_14 (merge main)
|/|
O | main (merge ticket_13)
|\ \
| O \ ticket_13 (file_A)
| O | ticket_13 (file_A)
| | |
| | O ticket_14 (file_C, file_D)
| | |
| O / ticket_13 (file_A)
|/ /
| /
|/
| O release_6.1 (version.txt)
|/
O main (merge ticket_12)
|\
| O ticket_12 (file_B)
|/
O main (merge ticket_11)
|\
| O ticket_11 (file_D)
| O ticket_11 (file_A, file_D)
| O ticket_11 (file_D)
| O ticket_11 (file_A, +file_D)
|/
O main (merge release_5.3)
|\
| O release_5.3 (version.txt)
| O release_5.2 (merge ticket_10)
| O release_5.2 (version.txt)
| O release_5.1 (version.txt)
|/
O main (merge ticket_9)
|\
| O ticket_9 (file_A, file_C)
| O ticket_9 (merge ticket_8)
| |\
| O \ ticket_9 (file_A, file_C)
|/ |
O | main (merge ticket_9)
|\ |
| O / ticket_7 (file_B)
|/ /
| O ticket_8 (file_A)
| O ticket_8 (file_A)
| O ticket_8 (file_A)
| O ticket_8 (file_A)
|/
| X ticket_6 (close)
| O ticket_6 (file_A, file_B, file_C)
| O ticket_6 (file_A, file_B, file_C)
|/
| O release_4.1 (version.txt)
|/
O main (+version.txt, -other_files/version.txt)
|
O main (file_A, file_B, file_C)
|
O main (merge moving_everything)
|\
| O moving_everything (+file_A, +file_B, +file_C, -main_code/file_A, -main_code/file_B, -main_code/file_C)
|/
O main (merge ticket_5)
I can get the history of file_B:
O ticket_15 (file_B)
|
O ticket_12 (file_B)
|
O ticket_7 (file_B)
|
| O ticket_6 (file_B)
| O ticket_6 (file_B)
|/
O moving_everything (+file_B)
And I can filter by branch main:
O main (merge release_7.2)
|
O main (merge ticket_14)
|
O main (merge ticket_13)
|
O main (merge ticket_12)
|
O main (merge ticket_11)
|
O main (merge release_5.3)
|
O main (merge ticket_9)
|
O main (merge ticket_9)
|
O main (+version.txt, -other_files/version.txt)
|
O main (file_A, file_B, file_C)
|
O main (merge moving_everything)
|
O main (merge ticket_5)
And I can do both:
O main (file_A, file_B, file_C)
But what I want is:
O main (merge release_7.2)
|\
| O ticket_15 (file_A, file_B)
|/
O main (merge ticket_12)
|\
| O ticket_12 (file_B)
|/
O main (merge ticket_9)
|\
| O ticket_7 (file_B)
|/
O main (merge moving_everything)
|\
| O moving_everything (+file_A, +file_B, +file_C, -main_code/file_A, -main_code/file_B, -main_code/file_C)
|/
O main (merge ticket_5)
Or even better:
O main (merge release_7.2) (file_B)
|
O main (merge ticket_12) (file_B)
|
O main (merge ticket_9) (file_B)
|
O main (file_B)
|
O main (merge moving_everything) (+file_B)
Which, importantly, doesn't have any of the scrapped changes from branch ticket_6.
Is this possible, or am I going to have to do this manually and dump the log of branch main and search or grep for all changes to file_B?
Based on this answer to a similar question, what I'm after doesn't seem to be possible: https://stackoverflow.com/questions/1919130/mercurial-how-can-i-see-only-the-changes-introduced-by-a-merge