One thing I’ve missed from Perforce since using Subversion is the “p4 annotate -a” command. This annotates a file with the revisions that introduced each line, much like the “svn blame” command. But the -a switch tells it to include every revision of every line. This is a way of getting the complete history of the file in one textual output. It’s great for finding a snippet that you suspect existed somewhere in the file’s past.

Blameall.py provides the same feature, but for Subversion.

For example, let’s say you have a file with a number of revisions. Revision 26:

Shopping List



- Milk

- Bread

- Eggs



Revision 27:

Shopping List



- Milk

- Juice



Revision 28:

Shopping List



- Juice

- Cereal

- Ice Cream



Running blameall shows the history of the file in one series of lines:

$ python blameall.py shoplist.txt

26 27 28

26 head Shopping List

26 head

26 27 - Milk

26 26 - Bread

27 head - Juice

26 26 - Eggs

28 head - Cereal

28 head - Ice Cream

26 head



This shows us that “Milk” appeared in revision 26 and was present through revision 27. “Shopping List” appeared in 26, and is still in the file in the head revision.

It can be slow to get all the revisions, but it’s faster than manually searching through old revisions for that piece you know was back there somewhere.

You can provide a -r argument to blameall to limit its attention to a particular range of revisions.

Getting it

Blameall is a single-file Python script, no need to install anything. Just download and run: