summaryrefslogtreecommitdiff
path: root/subversion/libsvn_repos
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_repos')
-rw-r--r--subversion/libsvn_repos/reporter.c23
-rw-r--r--subversion/libsvn_repos/repos.c2
2 files changed, 22 insertions, 3 deletions
diff --git a/subversion/libsvn_repos/reporter.c b/subversion/libsvn_repos/reporter.c
index 7bc8d476df75..76c72016144c 100644
--- a/subversion/libsvn_repos/reporter.c
+++ b/subversion/libsvn_repos/reporter.c
@@ -916,7 +916,7 @@ update_entry(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
const char *e_path, path_info_t *info, svn_depth_t wc_depth,
svn_depth_t requested_depth, apr_pool_t *pool)
{
- svn_fs_root_t *s_root;
+ svn_fs_root_t *s_root = NULL;
svn_boolean_t allowed, related;
void *new_baton;
svn_checksum_t *checksum;
@@ -959,7 +959,26 @@ update_entry(report_baton_t *b, svn_revnum_t s_rev, const char *s_path,
if (s_entry && t_entry && s_entry->kind == t_entry->kind)
{
int distance = svn_fs_compare_ids(s_entry->id, t_entry->id);
- if (distance == 0 && !any_path_info(b, e_path)
+ svn_boolean_t changed = TRUE;
+
+ /* Check related files for content changes to avoid reporting
+ * unchanged copies of files to the client as an open_file() call
+ * and change_file_prop()/apply_textdelta() calls with no-op changes.
+ * The client will otherwise raise unnecessary tree conflicts. */
+ if (!b->ignore_ancestry && t_entry->kind == svn_node_file &&
+ distance == 1)
+ {
+ if (s_root == NULL)
+ SVN_ERR(get_source_root(b, &s_root, s_rev));
+
+ SVN_ERR(svn_fs_props_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ if (!changed)
+ SVN_ERR(svn_fs_contents_different(&changed, s_root, s_path,
+ b->t_root, t_path, pool));
+ }
+
+ if ((distance == 0 || !changed) && !any_path_info(b, e_path)
&& (requested_depth <= wc_depth || t_entry->kind == svn_node_file))
{
if (!info)
diff --git a/subversion/libsvn_repos/repos.c b/subversion/libsvn_repos/repos.c
index dc0caf5b532a..1d62aeb501f1 100644
--- a/subversion/libsvn_repos/repos.c
+++ b/subversion/libsvn_repos/repos.c
@@ -712,7 +712,7 @@ create_hooks(svn_repos_t *repos, apr_pool_t *pool)
"# Because the locks have already been created and cannot be undone," NL
"# the exit code of the hook program is ignored. The hook program" NL
"# can use the 'svnlook' utility to examine the paths in the repository" NL
-"# but since the hook is invoked asyncronously the newly-created locks" NL
+"# but since the hook is invoked asynchronously the newly-created locks" NL
"# may no longer be present." NL;
script =
"REPOS=\"$1\"" NL