version-controlmercurialbranchtortoisehgchangelog

How to get a changelog for a file on a particular branch in Mercurial


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.

Example

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?


Solution

  • 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