[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] svn command - cat - Multiple targets

From: Noorul Islam K M <noorul_at_collab.net>
Date: Wed, 26 Jan 2011 10:37:57 +0530

Noorul Islam K M <noorul_at_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
Received on 2011-01-26 06:09:26 CET

This is an archived mail posted to the Subversion Dev mailing list.