The attached patch is for this file:
subversion/subversion/svnlook/main.c
It adds a new command-line option "--no-diff", which is used to prevent
svnlook from displaying differences for certain files. (The effect is
similar the way binary files are excluded.) For example:
svnlook diff my_repository -r 1234 --no-diff "*.resx *Designer.cs"
In this example, if revision #1234 affected any filenames such as
"MyForm.resx" or "MyForm.Designer.cs", they will be excluded from the diff
(although they will still be listed as changed).
I created this option because our Subversion log e-mails were becoming
cluttered by a lot of verbose diffs for text files that are normally edited
using automated tools. For example, in C# a .resx file might contain
thousands of lines of BASE64-encoded image data.
Cheers,
-Pete
Index: main.c
===================================================================
--- main.c (revision 17436)
+++ main.c (working copy)
@@ -75,6 +75,7 @@
svnlook__show_ids,
svnlook__no_diff_deleted,
svnlook__no_diff_added,
+ svnlook__no_diff,
svnlook__diff_copy_from,
svnlook__revprop_opt,
svnlook__full_paths,
@@ -116,6 +117,9 @@
{"no-diff-added", svnlook__no_diff_added, 0,
N_("do not print differences for added files")},
+ {"no-diff", svnlook__no_diff, 1,
+ N_("do not print differences for files matching ARG")},
+
{"diff-copy-from", svnlook__diff_copy_from, 0,
N_("print differences against the copy source")},
@@ -163,7 +167,7 @@
N_("usage: svnlook diff REPOS_PATH\n\n"
"Print GNU-style diffs of changed files and properties.\n"),
{'r', 't', svnlook__no_diff_deleted, svnlook__no_diff_added,
- svnlook__diff_copy_from} },
+ svnlook__no_diff, svnlook__diff_copy_from} },
{"dirs-changed", subcommand_dirschanged, {0},
N_("usage: svnlook dirs-changed REPOS_PATH\n\n"
@@ -243,6 +247,7 @@
svn_boolean_t help; /* --help */
svn_boolean_t no_diff_deleted; /* --no-diff-deleted */
svn_boolean_t no_diff_added; /* --no-diff-added */
+ const char *no_diff; /* --no-diff */
svn_boolean_t diff_copy_from; /* --diff-copy-from */
svn_boolean_t verbose; /* --verbose */
svn_boolean_t revprop; /* --revprop */
@@ -259,6 +264,7 @@
svn_boolean_t show_ids;
svn_boolean_t no_diff_deleted;
svn_boolean_t no_diff_added;
+ const char *no_diff;
svn_boolean_t diff_copy_from;
svn_boolean_t full_paths;
svn_boolean_t copy_info;
@@ -848,6 +854,7 @@
const char *path /* UTF-8! */,
const char *base_path /* UTF-8! */,
const svnlook_ctxt_t *c,
+ apr_array_header_t *no_diff_patterns,
const char *tmpdir,
apr_pool_t *pool)
{
@@ -969,14 +976,22 @@
if (do_diff)
{
+ int ignore_me = FALSE;
+
+ if (no_diff_patterns != NULL)
+ ignore_me = svn_cstring_match_glob_list (path, no_diff_patterns);
+
SVN_ERR (svn_cmdline_printf (pool, "%s\n", equal_string));
SVN_ERR (svn_cmdline_fflush (stdout));
- if (binary)
+ if (ignore_me)
+ SVN_ERR (svn_cmdline_printf (pool, _("(Skipping this file type)\n")));
+ else if (binary)
SVN_ERR (svn_cmdline_printf (pool, _("(Binary files differ)\n")));
else
{
svn_diff_t *diff;
+
SVN_ERR (svn_diff_file_diff (&diff, orig_path, new_path, pool));
if (svn_diff_contains_diffs (diff))
{
@@ -1041,7 +1056,7 @@
SVN_ERR (print_diff_tree (root, base_root, node,
svn_path_join (path, node->name, subpool),
svn_path_join (base_path, node->name, subpool),
- c, tmpdir, subpool));
+ c, no_diff_patterns, tmpdir, subpool));
while (node->sibling)
{
svn_pool_clear (subpool);
@@ -1049,7 +1064,7 @@
SVN_ERR (print_diff_tree (root, base_root, node,
svn_path_join (path, node->name, subpool),
svn_path_join (base_path, node->name, subpool),
- c, tmpdir, subpool));
+ c, no_diff_patterns, tmpdir, subpool));
}
apr_pool_destroy (subpool);
@@ -1419,11 +1434,16 @@
{
const char *tmpdir;
svn_error_t *err;
+ apr_array_header_t *no_diff_patterns = NULL;
+ /* parse the --no-diff patterns */
+ if (c->no_diff != NULL)
+ no_diff_patterns = svn_cstring_split ( c->no_diff, " ", TRUE, pool);
+
SVN_ERR (svn_fs_revision_root (&base_root, c->fs, base_rev_id, pool));
SVN_ERR (create_unique_tmpdir (&tmpdir, pool));
err = print_diff_tree (root, base_root, tree, "", "",
- c, tmpdir, pool);
+ c, no_diff_patterns, tmpdir, pool);
if (err)
{
svn_error_clear (svn_io_remove_dir (tmpdir, pool));
@@ -1671,6 +1691,7 @@
baton->show_ids = opt_state->show_ids;
baton->no_diff_deleted = opt_state->no_diff_deleted;
baton->no_diff_added = opt_state->no_diff_added;
+ baton->no_diff = opt_state->no_diff;
baton->diff_copy_from = opt_state->diff_copy_from;
baton->full_paths = opt_state->full_paths;
baton->copy_info = opt_state->copy_info;
@@ -2101,6 +2122,10 @@
opt_state.no_diff_added = TRUE;
break;
+ case svnlook__no_diff:
+ opt_state.no_diff = opt_arg;
+ break;
+
case svnlook__diff_copy_from:
opt_state.diff_copy_from = TRUE;
break;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Fri Nov 18 04:26:01 2005