You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by sv...@apache.org on 2015/10/27 05:00:21 UTC

svn commit: r1710721 - in /subversion/branches/1.9.x: ./ STATUS subversion/svn/lock-cmd.c subversion/svn/unlock-cmd.c subversion/tests/cmdline/authz_tests.py subversion/tests/cmdline/lock_tests.py

Author: svn-role
Date: Tue Oct 27 04:00:21 2015
New Revision: 1710721

URL: http://svn.apache.org/viewvc?rev=1710721&view=rev
Log:
Merge the r1701598 group from trunk:

 * r1701598, r1701603, r1701611, r1701646
   Make 'svn lock' and 'svn unlock' report (un)lock errors as failure
   Justification:
     A single lock or unlock failure doesn't affect the whole operation
     since 1.9, but this has the side effect of no longer producing an
     error at all on failures. This patch makes 'svn' return an error when
     at least one failure is reported by the locking code.
   Notes:
     r1701598 is the actual fix. The other patches simplify and fix
     test expectations.
   Votes:
     +1: rhuijben, philip, ivan

Modified:
    subversion/branches/1.9.x/   (props changed)
    subversion/branches/1.9.x/STATUS
    subversion/branches/1.9.x/subversion/svn/lock-cmd.c
    subversion/branches/1.9.x/subversion/svn/unlock-cmd.c
    subversion/branches/1.9.x/subversion/tests/cmdline/authz_tests.py
    subversion/branches/1.9.x/subversion/tests/cmdline/lock_tests.py

Propchange: subversion/branches/1.9.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Oct 27 04:00:21 2015
@@ -94,4 +94,4 @@
 /subversion/branches/verify-at-commit:1462039-1462408
 /subversion/branches/verify-keep-going:1439280-1546110
 /subversion/branches/wc-collate-path:1402685-1480384
-/subversion/trunk:1660545-1660547,1660549-1662901,1663003,1663183-1663184,1663338,1663347,1663355,1663374,1663450,1663530,1663671,1663697,1663706,1663738,1663749,1663791,1663991,1664035,1664078,1664080,1664084-1664085,1664187,1664191,1664193,1664200,1664344,1664476,1664480-1664481,1664483,1664489-1664490,1664507,1664520-1664521,1664523,1664526-1664527,1664531-1664532,1664588,1664593-1664594,1664596,1664653,1664664,1664672,1664674,1664684,1664927,1664938-1664940,1664978,1664984,1664997,1665164,1665195,1665213,1665259,1665318,1665437-1665438,1665609,1665611-1665612,1665845,1665850,1665852,1665886,1665894,1665896,1666096,1666258,1666270,1666272,1666379,1666449,1666690,1666832,1666851,1666965,1667101,1667106-1667107,1667120,1667228,1667233-1667235,1667249-1667250,1667258,1667290,1667301,1667471,1667691-1667693,1667699-1667700,1667715,1667941,1667976,1668320,1668598-1668600,1668602-1668603,1668607-1668608,1668618,1669743,1669746,1669749,1669945,1670139,1670149,1670152,1670329,1670337,167
 0347,1670353,1671164,1671388,1672295,1672311,1672372,1672404,1672511-1672512,1672578,1672728,1673044,1673062-1673063,1673065,1673153,1673170,1673172,1673197,1673202,1673204,1673228,1673282,1673445,1673691-1673692,1673746,1673785,1673803,1674015,1674032,1674170,1674301,1674305,1674308,1674339-1674340,1674406,1674415,1674455-1674456,1674475,1674487,1674522,1674580,1674626-1674627,1674785,1674891,1675771,1675774,1676526,1676535,1676538,1676555,1676564,1676570,1676665,1676667,1676769,1677003,1677191,1677267,1677440,1678147,1678149,1678494,1678571,1678734,1678742,1678745-1678746,1678755,1678839,1678846,1678894,1678950,1678963,1679166,1679169,1679228,1679230,1679240,1679287,1679864,1679866,1679909,1680242,1680264,1680495,1680705,1680819,1681317,1682714,1682854,1683071,1683126,1683135,1683290,1683303,1683311,1683378,1683387,1684034,1684077,1684322,1684325,1684344,1684412,1684940,1685034,1685085,1686175,1686239,1686478,1686541,1686543,1686554,1686557,1686802,1686888,1686984,1687029,1687304,
 1687389,1687769,1687776,1688258,1688273,1688395,1689214,1689216,1689721,1689729,1691712-1691713,1691924,1691928,1692091,1692093,1692098,1692448,1692469-1692470,1692798-1692799,1693135,1693138,1693159,1693886,1694023,1694194,1694481,1694929,1695022,1695600,1695606,1695681,1696222,1696225,1696387,1696695,1697381,1697384,1697387,1697664,1697824,1697835,1697845,1697914,1697967,1698106,1698312,1700215,1700219-1700220,1700740,1700951,1701064,1701206,1701270,1701298,1701633,1701638,1701736,1701792,1701797,1701838,1701997,1702198,1702200,1702203,1702218,1702231,1702237-1702239,1702247,1702288,1702299-1702300,1702310,1702397,1702407,1702467,1702472,1702474,1702478,1702533,1702549,1702553,1702565,1702891,1702974,1702991,1703675,1703740,1705060,1705062,1705064,1705088,1705328,1706241,1706323-1706324,1709389,1709562,1710104
+/subversion/trunk:1660545-1660547,1660549-1662901,1663003,1663183-1663184,1663338,1663347,1663355,1663374,1663450,1663530,1663671,1663697,1663706,1663738,1663749,1663791,1663991,1664035,1664078,1664080,1664084-1664085,1664187,1664191,1664193,1664200,1664344,1664476,1664480-1664481,1664483,1664489-1664490,1664507,1664520-1664521,1664523,1664526-1664527,1664531-1664532,1664588,1664593-1664594,1664596,1664653,1664664,1664672,1664674,1664684,1664927,1664938-1664940,1664978,1664984,1664997,1665164,1665195,1665213,1665259,1665318,1665437-1665438,1665609,1665611-1665612,1665845,1665850,1665852,1665886,1665894,1665896,1666096,1666258,1666270,1666272,1666379,1666449,1666690,1666832,1666851,1666965,1667101,1667106-1667107,1667120,1667228,1667233-1667235,1667249-1667250,1667258,1667290,1667301,1667471,1667691-1667693,1667699-1667700,1667715,1667941,1667976,1668320,1668598-1668600,1668602-1668603,1668607-1668608,1668618,1669743,1669746,1669749,1669945,1670139,1670149,1670152,1670329,1670337,167
 0347,1670353,1671164,1671388,1672295,1672311,1672372,1672404,1672511-1672512,1672578,1672728,1673044,1673062-1673063,1673065,1673153,1673170,1673172,1673197,1673202,1673204,1673228,1673282,1673445,1673691-1673692,1673746,1673785,1673803,1674015,1674032,1674170,1674301,1674305,1674308,1674339-1674340,1674406,1674415,1674455-1674456,1674475,1674487,1674522,1674580,1674626-1674627,1674785,1674891,1675771,1675774,1676526,1676535,1676538,1676555,1676564,1676570,1676665,1676667,1676769,1677003,1677191,1677267,1677440,1678147,1678149,1678494,1678571,1678734,1678742,1678745-1678746,1678755,1678839,1678846,1678894,1678950,1678963,1679166,1679169,1679228,1679230,1679240,1679287,1679864,1679866,1679909,1680242,1680264,1680495,1680705,1680819,1681317,1682714,1682854,1683071,1683126,1683135,1683290,1683303,1683311,1683378,1683387,1684034,1684077,1684322,1684325,1684344,1684412,1684940,1685034,1685085,1686175,1686239,1686478,1686541,1686543,1686554,1686557,1686802,1686888,1686984,1687029,1687304,
 1687389,1687769,1687776,1688258,1688273,1688395,1689214,1689216,1689721,1689729,1691712-1691713,1691924,1691928,1692091,1692093,1692098,1692448,1692469-1692470,1692798-1692799,1693135,1693138,1693159,1693886,1694023,1694194,1694481,1694929,1695022,1695600,1695606,1695681,1696222,1696225,1696387,1696695,1697381,1697384,1697387,1697664,1697824,1697835,1697845,1697914,1697967,1698106,1698312,1700215,1700219-1700220,1700740,1700951,1701064,1701206,1701270,1701298,1701598,1701603,1701611,1701633,1701638,1701646,1701736,1701792,1701797,1701838,1701997,1702198,1702200,1702203,1702218,1702231,1702237-1702239,1702247,1702288,1702299-1702300,1702310,1702397,1702407,1702467,1702472,1702474,1702478,1702533,1702549,1702553,1702565,1702891,1702974,1702991,1703675,1703740,1705060,1705062,1705064,1705088,1705328,1706241,1706323-1706324,1709389,1709562,1710104

Modified: subversion/branches/1.9.x/STATUS
URL: http://svn.apache.org/viewvc/subversion/branches/1.9.x/STATUS?rev=1710721&r1=1710720&r2=1710721&view=diff
==============================================================================
--- subversion/branches/1.9.x/STATUS (original)
+++ subversion/branches/1.9.x/STATUS Tue Oct 27 04:00:21 2015
@@ -127,16 +127,3 @@ Veto-blocked changes:
 
 Approved changes:
 =================
-
- * r1701598, r1701603, r1701611, r1701646
-   Make 'svn lock' and 'svn unlock' report (un)lock errors as failure
-   Justification:
-     A single lock or unlock failure doesn't affect the whole operation
-     since 1.9, but this has the side effect of no longer producing an
-     error at all on failures. This patch makes 'svn' return an error when
-     at least one failure is reported by the locking code.
-   Notes:
-     r1701598 is the actual fix. The other patches simplify and fix
-     test expectations.
-   Votes:
-     +1: rhuijben, philip, ivan

Modified: subversion/branches/1.9.x/subversion/svn/lock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/svn/lock-cmd.c?rev=1710721&r1=1710720&r2=1710721&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/svn/lock-cmd.c (original)
+++ subversion/branches/1.9.x/subversion/svn/lock-cmd.c Tue Oct 27 04:00:21 2015
@@ -80,6 +80,29 @@ get_comment(const char **comment, svn_cl
   return SVN_NO_ERROR;
 }
 
+/* Baton for notify_lock_handler */
+struct notify_lock_baton_t
+{
+  void *inner_baton;
+  svn_wc_notify_func2_t inner_notify;
+  svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__lock */
+static void
+notify_lock_handler(void *baton,
+                    const svn_wc_notify_t *notify,
+                    apr_pool_t *scratch_pool)
+{
+  struct notify_lock_baton_t *nlb = baton;
+
+  if (notify->action == svn_wc_notify_failed_lock)
+    nlb->had_failure = TRUE;
+
+  if (nlb->inner_notify)
+    nlb->inner_notify(nlb->inner_baton, notify, scratch_pool);
+}
+
 /* This implements the `svn_opt_subcommand_t' interface. */
 svn_error_t *
 svn_cl__lock(apr_getopt_t *os,
@@ -90,6 +113,7 @@ svn_cl__lock(apr_getopt_t *os,
   svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
   apr_array_header_t *targets;
   const char *comment;
+  struct notify_lock_baton_t nlb;
 
   SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
                                                       opt_state->targets,
@@ -106,5 +130,18 @@ svn_cl__lock(apr_getopt_t *os,
 
   SVN_ERR(svn_cl__eat_peg_revisions(&targets, targets, pool));
 
-  return svn_client_lock(targets, comment, opt_state->force, ctx, pool);
+  nlb.inner_notify = ctx->notify_func2;
+  nlb.inner_baton = ctx->notify_baton2;
+  nlb.had_failure = FALSE;
+
+  ctx->notify_func2 = notify_lock_handler;
+  ctx->notify_baton2 = &nlb;
+
+  SVN_ERR(svn_client_lock(targets, comment, opt_state->force, ctx, pool));
+
+  if (nlb.had_failure)
+    return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+                            _("One or more locks could not be obtained"));
+
+  return SVN_NO_ERROR;
 }

Modified: subversion/branches/1.9.x/subversion/svn/unlock-cmd.c
URL: http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/svn/unlock-cmd.c?rev=1710721&r1=1710720&r2=1710721&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/svn/unlock-cmd.c (original)
+++ subversion/branches/1.9.x/subversion/svn/unlock-cmd.c Tue Oct 27 04:00:21 2015
@@ -39,6 +39,29 @@
 
 /*** Code. ***/
 
+/* Baton for notify_unlock_handler */
+struct notify_unlock_baton_t
+{
+  void *inner_baton;
+  svn_wc_notify_func2_t inner_notify;
+  svn_boolean_t had_failure;
+};
+
+/* Implements svn_wc_notify_func2_t for svn_cl__unlock */
+static void
+notify_unlock_handler(void *baton,
+                      const svn_wc_notify_t *notify,
+                      apr_pool_t *scratch_pool)
+{
+  struct notify_unlock_baton_t *nub = baton;
+
+  if (notify->action == svn_wc_notify_failed_unlock)
+    nub->had_failure = TRUE;
+
+  if (nub->inner_notify)
+    nub->inner_notify(nub->inner_baton, notify, scratch_pool);
+}
+
 
 /* This implements the `svn_opt_subcommand_t' interface. */
 svn_error_t *
@@ -49,6 +72,7 @@ svn_cl__unlock(apr_getopt_t *os,
   svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state;
   svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx;
   apr_array_header_t *targets;
+  struct notify_unlock_baton_t nub;
 
   SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os,
                                                       opt_state->targets,
@@ -63,6 +87,18 @@ svn_cl__unlock(apr_getopt_t *os,
 
   SVN_ERR(svn_cl__assert_homogeneous_target_type(targets));
 
-  return svn_error_trace(
-    svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+  nub.inner_notify = ctx->notify_func2;
+  nub.inner_baton = ctx->notify_baton2;
+  nub.had_failure = FALSE;
+
+  ctx->notify_func2 = notify_unlock_handler;
+  ctx->notify_baton2 = &nub;
+
+  SVN_ERR(svn_client_unlock(targets, opt_state->force, ctx, scratch_pool));
+
+  if (nub.had_failure)
+    return svn_error_create(SVN_ERR_ILLEGAL_TARGET, NULL,
+                            _("One or more locks could not be released"));
+
+  return SVN_NO_ERROR;
 }

Modified: subversion/branches/1.9.x/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/tests/cmdline/authz_tests.py?rev=1710721&r1=1710720&r2=1710721&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/1.9.x/subversion/tests/cmdline/authz_tests.py Tue Oct 27 04:00:21 2015
@@ -728,10 +728,8 @@ def authz_locking(sbox):
 
   if sbox.repo_url.startswith('http'):
     expected_err = ".*svn: E175013: .*[Ff]orbidden.*"
-    expected_status = 1
   else:
     expected_err = ".*svn: warning: W170001: Authorization failed.*"
-    expected_status = 0
 
   root_url = sbox.repo_url
   wc_dir = sbox.wc_dir
@@ -741,16 +739,16 @@ def authz_locking(sbox):
   mu_path = os.path.join(wc_dir, 'A', 'mu')
 
   # lock a file url, target is readonly: should fail
-  svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
-                                      'lock',
-                                      '-m', 'lock msg',
-                                      iota_url)
+  svntest.actions.run_and_verify_svn(None, expected_err,
+                                     'lock',
+                                     '-m', 'lock msg',
+                                     iota_url)
 
   # lock a file path, target is readonly: should fail
-  svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
-                                      'lock',
-                                      '-m', 'lock msg',
-                                      iota_path)
+  svntest.actions.run_and_verify_svn(None, expected_err,
+                                     'lock',
+                                     '-m', 'lock msg',
+                                     iota_path)
 
   # Test for issue 2700: we have write access in folder /A, but not in root.
   # Get a lock on /A/mu and try to commit it.
@@ -783,16 +781,16 @@ def authz_locking(sbox):
   svntest.actions.run_and_verify_info([{'Lock Token' : None}],
                                       sbox.ospath('A/mu'))
 
-  ### Crazy serf SVN_ERR_FS_LOCK_OWNER_MISMATCH warning! Issue 3801?
   if sbox.repo_url.startswith('http'):
     expected_err = ".*svn: warning: W160039: Unlock.*[Ff]orbidden.*"
-    expected_status = 0
+  else:
+    expected_err = ".*svn: warning: W170001: Authorization failed.*"
 
-  svntest.actions.run_and_verify_svn2(None, expected_err, expected_status,
-                                      'lock',
-                                      '-m', 'lock msg',
-                                      mu_path,
-                                      iota_path)
+  svntest.actions.run_and_verify_svn(None, expected_err,
+                                     'lock',
+                                     '-m', 'lock msg',
+                                     mu_path,
+                                     iota_path)
 
   # One path locked, one still unlocked
   svntest.actions.run_and_verify_info([{'Lock Token' : None}],

Modified: subversion/branches/1.9.x/subversion/tests/cmdline/lock_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/1.9.x/subversion/tests/cmdline/lock_tests.py?rev=1710721&r1=1710720&r2=1710721&view=diff
==============================================================================
--- subversion/branches/1.9.x/subversion/tests/cmdline/lock_tests.py (original)
+++ subversion/branches/1.9.x/subversion/tests/cmdline/lock_tests.py Tue Oct 27 04:00:21 2015
@@ -275,11 +275,11 @@ def steal_lock(sbox):
 
   # attempt (and fail) to lock file
 
-  # This should give a "iota' is already locked... error, but exits 0.
-  svntest.actions.run_and_verify_svn2(None,
-                                      ".*already locked", 0,
-                                      'lock',
-                                      '-m', 'trying to break', file_path_b)
+  # This should give a "iota' is already locked error
+  svntest.actions.run_and_verify_svn(None,
+                                     ".*already locked",
+                                     'lock',
+                                     '-m', 'trying to break', file_path_b)
 
   svntest.actions.run_and_verify_svn(".*locked by user", [],
                                      'lock', '--force',
@@ -703,11 +703,11 @@ def out_of_date(sbox):
                        '-m', '', file_path)
 
   # --- Meanwhile, in our other working copy... ---
-  svntest.actions.run_and_verify_svn2(None,
-                                      ".*newer version of '/iota' exists", 0,
-                                      'lock',
-                                      '--username', svntest.main.wc_author2,
-                                      '-m', '', file_path_b)
+  svntest.actions.run_and_verify_svn(None,
+                                     ".*newer version of '/iota' exists",
+                                     'lock',
+                                     '--username', svntest.main.wc_author2,
+                                     '-m', '', file_path_b)
 
 #----------------------------------------------------------------------
 # Tests reverting a svn:needs-lock file
@@ -1164,10 +1164,10 @@ def unlock_already_unlocked_files(sbox):
 
   error_msg = ".*Path '/A/B/E/alpha' is already locked by user '" + \
               svntest.main.wc_author2 + "'.*"
-  svntest.actions.run_and_verify_svn2(None, error_msg, 0,
-                                      'lock',
-                                      '--username', svntest.main.wc_author2,
-                                      alpha_path, gamma_path)
+  svntest.actions.run_and_verify_svn(None, error_msg,
+                                     'lock',
+                                     '--username', svntest.main.wc_author2,
+                                     alpha_path, gamma_path)
   expected_status.tweak('A/D/gamma', writelocked='K')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
@@ -1180,11 +1180,11 @@ def unlock_already_unlocked_files(sbox):
 
   error_msg = "(.*No lock on path '/A/B/lambda'.*)" + \
               "|(.*'A/B/lambda' is not locked.*)"
-  svntest.actions.run_and_verify_svn2(None, error_msg, 0,
-                                      'unlock',
-                                      '--username', svntest.main.wc_author2,
-                                      '--force',
-                                      iota_path, lambda_path, alpha_path)
+  svntest.actions.run_and_verify_svn(None, error_msg,
+                                     'unlock',
+                                     '--username', svntest.main.wc_author2,
+                                     '--force',
+                                     iota_path, lambda_path, alpha_path)
 
 
   expected_status.tweak('iota', 'A/B/E/alpha', writelocked=None)
@@ -1305,9 +1305,8 @@ def unlock_wrong_token(sbox):
   # Then, unlocking the WC path should fail.
   ### The error message returned is actually this, but let's worry about that
   ### another day...
-  svntest.actions.run_and_verify_svn2(
-    None, ".*(No lock on path)", 0,
-    'unlock', file_path)
+  svntest.actions.run_and_verify_svn(None, ".*(No lock on path)",
+                                     'unlock', file_path)
 
 #----------------------------------------------------------------------
 # Verify that info shows lock info for locked files with URI-unsafe names
@@ -1366,10 +1365,10 @@ def unlocked_lock_of_other_user(sbox):
   else:
     expected_err = "svn: warning: W160039: User '%s' is trying to use a lock owned by "\
                    "'%s'.*" % (svntest.main.wc_author2, svntest.main.wc_author)
-  svntest.actions.run_and_verify_svn2([], expected_err, 0,
-                                      'unlock',
-                                      '--username', svntest.main.wc_author2,
-                                      pi_path)
+  svntest.actions.run_and_verify_svn([], expected_err,
+                                     'unlock',
+                                     '--username', svntest.main.wc_author2,
+                                     pi_path)
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
 
@@ -1421,9 +1420,9 @@ def lock_twice_in_one_wc(sbox):
   svntest.actions.run_and_verify_svn(None, [],
                                      'lock', mu_path, '-m', 'Locked here')
 
-  # Locking in location 2 should fail ### Currently returns exitcode 0
-  svntest.actions.run_and_verify_svn2(None, ".*is already locked.*", 0,
-                                      'lock', '-m', '', mu2_path)
+  # Locking in location 2 should fail
+  svntest.actions.run_and_verify_svn(None, ".*is already locked.*",
+                                     'lock', '-m', '', mu2_path)
 
   # Change the file anyway
   os.chmod(mu2_path, 0700)
@@ -1469,8 +1468,8 @@ def lock_path_not_in_head(sbox):
   # ..\..\..\subversion\libsvn_client\ra.c:275: (apr_err=235000)
   # svn: In file '..\..\..\subversion\libsvn_ra_serf\util.c' line 1120:
   #  assertion failed (ctx->status_code)
-  svntest.actions.run_and_verify_svn2(None, expected_lock_fail_err_re,
-                                      0, 'lock', lambda_path)
+  svntest.actions.run_and_verify_svn(None, expected_lock_fail_err_re,
+                                     'lock', lambda_path)
 
   expected_err = 'svn: E155008: The node \'.*D\' is not a file'
   svntest.actions.run_and_verify_svn(None, expected_err,
@@ -1679,8 +1678,8 @@ def block_unlock_if_pre_unlock_hook_fail
 
   # Make sure the unlock operation fails as pre-unlock hook blocks it.
   expected_unlock_fail_err_re = ".*error text"
-  svntest.actions.run_and_verify_svn2(None, expected_unlock_fail_err_re,
-                                      0, 'unlock', pi_path)
+  svntest.actions.run_and_verify_svn(None, expected_unlock_fail_err_re,
+                                     'unlock', pi_path)
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
 #----------------------------------------------------------------------
@@ -1699,10 +1698,10 @@ def lock_invalid_token(sbox):
   fname = 'iota'
   file_path = os.path.join(sbox.wc_dir, fname)
 
-  svntest.actions.run_and_verify_svn2(None,
-                                      "svn: warning: W160037: " \
-                                      ".*scheme.*'opaquelocktoken'", 0,
-                                      'lock', '-m', '', file_path)
+  svntest.actions.run_and_verify_svn(None,
+                                     "svn: warning: W160037: " \
+                                     ".*scheme.*'opaquelocktoken'",
+                                     'lock', '-m', '', file_path)
 
 @Issue(3105)
 def lock_multi_wc(sbox):
@@ -1922,27 +1921,29 @@ def lock_hook_messages(sbox):
   svntest.actions.create_failing_hook(repo_dir, "pre-lock", error_msg)
   svntest.actions.create_failing_hook(repo_dir, "pre-unlock", error_msg)
 
-  _, _, actual_stderr = svntest.actions.run_and_verify_svn2(
-                                     [], svntest.verify.AnyOutput, 0,
+  _, _, actual_stderr = svntest.actions.run_and_verify_svn(
+                                     [], svntest.verify.AnyOutput,
                                      'lock', mu_url)
-  if len(actual_stderr) > 2:
-    actual_stderr = actual_stderr[-2:]
+  if len(actual_stderr) > 4:
+    actual_stderr = actual_stderr[-4:-2] + actual_stderr[-1:]
   expected_err = [
     'svn: warning: W165001: ' + svntest.actions.hook_failure_message('pre-lock'),
     error_msg + "\n",
+    "svn: E200009: One or more locks could not be obtained\n",
   ]
   svntest.verify.compare_and_display_lines(None, 'STDERR',
                                            expected_err, actual_stderr)
 
 
-  _, _, actual_stderr = svntest.actions.run_and_verify_svn2(
-                                     [], svntest.verify.AnyOutput, 0,
+  _, _, actual_stderr = svntest.actions.run_and_verify_svn(
+                                     [], svntest.verify.AnyOutput,
                                      'unlock', iota_url)
-  if len(actual_stderr) > 2:
-    actual_stderr = actual_stderr[-2:]
+  if len(actual_stderr) > 4:
+    actual_stderr = actual_stderr[-4:-2] + actual_stderr[-1:]
   expected_err = [
     'svn: warning: W165001: ' + svntest.actions.hook_failure_message('pre-unlock'),
     error_msg + "\n",
+    "svn: E200009: One or more locks could not be released\n",
   ]
   svntest.verify.compare_and_display_lines(None, 'STDERR',
                                            expected_err, actual_stderr)
@@ -2036,15 +2037,15 @@ def dav_lock_timeout(sbox):
   expiration_date = svntest.actions.run_and_parse_info(sbox.repo_url + '/iota')[0]['Lock Expires']
 
   # Verify that there is a lock, by trying to obtain one
-  svntest.actions.run_and_verify_svn2(None, ".*locked by user", 0,
-                                      'lock', '-m', '', sbox.ospath('iota'))
+  svntest.actions.run_and_verify_svn(None, ".*locked by user",
+                                     'lock', '-m', '', sbox.ospath('iota'))
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.tweak('iota', writelocked='O')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
   # This used to fail over serf with a parse error of the timeout.
   expected_err = "svn: warning: W160039:"
-  svntest.actions.run_and_verify_svn2(None, expected_err, 0,
+  svntest.actions.run_and_verify_svn(None, expected_err,
                                      'unlock', sbox.repo_url + '/iota')
 
   # Force unlock via working copy, this also used to fail over serf.
@@ -2193,27 +2194,27 @@ def many_locks_hooks(sbox):
                                          '  sys.exit(1)\n'
                                          'sys.exit(0)\n')
 
-  svntest.actions.run_and_verify_svn2(".* locked",
-                                      "svn: warning: W165001: .*", 0,
-                                      'lock',
-                                      sbox.ospath('iota'),
-                                      sbox.ospath('A/mu'),
-                                      sbox.ospath('A/B/E/alpha'),
-                                      sbox.ospath('A/D/G/pi'),
-                                      sbox.ospath('A/D/G/rho'))
+  svntest.actions.run_and_verify_svn(".* locked",
+                                     "svn: warning: W165001: .*",
+                                     'lock',
+                                     sbox.ospath('iota'),
+                                     sbox.ospath('A/mu'),
+                                     sbox.ospath('A/B/E/alpha'),
+                                     sbox.ospath('A/D/G/pi'),
+                                     sbox.ospath('A/D/G/rho'))
 
   expected_status = svntest.actions.get_virginal_state(wc_dir, 1)
   expected_status.tweak('iota', 'A/mu', 'A/B/E/alpha', 'A/D/G/rho',
                         writelocked='K')
   svntest.actions.run_and_verify_status(wc_dir, expected_status)
 
-  svntest.actions.run_and_verify_svn2(".* unlocked",
-                                      "svn: warning: W165001: .*", 0,
-                                      'unlock',
-                                      sbox.ospath('iota'),
-                                      sbox.ospath('A/mu'),
-                                      sbox.ospath('A/B/E/alpha'),
-                                      sbox.ospath('A/D/G/rho'))
+  svntest.actions.run_and_verify_svn(".* unlocked",
+                                     "svn: warning: W165001: .*",
+                                     'unlock',
+                                     sbox.ospath('iota'),
+                                     sbox.ospath('A/mu'),
+                                     sbox.ospath('A/B/E/alpha'),
+                                     sbox.ospath('A/D/G/rho'))
 
   expected_status.tweak('iota', 'A/B/E/alpha', 'A/D/G/rho',
                         writelocked=None)