Noorul Islam K M <noo...@collab.net> writes: > This patch is a followup of the following thread. All tests pass with > this patch. > > http://svn.haxx.se/dev/archive-2011-01/0210.shtml > > Log > > [[[ > > Make svn 'cat' command to return 1 when one or more targets fails. Also > print error message at the end. This also fixes issue #3713. > > * subversion/svn/cat-cmd.c > (svn_cl__cat): Pass SVN_ERR_FS_NOT_FOUND to svn_cl__try in order to > catch this error when processing non existent URL targets, print > warning and proceed with other targets. Print error message at the > end if operation fails on any one of the targets and return 1. > > * subversion/tests/cmdline/cat_tests.py > (cat_local_directory, cat_nonexistent_file, cat_skip_uncattable, > cat_unversioned_file, cat_url_special_characters): > Update return code and use regular expressions to match output. > (cat_non_existing_remote_file): New test > > Patch by: Noorul Islam K M <noorul{_AT_}collab.net> > > ]]] > > Thanks and Regards > Noorul > > Index: subversion/tests/cmdline/cat_tests.py > =================================================================== > --- subversion/tests/cmdline/cat_tests.py (revision 1060693) > +++ subversion/tests/cmdline/cat_tests.py (working copy) > @@ -25,7 +25,7 @@ > ###################################################################### > > # General modules > -import os > +import os, re > > # Our testing module > import svntest > @@ -50,20 +50,23 @@ > sbox.build(read_only = True) > > A_path = os.path.join(sbox.wc_dir, 'A') > + expected_err = "svn: warning: '" + os.path.abspath(A_path) + "'" + \ > + " refers to a directory\n.*" > > - svntest.actions.run_and_verify_svn2('No error where one is expected', > - None, svntest.verify.AnyOutput, > - 0, 'cat', A_path) > + svntest.actions.run_and_verify_svn2(None, None, expected_err, > + 1, 'cat', A_path) > > def cat_remote_directory(sbox): > "cat a remote directory" > sbox.build(create_wc = False, read_only = True) > > A_url = sbox.repo_url + '/A' > - svntest.actions.run_and_verify_svn2('No error where one is expected', > - None, svntest.verify.AnyOutput, > - 0, 'cat', A_url) > + expected_err = "svn: warning: URL '" + A_url + "'" + \ > + " refers to a directory\n.*" > > + svntest.actions.run_and_verify_svn2(None, None, expected_err, > + 1, 'cat', A_url) > + > def cat_base(sbox): > "cat a file at revision BASE" > sbox.build(read_only = True) > @@ -88,10 +91,13 @@ > wc_dir = sbox.wc_dir > > bogus_path = os.path.join(wc_dir, 'A', 'bogus') > - svntest.actions.run_and_verify_svn2('No error where one is expected', > - None, svntest.verify.AnyOutput, > - 0, 'cat', bogus_path) > > + expected_err = "svn: warning: '" + os.path.abspath(bogus_path) + "'" + \ > + " is not under version control\n.*" > + > + svntest.actions.run_and_verify_svn2(None, None, expected_err, 1, > + 'cat', bogus_path) > + > def cat_skip_uncattable(sbox): > "cat should skip uncattable resources" > sbox.build(read_only = True) > @@ -113,14 +119,14 @@ > continue > item_to_cat = os.path.join(dir_path, file) > if item_to_cat == new_file_path: > - expected_err = ["svn: warning: '" + os.path.abspath(item_to_cat) + "'" > + \ > - " is not under version control\n"] > - svntest.actions.run_and_verify_svn2(None, None, expected_err, 0, > + expected_err = "svn: warning: '" + os.path.abspath(item_to_cat) + "'" > + \ > + " is not under version control\n.*" > + svntest.actions.run_and_verify_svn2(None, None, expected_err, 1, > 'cat', item_to_cat) > elif os.path.isdir(item_to_cat): > - expected_err = ["svn: warning: '" + os.path.abspath(item_to_cat) + "'" > + \ > - " refers to a directory\n"] > - svntest.actions.run_and_verify_svn2(None, None, expected_err, 0, > + expected_err = "svn: warning: '" + os.path.abspath(item_to_cat) + "'" > + \ > + " refers to a directory\n.*" > + svntest.actions.run_and_verify_svn2(None, None, expected_err, 1, > 'cat', item_to_cat) > else: > svntest.actions.run_and_verify_svn(None, > @@ -130,22 +136,33 @@ > G_path = os.path.join(dir_path, 'G') > rho_path = os.path.join(G_path, 'rho') > > - expected_out = ["This is the file 'rho'.\n"] > - expected_err1 = ["svn: warning: '" + os.path.abspath(G_path) + "'" > - + " refers to a directory\n"] > - svntest.actions.run_and_verify_svn2(None, expected_out, expected_err1, 0, > + expected_out = "This is the file 'rho'.\n" > + expected_err1 = "svn: warning: '" + os.path.abspath(G_path) + "'" + \ > + " refers to a directory\n" > + svntest.actions.run_and_verify_svn2(None, expected_out, expected_err1, 1, > 'cat', rho_path, G_path) > > - expected_err2 = ["svn: warning: '" + os.path.abspath(new_file_path) + "'" > - + " is not under version control\n"] > - svntest.actions.run_and_verify_svn2(None, expected_out, expected_err2, 0, > + expected_err2 = "svn: warning: '" + os.path.abspath(new_file_path) + "'" + > \ > + " is not under version control\n" > + svntest.actions.run_and_verify_svn2(None, expected_out, expected_err2, 1, > 'cat', rho_path, new_file_path) > > - svntest.actions.run_and_verify_svn2(None, expected_out, > - expected_err1 + expected_err2, 0, > - 'cat', rho_path, G_path, new_file_path) > + expected_err3 = expected_err1 + expected_err2 + ".*\n" + \ > + "svn: A problem occurred; see other errors for details\n" > + expected_err_re = re.compile(expected_err3) > > + exit_code, output, error = svntest.main.run_svn(1, 'cat', rho_path, > G_path, new_file_path) > > + # Verify output > + if output[0] != expected_out: > + raise svntest.Failure('Cat failed: expected "%s", but received "%s"' % \ > + (expected_out, "".join(output))) > + > + # Verify error > + if not expected_err_re.match("".join(error)): > + raise svntest.Failure('Cat failed: expected error "%s", but received > "%s"' % \ > + (expected_err3, "".join(error))) > + > # Test for issue #3560 'svn_wc_status3() returns incorrect status for > # unversioned files'. > def cat_unversioned_file(sbox): > @@ -162,15 +179,15 @@ > iota_path) > > # Now try to cat the deleted file, it should be reported as unversioned. > - expected_error = ["svn: warning: '" + os.path.abspath(iota_path) + "'" > - + " is not under version control\n"] > - svntest.actions.run_and_verify_svn2(None, [], expected_error, 0, > + expected_error = "svn: warning: '" + os.path.abspath(iota_path) + "'" + \ > + " is not under version control\n.*" > + svntest.actions.run_and_verify_svn2(None, [], expected_error, 1, > 'cat', iota_path) > > # Put an unversioned file at 'iota' and try to cat it again, the result > # should still be the same. > svntest.main.file_write(iota_path, "This the unversioned file 'iota'.\n") > - svntest.actions.run_and_verify_svn2(None, [], expected_error, 0, > + svntest.actions.run_and_verify_svn2(None, [], expected_error, 1, > 'cat', iota_path) > > > @@ -204,13 +221,25 @@ > special_urls = [sbox.repo_url + '/A' + '/%2E', > sbox.repo_url + '%2F' + 'A'] > > - expected_err = ["svn: warning: URL '" + sbox.repo_url + '/A' + "'" > - + " refers to a directory\n"] > + expected_err = "svn: warning: URL '" + sbox.repo_url + '/A' + "'" + \ > + " refers to a directory\n.*" > > for url in special_urls: > - svntest.actions.run_and_verify_svn2(None, None, expected_err, 0, > + svntest.actions.run_and_verify_svn2(None, None, expected_err, 1, > 'cat', url) > > +def cat_non_existing_remote_file(sbox): > + """cat non exising remote file""" > + sbox.build(create_wc = False) > + non_existing_path = sbox.repo_url + '/non-existing' > + > + expected_err = "svn: warning: File not found.*" + \ > + non_existing_path.split('/')[1] > + > + # cat operation on non-existing remote path should return 1 > + svntest.actions.run_and_verify_svn2(None, None, expected_err, 1, > + 'cat', non_existing_path) > + > ######################################################################## > # Run the tests > > @@ -225,6 +254,7 @@ > cat_unversioned_file, > cat_keywords, > cat_url_special_characters, > + cat_non_existing_remote_file, > ] > > if __name__ == '__main__': > Index: subversion/svn/cat-cmd.c > =================================================================== > --- subversion/svn/cat-cmd.c (revision 1060693) > +++ subversion/svn/cat-cmd.c (working copy) > @@ -47,6 +47,7 @@ > int i; > svn_stream_t *out; > apr_pool_t *subpool = svn_pool_create(pool); > + svn_boolean_t saw_a_problem = FALSE; > > SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, > opt_state->targets, > @@ -63,6 +64,7 @@ > const char *target = APR_ARRAY_IDX(targets, i, const char *); > const char *truepath; > svn_opt_revision_t peg_revision; > + svn_boolean_t success; > > svn_pool_clear(subpool); > SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton)); > @@ -74,13 +76,19 @@ > SVN_ERR(svn_cl__try(svn_client_cat2(out, truepath, &peg_revision, > &(opt_state->start_revision), > ctx, subpool), > - NULL, opt_state->quiet, > + &success, opt_state->quiet, > SVN_ERR_UNVERSIONED_RESOURCE, > SVN_ERR_ENTRY_NOT_FOUND, > SVN_ERR_CLIENT_IS_DIRECTORY, > + SVN_ERR_FS_NOT_FOUND, > SVN_NO_ERROR)); > + if (! success) > + saw_a_problem = TRUE; > } > svn_pool_destroy(subpool); > > - return SVN_NO_ERROR; > + if (saw_a_problem) > + return svn_error_create(SVN_ERR_BASE, NULL, NULL); > + else > + return SVN_NO_ERROR; > }
It will be great if someone could review this so that I can proceed with other commands. Thanks and Regards Noorul