mikeash.com: just this guy, you know?

Posted at 2005-07-06 00:00 | RSS feed (Full text feed) | Blog Index
Next article: Fun With Beowulf Clusters
Previous article: Dashboard Rant
Tags: filemerge python subversion versioncontrol
Using FileMerge with subversion
by Mike Ash  

I was introduced to subversion about a month and a half ago, and have generally found it to be wonderful, and a vast improvement over CVS. I won't get into the details, because I'll just sound like every other person out there who has switched to svn and then raved about it, so you can just look up somebody else's blog post on the subject. One thing I did miss, however, was the ability to open diffs in FileMerge.

Previously I got my FileMerge graphical diffs by using CVL, a GUI front-end to CVS, but I've been using svn on the command-line and am very happy with that, except for this one thing. I figured that this must be a common request, and that somebody has figured it out, so I went Googling. I turned up nothing good; a couple of gigantic scripts that didn't work on my computer, and nothing else.

So finally today, I decided to solve things once and for all, and came up with 20 lines of python that fixes it up very nicely. And now I'll share it with the world!

Put the following code into a file called svnopendiffshim.py that's somewhere in your $PATH:


from sys import argv
from os import execlp
import re

left = "";
right = "";


while argv:
    arg = argv.pop(0)
    if arg == "-u":
    elif arg == "-L":
    elif left == "":
        left = arg
        right = arg

execlp("opendiff", "opendiff", left, right)
Basically, this Python script just goes through the arguments that svn passes to its diff program, strips out everything that FileMerge doesn't understand, and passes the rest to opendiff, which is the command-line program which opens FileMerge.

Now, add one line to your .profile (if you're using a shell other than bash, you're on your own here):
alias svndiff='svn diff --diff-cmd svnopendiffshim.py'

Now open a new Terminal window, go into a project, and type svndiff somefile.h and, bang, your diff opens in FileMerge.

So there you have it. I hope somebody finds this as useful as I do.

Did you enjoy this article? I'm selling whole books full of them! Volumes II and III are now out! They're available as ePub, PDF, print, and on iBooks and Kindle. Click here for more information.


I tossed together a python script that does the same thing (based on Mike’s code, actually), but preserves the filename and version #s into the title bar of FileMerge. Not so simple and elegant as Mike’s solution.

Better yet, take the svnopendiffshim and:

$ chmod +x svnopendiffshiim
$ sudo cp svnopendiffshim /usr/bin
$ vi ~/.subversion/config


diff-cmd = svnopendiff

This much easier and does not require and difference in how you call svn diff nor will you need to mess with you enviroment settings.

$ svn diff

Thanks for the script.


I meant add:

diff-cmd = svnopendiffshiim

Or whatever you name the script you put in /usr/bin. On that note, you do not need the .py extension. Also you may want to make the header on your python script ”#!/usr/bin/env python”.
A more elaborate effort to integrate FileMerge with Subversion is available here:
This is a great simple hint. Unfortunately, it's painfully slow unless you change the last line to this:

os.spawnlp(os.P_NOWAIT, "opendiff", "opendiff", left, right)
This doesn't work for me on OS X, I get the following:

Index: css/debug.css
exec of 'svnopendiffshim.py' failed: No such file or directorysvn: 'svnopendiffshim.py' returned 255

Any thoughts?
Nevemind! I figured it out. Permissions on svnopendiffshim.py need to be 777.

Thanks anyways!
Searching this topic also brought me to this:


Same idea, but shell script based.

Comments RSS feed for this page

Add your thoughts, post a comment:

Spam and off-topic posts will be deleted without notice. Culprits may be publicly humiliated at my sole discretion.

Web site:
Formatting: <i> <b> <blockquote> <code>. URLs are automatically hyperlinked.
Code syntax highlighting thanks to Pygments.
Hosted at DigitalOcean.