Index: subversion/libsvn_repos/delta.c =================================================================== --- subversion/libsvn_repos/delta.c (.../trunk) (revision 7163) +++ subversion/libsvn_repos/delta.c (.../dir_delta) (revision 7163) @@ -653,7 +653,61 @@ return SVN_NO_ERROR; } +static svn_error_t * +compare_files (svn_boolean_t *changed_p, + svn_fs_root_t *root1, + const char *path1, + svn_fs_root_t *root2, + const char *path2, + apr_pool_t *pool) +{ + svn_filesize_t size1, size2; + SVN_ERR (svn_fs_contents_changed (changed_p, root1, path1, + root2, path2, pool)); + if (!*changed_p) + return SVN_NO_ERROR; + *changed_p = FALSE; + SVN_ERR (svn_fs_file_length (&size1, root1, path1, pool)); + SVN_ERR (svn_fs_file_length (&size2, root2, path2, pool)); + + if (size1 != size2) + *changed_p = TRUE; + else + { + unsigned char md51[APR_MD5_DIGESTSIZE], md52[APR_MD5_DIGESTSIZE]; + SVN_ERR (svn_fs_file_md5_checksum (md51, root1, path1, pool)); + SVN_ERR (svn_fs_file_md5_checksum (md52, root2, path2, pool)); + if (!svn_md5_digests_match (md51, md52)) + *changed_p = TRUE; + } + + if (!*changed_p) { + svn_stream_t *stream1, *stream2; + char buf1[SVN_STREAM_CHUNK_SIZE], buf2[SVN_STREAM_CHUNK_SIZE]; + apr_size_t len1, len2; + + SVN_ERR (svn_fs_file_contents (&stream1, root1, path1, pool)); + SVN_ERR (svn_fs_file_contents (&stream2, root2, path2, pool)); + + do + { + len1 = len2 = SVN_STREAM_CHUNK_SIZE; + SVN_ERR (svn_stream_read (stream1, buf1, &len1)); + SVN_ERR (svn_stream_read (stream2, buf2, &len2)); + + if (len1 != len2 || memcmp (buf1, buf2, len1)) + { + *changed_p = TRUE; + break; + } + } + while (len1 > 0); + } + + return SVN_NO_ERROR; +} + /* Make the appropriate edits on FILE_BATON to change its contents and properties from those in SOURCE_PATH to those in TARGET_PATH. */ static svn_error_t * @@ -679,10 +733,16 @@ if (source_path) { /* Is this deltification worth our time? */ - SVN_ERR (svn_fs_contents_changed (&changed, - c->target_root, target_path, - c->source_root, source_path, - subpool)); + if (c->ignore_ancestry) + SVN_ERR (compare_files (&changed, + c->target_root, target_path, + c->source_root, source_path, + subpool)); + else + SVN_ERR (svn_fs_contents_changed (&changed, + c->target_root, target_path, + c->source_root, source_path, + subpool)); } else {