Alexey Neyman wrote:
> [Cross-posting to dev@ for patch review]
> I noticed a weird behavior of 'svn diff --old=... --new=...' where
> reversing the old/new targets does not produce the reverse diff, as
> one would expect.

Hi Alexey.  Thanks for the report.  As you pointed out, I changed something in 
this area recently, so I'll take a closer look and fix it.  I haven't done so 
yet but should get to it in the next day or two.

[...]
> The reason for this behavior is that the code in diff-cmd.c makes the
> following defaults for the old/new revisions:
> 
> if (opt_state->start_revision.kind == svn_opt_revision_unspecified)
>   opt_state->start_revision.kind = svn_path_is_url(old_target)
>     ? svn_opt_revision_head : svn_opt_revision_base;
> 
> if (opt_state->end_revision.kind == svn_opt_revision_unspecified)
>   opt_state->end_revision.kind = svn_path_is_url(new_target)
>     ? svn_opt_revision_head : svn_opt_revision_working;
> 
> These defaults make some sense, if the new target is not specified (it
> defaults to old target in that case). If the new target is specified,
> and is different from from old target, I am not so sure if it makes
> sense. Note that there is a special case if both old/new targets are
> WC paths - in that case, both old and new targets default to
> svn_opt_revision_working. So,
> 
> $ svn diff --old=foo --new=bar
> 
> will compare MODIFIED version of 'foo' against modified version of
> 'bar' [*], but
> 
> $ svn diff --old=foo --new=^/bar
> 
> would compare BASE version of 'foo' against head version of 'bar.
> Does it make sense? I would say, if both old and new are specified,
> old target's revision should default to 'working' as well.
> 
> Problem is further aggravated since there is no commandline alias
> to request svn_opt_revision_working setting from the command line:
> only 'head', 'prev', 'base' and 'committed' are currently available.
> Hence, it is not possible to request the exact opposite of the patch
> using -rN:M syntax if one of the --old/--new targets is a working
> copy path. Is there a reason why 'working' is not parsed by
> revision_from_word()?
> 
> Also note that 'svn help diff' does not describe revision defaults
> for synopsis 2 (and the default is different from synopsis 1, which
> requires old revision to be specified for URLs).
> 
> PS. Stephan apparently made 'working' revision as default in his
> check-in (r1442640) at least for the short-hand form, but Julian
> Foad, "optimizing the logic" in r1442659 and r1442676, switched it
> back to be the same as --old/--new logic.

Oops, I didn't notice I was changing the logic.  As my log message said, I 
thought I was just simplifying it.

> PPS. If agreed to suggested change of default, the patch is attached.
> 
> [[[
> Make svn diff --old=.. --new=.. default to WORKING revision for old target
> if new target is explicitly specified.

A log message should always indicate *why* the change was made.

> 
> * subversion/svn/diff-cmd.c
> (svn_cl__diff) Change defaults as described and simplify the logic.
> ]]]

- Julian

Reply via email to