Author: pburba Date: Tue May 31 21:07:28 2011 New Revision: 1129922 URL: http://svn.apache.org/viewvc?rev=1129922&view=rev Log: A partial fix for issue #3896 'mergeinfo syntax errors should be treated gracefully': Make repository more tolerant of invalid mergeinfo such that log -g isn't needlessly broken on the client side.
* subversion/libsvn_repos/log.c (get_combined_mergeinfo_changes): Assume no merges if we run into syntactically invalid mergeinfo, rather than raising an error and breaking log -g. Modified: subversion/trunk/subversion/libsvn_repos/log.c Modified: subversion/trunk/subversion/libsvn_repos/log.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/log.c?rev=1129922&r1=1129921&r2=1129922&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/log.c (original) +++ subversion/trunk/subversion/libsvn_repos/log.c Tue May 31 21:07:28 2011 @@ -749,6 +749,7 @@ get_combined_mergeinfo_changes(svn_merge svn_fs_root_t *root; apr_pool_t *subpool, *iterpool; int i; + svn_error_t *err; /* Initialize return value. */ *added_mergeinfo = apr_hash_make(pool); @@ -767,9 +768,25 @@ get_combined_mergeinfo_changes(svn_merge SVN_ERR(svn_fs_revision_root(&root, fs, rev, subpool)); /* Fetch the mergeinfo changes for REV. */ - SVN_ERR(fs_mergeinfo_changed(&deleted_mergeinfo_catalog, - &added_mergeinfo_catalog, - fs, rev, subpool)); + err = fs_mergeinfo_changed(&deleted_mergeinfo_catalog, + &added_mergeinfo_catalog, + fs, rev, subpool); + if (err) + { + if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR) + { + /* Issue #3896: If invalid mergeinfo is encountered the + best we can do is ignore it and act as if there were + no mergeinfo modifications. */ + svn_error_clear(err); + svn_pool_destroy(subpool); + return SVN_NO_ERROR; + } + else + { + return svn_error_return(err); + } + } /* Check our PATHS for any changes to their inherited mergeinfo. (We deal with changes to mergeinfo directly *on* the paths in the @@ -784,7 +801,6 @@ get_combined_mergeinfo_changes(svn_merge svn_mergeinfo_catalog_t catalog; svn_mergeinfo_t prev_mergeinfo, mergeinfo, deleted, added; apr_array_header_t *query_paths; - svn_error_t *err; svn_pool_clear(iterpool); @@ -818,14 +834,15 @@ get_combined_mergeinfo_changes(svn_merge /* Fetch the previous mergeinfo (including inherited stuff) for this path. Ignore not-found errors returned by the - filesystem. */ + filesystem or invalid mergeinfo (Issue #3896).*/ SVN_ERR(svn_fs_revision_root(&prev_root, fs, prev_rev, iterpool)); query_paths = apr_array_make(iterpool, 1, sizeof(const char *)); APR_ARRAY_PUSH(query_paths, const char *) = prev_path; err = svn_fs_get_mergeinfo(&catalog, prev_root, query_paths, svn_mergeinfo_inherited, FALSE, iterpool); if (err && (err->apr_err == SVN_ERR_FS_NOT_FOUND || - err->apr_err == SVN_ERR_FS_NOT_DIRECTORY)) + err->apr_err == SVN_ERR_FS_NOT_DIRECTORY || + err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)) { svn_error_clear(err); err = SVN_NO_ERROR;