On Wed, Nov 16, 2011 at 04:09:51PM -0800, Alexey Neyman wrote: > On Sunday, November 06, 2011 10:27:01 am Daniel Shahaf wrote: > > Perhaps the solution is to make 'svn diff' use --diff-cmd for propdiffs > > too? It seems that currently --diff-cmd is only used for file content > > diffs. > > I guess this is sort of a feature. As Julian pointed out, the property diffs > are output using a different hunk format that starts with ## instead of @@. > Thus invoking an external diff utility (which does not know whether it is > diffing, content or property) would actually make the problem worse. > > FWIW, I implemented the --patch option for 'svn diff' as suggested - implying > no property diffs and copies-as-additions. Patch against trunk, r1202879; > survives 'make check'.
I'd prefer keeping --no-diff-properties and add a --patch option later which implies --no-diff-properties and maybe other options. I'm not sure I like the name --patch. Maybe call it --patch-compatible or something? Can you send patches generated with 'svn diff -xp' please? Thanks. Some review of your current patch inline below. > [[[ > * subversion/svn/cl.h > * subversion/svn/main.c > New option, --patch for svn diff. > > * subversion/include/svn_client.h > (svn_client_diff6,svn_client_diff_peg6): New argument, ignore_prop_diff. > (svn_client_diff5,svn_client_diff_peg5): Update comments. > > * subversion/libsvn_client/deprecated.c > (svn_client_diff5,svn_client_diff_peg5): Pass FALSE as ignore_prop_diff. > > * subversion/libsvn_client/diff.c > (diff_cmd_baton): New field, ignore_prop_diff > (diff_props_changed): Do nothing if diff_cmd_baton->ignore_prop_diff is set. > (svn_client_diff6,svn_client_diff_peg6): Pass ignore_prop_diff downstream > via diff_cmd_baton. > > * subversion/svn/diff-cmd.c > (svn_cl__diff): Handle --patch: ignore property diff, force > --show-copies-as-adds. > > * subversion/svn/log-cmd.c > (log_entry_receiver): Request property changes from svn_client_diff6. > ]]] > Index: subversion/svn/cl.h > =================================================================== > --- subversion/svn/cl.h (revision 1202879) > +++ subversion/svn/cl.h (working copy) > @@ -229,6 +229,7 @@ > svn_boolean_t show_diff; /* produce diff output (maps to --diff) */ > svn_boolean_t internal_diff; /* override diff_cmd in config file */ > svn_boolean_t use_git_diff_format; /* Use git's extended diff format */ > + svn_boolean_t use_patch_diff_format; /* Output compatible with GNU patch */ > svn_boolean_t allow_mixed_rev; /* Allow operation on mixed-revision WC */ > svn_boolean_t include_externals; /* Recurses (in)to file & dir externals */ > } svn_cl__opt_state_t; > Index: subversion/svn/diff-cmd.c > =================================================================== > --- subversion/svn/diff-cmd.c (revision 1202879) > +++ subversion/svn/diff-cmd.c (working copy) > @@ -171,6 +171,9 @@ > const char *old_target, *new_target; > apr_pool_t *iterpool; > svn_boolean_t pegged_diff = FALSE; > + svn_boolean_t show_copies_as_adds = > + opt_state->use_patch_diff_format ? TRUE : opt_state->show_copies_as_adds; This above change would be part of a second patch to add the --patch-compatible option. > + svn_boolean_t ignore_prop_diff = opt_state->use_patch_diff_format; > int i; > const svn_client_diff_summarize_func_t summarize_func = > (opt_state->xml ? summarize_xml : summarize_regular); > @@ -361,8 +364,9 @@ > opt_state->depth, > ! opt_state->notice_ancestry, > opt_state->no_diff_deleted, > - opt_state->show_copies_as_adds, > + show_copies_as_adds, > opt_state->force, > + ignore_prop_diff, > opt_state->use_git_diff_format, > svn_cmdline_output_encoding(pool), > outstream, > @@ -406,8 +410,9 @@ > opt_state->depth, > ! opt_state->notice_ancestry, > opt_state->no_diff_deleted, > - opt_state->show_copies_as_adds, > + show_copies_as_adds, > opt_state->force, > + ignore_prop_diff, > opt_state->use_git_diff_format, > svn_cmdline_output_encoding(pool), > outstream, > Index: subversion/svn/log-cmd.c > =================================================================== > --- subversion/svn/log-cmd.c (revision 1202879) > +++ subversion/svn/log-cmd.c (working copy) > @@ -309,6 +309,7 @@ > TRUE, /* no diff deleted */ > FALSE, /* show copies as adds */ > FALSE, /* ignore content type */ > + FALSE, /* ignore prop diff */ > FALSE, /* use git diff format */ > svn_cmdline_output_encoding(pool), > outstream, > Index: subversion/svn/main.c > =================================================================== > --- subversion/svn/main.c (revision 1202879) > +++ subversion/svn/main.c (working copy) > @@ -124,6 +124,7 @@ > opt_diff, > opt_internal_diff, > opt_use_git_diff_format, > + opt_use_patch_diff_format, > opt_allow_mixed_revisions, > opt_include_externals, > } svn_cl__longopt_t; > @@ -341,6 +342,12 @@ > N_("override diff-cmd specified in config file")}, > {"git", opt_use_git_diff_format, 0, > N_("use git's extended diff format")}, > + {"patch", opt_use_patch_diff_format, 0, > + N_("generate diff suitable for GNU patch;\n" > + " " > + "implies show-copies-as-adds and ignores property\n" > + " " > + "differences")}, > {"allow-mixed-revisions", opt_allow_mixed_revisions, 0, > N_("Allow merge into mixed-revision working copy.\n" > " " > @@ -538,7 +545,7 @@ > {'r', 'c', opt_old_cmd, opt_new_cmd, 'N', opt_depth, opt_diff_cmd, > opt_internal_diff, 'x', opt_no_diff_deleted, opt_show_copies_as_adds, > opt_notice_ancestry, opt_summarize, opt_changelist, opt_force, opt_xml, > - opt_use_git_diff_format} }, > + opt_use_git_diff_format, opt_use_patch_diff_format} }, > { "export", svn_cl__export, {0}, N_ > ("Create an unversioned copy of a tree.\n" > "usage: 1. export [-r REV] URL[@PEGREV] [PATH]\n" > @@ -2046,6 +2053,9 @@ > case opt_internal_diff: > opt_state.internal_diff = TRUE; > break; > + case opt_use_patch_diff_format: > + opt_state.use_patch_diff_format = TRUE; > + break; > case opt_use_git_diff_format: > opt_state.use_git_diff_format = TRUE; > break; > Index: subversion/include/svn_client.h > =================================================================== > --- subversion/include/svn_client.h (revision 1202879) > +++ subversion/include/svn_client.h (working copy) > @@ -2877,6 +2877,7 @@ > svn_boolean_t no_diff_deleted, > svn_boolean_t show_copies_as_adds, > svn_boolean_t ignore_content_type, > + svn_boolean_t ignore_prop_diff, > svn_boolean_t use_git_diff_format, > const char *header_encoding, > svn_stream_t *outstream, > @@ -2886,7 +2887,8 @@ > apr_pool_t *pool); > > /** Similar to svn_client_diff6(), but with @a outfile and @a errfile, > - * instead of @a outstream and @a errstream. > + * instead of @a outstream and @a errstream, and always showing property > + * changes. > * > * @deprecated Provided for backward compatibility with the 1.7 API. > * @since New in 1.7. > @@ -3035,6 +3037,7 @@ > svn_boolean_t no_diff_deleted, > svn_boolean_t show_copies_as_adds, > svn_boolean_t ignore_content_type, > + svn_boolean_t ignore_prop_diff, We cannot add new arguments to already released, stable, APIs. You'll need to create a new version of svn_client_diff6 called svn_client_diff7 and re-implement svn_client_diff6 as a wrapper around svn_client_diff7 which passes FALSE for ignore_prop_diff. Rest looks good to me. Can you provide a follow-up patch? Thanks. > svn_boolean_t use_git_diff_format, > const char *header_encoding, > svn_stream_t *outstream, > @@ -3044,7 +3047,8 @@ > apr_pool_t *pool); > > /** Similar to svn_client_diff_peg6(), but with @a outfile and @a errfile, > - * instead of @a outstream and @a errstream. > + * instead of @a outstream and @a errstream, and always showing property > + * changes. > * > * @deprecated Provided for backward compatibility with the 1.7 API. > * @since New in 1.7. > Index: subversion/libsvn_client/deprecated.c > =================================================================== > --- subversion/libsvn_client/deprecated.c (revision 1202879) > +++ subversion/libsvn_client/deprecated.c (working copy) > @@ -864,7 +864,7 @@ > return svn_client_diff6(diff_options, path1, revision1, path2, > revision2, relative_to_dir, depth, > ignore_ancestry, no_diff_deleted, > - show_copies_as_adds, ignore_content_type, > + show_copies_as_adds, ignore_content_type, FALSE, > use_git_diff_format, header_encoding, > outstream, errstream, changelists, ctx, pool); > } > @@ -992,6 +992,7 @@ > no_diff_deleted, > show_copies_as_adds, > ignore_content_type, > + FALSE, > use_git_diff_format, > header_encoding, > outstream, > Index: subversion/libsvn_client/diff.c > =================================================================== > --- subversion/libsvn_client/diff.c (revision 1202879) > +++ subversion/libsvn_client/diff.c (working copy) > @@ -762,6 +762,9 @@ > relative to for output generation (see issue #2723). */ > const char *relative_to_dir; > > + /* Whether property differences are ignored. */ > + svn_boolean_t ignore_prop_diff; > + > /* Whether we're producing a git-style diff. */ > svn_boolean_t use_git_diff_format; > > @@ -802,6 +805,10 @@ > apr_array_header_t *props; > svn_boolean_t show_diff_header; > > + /* If property differences are ignored, there's nothing to do. */ > + if (diff_cmd_baton->ignore_prop_diff) > + return SVN_NO_ERROR; > + > SVN_ERR(svn_categorize_props(propchanges, NULL, NULL, &props, > scratch_pool)); > > @@ -2398,6 +2405,7 @@ > svn_boolean_t no_diff_deleted, > svn_boolean_t show_copies_as_adds, > svn_boolean_t ignore_content_type, > + svn_boolean_t ignore_prop_diff, > svn_boolean_t use_git_diff_format, > const char *header_encoding, > svn_stream_t *outstream, > @@ -2427,6 +2435,7 @@ > > diff_cmd_baton.force_empty = FALSE; > diff_cmd_baton.force_binary = ignore_content_type; > + diff_cmd_baton.ignore_prop_diff = ignore_prop_diff; > diff_cmd_baton.relative_to_dir = relative_to_dir; > diff_cmd_baton.use_git_diff_format = use_git_diff_format; > diff_cmd_baton.no_diff_deleted = no_diff_deleted; > @@ -2455,6 +2464,7 @@ > svn_boolean_t no_diff_deleted, > svn_boolean_t show_copies_as_adds, > svn_boolean_t ignore_content_type, > + svn_boolean_t ignore_prop_diff, > svn_boolean_t use_git_diff_format, > const char *header_encoding, > svn_stream_t *outstream, > @@ -2480,6 +2490,7 @@ > > diff_cmd_baton.force_empty = FALSE; > diff_cmd_baton.force_binary = ignore_content_type; > + diff_cmd_baton.ignore_prop_diff = ignore_prop_diff; > diff_cmd_baton.relative_to_dir = relative_to_dir; > diff_cmd_baton.use_git_diff_format = use_git_diff_format; > diff_cmd_baton.no_diff_deleted = no_diff_deleted;