You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Ben Collins-Sussman <su...@collab.net> on 2002/04/15 22:21:02 UTC

svn diff cleanup

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

Re: svn diff cleanup

Posted by Karl Fogel <kf...@newton.ch.collab.net>.
Ben Collins-Sussman <su...@collab.net> writes:
> ------------------------------------------------------------
> 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.
> ------------------------------------------------------------

+1

I think the words "if the alternate syntax is used, " can be
eliminated in the usage message, but otherwise, this is a succinct
summary of a fairly complex feature.  Nice!

-K

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org