OK, so maybe I misunderstood the 'svn diff' problem. This morning I
pronounced (with great hubris) that I could make 'svn diff' compare
two arbitrary URLs in just half an hour's work. After all, 'svn
merge' does so, and the two functions share a whole lot of code.
Indeed, making 'svn diff' call RA->do_switch (which uses 2 URLs)
instead of RA->do_update, was a trivial thing. But then I discovered
the tangled morass all of code leading *up* to that call. It's really
complicated and full of outdated assumptions. :-)
Karl giggled at me, and I made the analogy: 'svn merge' is a very
clean, simple thing, because it's not used very often. Much like rare
verbs in a spoken language -- they're easy to conjugate. But 'svn
diff' is full of shortcuts and complex use-cases. It's like an
irregular verb, because it's used so often. People need the shortcuts.
After diddling on the whiteboard for a while, I think we came up with
a clear, unambiguous syntax. Here's the interface description that
would be printed by 'svn help diff':
------------------------------------------------------------
diff (di): display the differences between two paths.
usage: 1. svn diff [-r N[:M]] [PATH1 [PATH2 [PATH3 ...]]]
2. svn diff URL1[@N] URL2[@M]
1. each PATH can be either a working-copy path or URL.
If no PATHs are specified, a value of '.' is assumed.
+ if PATH is a URL, then revisions N and M must be specified via -r.
+ if PATH is a working-copy path, then -r switch has these effects:
-r N:M : server compares revisions N and M of PATH,
-r N : client compares revision N of PATH against working copy
(no -r) : client compares base and working copies of PATH
2. if the alternate syntax is used, the server compares URL1 and URL2
at revisions N and M respectively. If either N or M are ommitted, a
value of HEAD is assumed.
------------------------------------------------------------
I thought I'd throw this out for people to oggle. I'm pretty sure
that it covers all the many use-cases:
svn diff
svn diff foo.c
svn diff -r N foo.c bar.c baz.h
svn diff -r N:M foo.c bar.c http://blah qux.h
svn diff http://bloo@N http://glorb@M
The interface to svn_client_diff(), of course, is going to remain
squeaky-clean and simple: it will continue to take two paths and two
revisions. All of the complex commandline-parsing logic will go into
clients/cmdline/diff-cmd.c, as that seems like the appropriate place.
Anyway, that's what I'm doing. Running head-first with a
vaccuum-cleaner into the code.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Tue Apr 16 00:23:19 2002