Author: danielsh Date: Fri Jun 10 23:45:51 2011 New Revision: 1134484 URL: http://svn.apache.org/viewvc?rev=1134484&view=rev Log: Verify FS paths for validity during dump. Follow-up to r1129641, which added validation to 'verify'.
The validation during dump is conditional upon 'notify_func' being available, and does not result in a hard error. The validation during verify always results in a hard error. * subversion/include/svn_repos.h (svn_repos_notify_warning_t): New enumerator 'svn_repos_notify_warning_invalid_fspath'. * subversion/libsvn_repos/dump.c (dump_node): Validate FS paths during dump too if notify_func is provided. Use notify_func during verify as well. * subversion/tests/cmdline/svnadmin_tests.py (verify_non_utf8_paths): Adjust expected stderr. Modified: subversion/trunk/subversion/include/svn_repos.h subversion/trunk/subversion/libsvn_repos/dump.c subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py Modified: subversion/trunk/subversion/include/svn_repos.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_repos.h?rev=1134484&r1=1134483&r2=1134484&view=diff ============================================================================== --- subversion/trunk/subversion/include/svn_repos.h (original) +++ subversion/trunk/subversion/include/svn_repos.h Fri Jun 10 23:45:51 2011 @@ -259,6 +259,13 @@ typedef enum svn_repos_notify_warning_t /** An #SVN_PROP_MERGEINFO property's encoded mergeinfo references a * revision earlier than the first revision dumped. */ svn_repos_notify_warning_found_old_mergeinfo, + + /** Found an invalid path in the filesystem. + * @see svn_fs.h:"Directory entry names and directory paths" */ + /* ### TODO(doxygen): make that a proper doxygen link */ + /* See svn_fs__path_valid(). */ + svn_repos_notify_warning_invalid_fspath, + } svn_repos_notify_warning_t; /** Modified: subversion/trunk/subversion/libsvn_repos/dump.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/dump.c?rev=1134484&r1=1134483&r2=1134484&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_repos/dump.c (original) +++ subversion/trunk/subversion/libsvn_repos/dump.c Fri Jun 10 23:45:51 2011 @@ -243,9 +243,33 @@ dump_node(struct edit_baton *eb, svn_fs_root_t *compare_root = NULL; apr_file_t *delta_file = NULL; - /* If we're verifying, validate the path. */ - if (eb->verify) - SVN_ERR(svn_fs__path_valid(path, pool)); + /* Maybe validate the path. */ + if (eb->verify || eb->notify_func) + { + svn_error_t *err = svn_fs__path_valid(path, pool); + + if (eb->notify_func) + { + char errbuf[512]; /* ### svn_strerror() magic number */ + svn_repos_notify_t *notify; + notify = svn_repos_notify_create(svn_repos_notify_warning, pool); + + notify->warning = svn_repos_notify_warning_invalid_fspath; + notify->warning_str = apr_psprintf( + pool, + _("E%06d: While validating fspath '%s': %s"), + err->apr_err, path, + svn_err_best_message(err, errbuf, sizeof(errbuf))); + + eb->notify_func(eb->notify_baton, notify, pool); + } + + /* Return the error in addition to notifying about it. */ + if (eb->verify) + return svn_error_return(err); + else + svn_error_clear(err); + } /* Write out metadata headers for this file node. */ SVN_ERR(svn_stream_printf(eb->stream, pool, Modified: subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py?rev=1134484&r1=1134483&r2=1134484&view=diff ============================================================================== --- subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py (original) +++ subversion/trunk/subversion/tests/cmdline/svnadmin_tests.py Fri Jun 10 23:45:51 2011 @@ -1366,11 +1366,18 @@ def verify_non_utf8_paths(sbox): # Make sure the repository can still be dumped so that the # encoding problem can be fixed in a dump/edit/load cycle. + expected_stderr = [ + "* Dumped revision 0.\n", + "WARNING 0x0002: E160005: " + "While validating fspath '?\\230': " + "Path '?\\230' is not in UTF-8" + "\n", + "* Dumped revision 1.\n", + ] exit_code, output, errput = svntest.main.run_svnadmin("dump", sbox.repo_dir) if svntest.verify.compare_and_display_lines( "Output of 'svnadmin dump' is unexpected.", - 'STDERR', ["* Dumped revision 0.\n", - "* Dumped revision 1.\n"], errput): + 'STDERR', expected_stderr, errput): raise svntest.Failure ########################################################################