I've used winmerge for years which I am mainly happy with. My one issue with it, and other diff tools I've tried (diffuse, Meld, Beyond Compare) is when code is changed in a small way and indented, it thinks the whole block changed entirely. Contrived code example:
def func(obj): def func(objs): for obj in objs: x, y, z = obj.getPos() ==> x, y, z = obj.getPos() l = calcLen(x, y, z) l = calcLen(x, y, z)
What I want is to see that the 's' got added to
for obj in objs: was added and that the code below was indented. Instead, every tool I've used ends up comparing
x, y, z = obj.getPos() to
for obj in objs:. Sometimes the (now indented) block has small changes, and that is the point, I want to see them as the small changes they are instead as false positive big changes.
It is possible that something I've mentioned does this but I haven't figured out where that setting is.
Right now what I do is edit the diff to unindent the code, often deleting the added code that caused the indent to get it to actually isolate my real changes. It's a really cumbersome process and error prone since I have to copy snippets out to the real file instead of leverage the diff tool.