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'.
[[[
* 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.
]]]
Best regards,
Alexey.
>
> C. Michael Pilato wrote on Thu, Nov 03, 2011 at 15:16:23 -0400:
> > The introduction of the --git option to 'svn diff' opens the door for
> > different "flavors" for 'svn diff' output. Would you be interested in a
> > new 'svn diff --patch' flavor, which generates only diff output that's
> > suitable for consumption with GNU patch? Implied by --patch would be no
> > property diff output and the display of copied items as additions (like
> > --show-copies-as-adds does).
> >
> > Of course, --no-property-diff works for me, too. :-)
> >
> > On 11/03/2011 03:05 PM, Alexey Neyman wrote:
> > > Hi all,
> > >
> > > Sorry for a long delay :) 5 years ago, I sent a patch to the mailing
> > > list that
> > >
> > > would allow to specify what to include/exclude from the diff output:
> > > http://subversion.tigris.org/ds/viewMessage.do?dsForumId=462&dsMessag
> > > eId=742594
> > >
> > > There were two problems this patch tried to address:
> > >
> > > 1. There was no way to exclude properties from the diff output.
> > >
> > > 2. There was no way to obtain a list of modified/added/deleted files
> > > and whether the content and/or properties have been modified.
> > >
> > > I got a response from Ben Collins-Sussman that the patch I sent is
> > > superseded by --summarize option which was implemented in the trunk
> > > (which would
> > >
> > > eventually become 1.4):
> > > http://svn.haxx.se/dev/archive-2006-06/0202.shtml
> > >
> > > Actually, --summarize only addresses the issue #2, but not the issue
> > > #1. As to issue #1, ability to disable property diffs is still missing
> > > from Subversion.
> > >
> > > Common wisdom suggests running the diff through 'filterdiff --clean':
> > > http://stackoverflow.com/questions/2755848/how-do-you-get-subversion-
> > > diff-
> > >
> > > summary-to-ignore-mergeinfo-properties
> > >
> > > http://stackoverflow.com/questions/402522/is-there-a-metadata-exclusi
> > > on-
> > >
> > > filter-for-the-svn-diff-command
> > >
> > > But this is still unreliable: if property text includes a diff-like
> > > chunk, it will go through.
> > >
> > > What is the sentiment about implementing --no-property-diff option to
> > > 'svn diff'? I can implement it if there's agreement such option is
> > > needed.
> > >
> > > Regards,
> > > Alexey.
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;
+ 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,
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;