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

[PATCH] svn command - cat - Multiple targets

From: Noorul Islam K M <noorul_at_collab.net>
Date: Wed, 19 Jan 2011 14:20:41 +0530

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;
 }
Received on 2011-01-19 09:53:35 CET

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