[prev in list] [next in list] [prev in thread] [next in thread] 

List:       subversion-commits
Subject:    svn commit: r1847678 [24/25] - in /subversion/branches/swig-py3: ./ build/ build/ac-macros/ build/ge
From:       cmpilato () apache ! org
Date:       2018-11-28 21:25:35
Message-ID: 20181128212540.B1DBF3A2F2C () svn01-us-west ! apache ! org
[Download RAW message or body]

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_fs/fs-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_fs/fs-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_fs/fs-test.c (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_fs/fs-test.c Wed Nov 28 \
21:25:32 2018 @@ -7369,6 +7369,78 @@ closest_copy_test_svn_4677(const svn_tes
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_closest_copy_file_replaced_with_dir(const svn_test_opts_t *opts,
+                                         apr_pool_t *pool)
+{
+  svn_fs_t *fs;
+  svn_fs_txn_t *txn;
+  svn_fs_root_t *txn_root;
+  svn_fs_root_t *rev_root;
+  svn_revnum_t youngest_rev;
+  svn_fs_root_t *copy_root;
+  const char *copy_path;
+
+  /* Prepare a filesystem. */
+  SVN_ERR(svn_test__create_fs(&fs, "test-closest-copy-file-replaced-with-dir",
+                              opts, pool));
+
+  youngest_rev = 0;
+
+  /* Modeled after the case described in the thread:
+       "[PATCH] A test for "Can't get entries" error"
+       https://lists.apache.org/thread.html/693a95b0da834387e78a7f08df2392b634397d32f37428c81c02f8c5@%3Cdev.subversion.apache.org%3E
 +  */
+  /* r1: Add a directory with a file. */
+  SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+  SVN_ERR(svn_fs_make_dir(txn_root, "/A", pool));
+  SVN_ERR(svn_fs_make_file(txn_root, "/A/mu", pool));
+  SVN_ERR(test_commit_txn(&youngest_rev, txn, NULL, pool));
+  SVN_TEST_INT_ASSERT(youngest_rev, 1);
+
+  /* r2: Copy the directory. */
+  SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+  SVN_ERR(svn_fs_revision_root(&rev_root, fs, 1, pool));
+  SVN_ERR(svn_fs_copy(rev_root, "/A", txn_root, "/B", pool));
+  SVN_ERR(test_commit_txn(&youngest_rev, txn, NULL, pool));
+  SVN_TEST_INT_ASSERT(youngest_rev, 2);
+
+  /* r3: Delete the file. */
+  SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+  SVN_ERR(svn_fs_delete(txn_root, "/B/mu", pool));
+  SVN_ERR(test_commit_txn(&youngest_rev, txn, NULL, pool));
+  SVN_TEST_INT_ASSERT(youngest_rev, 3);
+
+  /* r4: Replace the file with a new directory containing a file. */
+  SVN_ERR(svn_fs_begin_txn2(&txn, fs, youngest_rev, 0, pool));
+  SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
+  SVN_ERR(svn_fs_make_dir(txn_root, "/B/mu", pool));
+  SVN_ERR(svn_fs_make_file(txn_root, "/B/mu/iota", pool));
+  SVN_ERR(test_commit_txn(&youngest_rev, txn, NULL, pool));
+  SVN_TEST_INT_ASSERT(youngest_rev, 4);
+
+  /* Test a couple of svn_fs_closest_copy() calls; the second call used
+     to fail with an unexpected SVN_ERR_FS_NOT_DIRECTORY error. */
+
+  SVN_ERR(svn_fs_revision_root(&rev_root, fs, 2, pool));
+  SVN_ERR(svn_fs_closest_copy(&copy_root, &copy_path, rev_root, "/B/mu", pool));
+
+  SVN_TEST_ASSERT(copy_root != NULL);
+  SVN_TEST_INT_ASSERT(svn_fs_revision_root_revision(copy_root), 2);
+  SVN_TEST_STRING_ASSERT(copy_path, "/B");
+
+  SVN_ERR(svn_fs_revision_root(&rev_root, fs, 4, pool));
+  SVN_ERR(svn_fs_closest_copy(&copy_root, &copy_path, rev_root, "/B/mu/iota", \
pool)); +
+  SVN_TEST_ASSERT(copy_root == NULL);
+  SVN_TEST_ASSERT(copy_path == NULL);
+
+  return SVN_NO_ERROR;
+}
+
 /* ------------------------------------------------------------------------ */
 
 /* The test table.  */
@@ -7513,6 +7585,8 @@ static struct svn_test_descriptor_t test
                        "test rep-sharing on content rather than SHA1"),
     SVN_TEST_OPTS_PASS(closest_copy_test_svn_4677,
                        "test issue SVN-4677 regression"),
+    SVN_TEST_OPTS_PASS(test_closest_copy_file_replaced_with_dir,
+                       "svn_fs_closest_copy after replacing file with dir"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_repos/authz-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_repos/authz-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_repos/authz-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_repos/authz-test.c Wed Nov \
28 21:25:32 2018 @@ -444,6 +444,73 @@ test_global_rights(apr_pool_t *pool)
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+issue_4741_groups(apr_pool_t *pool)
+{
+   const char rules[] =
+     "[groups]"      NL
+     "g1 = userA"    NL
+     "g2 = userB"    NL
+     "g = @g1, @g2"  NL
+     ""              NL
+     "[/]"           NL
+     "* ="           NL
+     "@g = rw"       NL
+     ;
+
+   svn_stringbuf_t *buf = svn_stringbuf_create(rules, pool);
+   svn_stream_t *stream = svn_stream_from_stringbuf(buf, pool);
+   svn_authz_t *authz;
+   svn_boolean_t access_granted;
+
+   SVN_ERR(svn_repos_authz_parse(&authz, stream, NULL, pool));
+
+   SVN_ERR(svn_repos_authz_check_access(authz, "repo", "/", "userA",
+                                        svn_authz_write, &access_granted,
+                                        pool));
+   SVN_TEST_ASSERT(access_granted == TRUE);
+
+   SVN_ERR(svn_repos_authz_check_access(authz, "repo", "/", "userB",
+                                        svn_authz_write, &access_granted,
+                                        pool));
+   SVN_TEST_ASSERT(access_granted == TRUE);
+
+   return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+reposful_reposless_stanzas_inherit(apr_pool_t *pool)
+{
+  const char rules[] = 
+    "[groups]"                               NL
+    "company = user1, user2, user3"          NL
+    "customer = customer1, customer2"        NL
+    ""                                       NL
+    "# company can read-write on everything" NL
+    "[/]"                                    NL
+    "@company = rw"                          NL
+    ""                                       NL
+    "[project1:/]"                           NL
+    "@customer = r"                          NL
+    ""                                       NL
+    "[project2:/]"                           NL;
+
+   svn_stringbuf_t *buf = svn_stringbuf_create(rules, pool);
+   svn_stream_t *stream = svn_stream_from_stringbuf(buf, pool);
+   svn_authz_t *authz;
+   svn_boolean_t access_granted;
+
+   SVN_ERR(svn_repos_authz_parse(&authz, stream, NULL, pool));
+
+   SVN_ERR(svn_repos_authz_check_access(authz, "project1", "/foo", "user1",
+                                        svn_authz_write | svn_authz_recursive,
+                                        &access_granted,
+                                        pool));
+   SVN_TEST_ASSERT(access_granted == TRUE);
+
+   return SVN_NO_ERROR;
+}
+
 static int max_threads = 4;
 
 static struct svn_test_descriptor_t test_funcs[] =
@@ -453,6 +520,10 @@ static struct svn_test_descriptor_t test
                        "test svn_authz__parse"),
     SVN_TEST_PASS2(test_global_rights,
                    "test svn_authz__get_global_rights"),
+    SVN_TEST_PASS2(issue_4741_groups,
+                   "issue 4741 groups"),
+    SVN_TEST_XFAIL2(reposful_reposless_stanzas_inherit,
+                    "[foo:/] inherits [/]"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_repos/repos-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_repos/repos-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_repos/repos-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_repos/repos-test.c Wed Nov \
28 21:25:32 2018 @@ -4461,7 +4461,7 @@ test_list(const svn_test_opts_t *opts,
   SVN_ERR(svn_repos_list(rev_root, "/A", patterns, svn_depth_infinity, FALSE,
                          NULL, NULL, list_callback, &counter, NULL, NULL,
                          pool));
-  SVN_TEST_ASSERT(counter == 6);
+  SVN_TEST_ASSERT(counter == 7);
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_subr/mergeinfo-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_subr/mergeinfo-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_subr/mergeinfo-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_subr/mergeinfo-test.c Wed \
Nov 28 21:25:32 2018 @@ -1673,100 +1673,27 @@ \
test_remove_prefix_from_catalog(apr_pool  static svn_error_t *
 test_rangelist_merge_overlap(apr_pool_t *pool)
 {
-  svn_rangelist_t * changes;
-  /* 15014-19472,19473-19612*,19613-19614,19615-19630*,19631-19634,19635-20055* */
-  svn_rangelist_t * rangelist = apr_array_make(pool, 1, sizeof(svn_merge_range_t \
                *));
-  svn_merge_range_t *mrange = apr_pcalloc(pool, sizeof(*mrange));
-
-  /* This range is optional for reproducing issue #4686 */
-  mrange->start = 15013;
-  mrange->end = 19472;
-  mrange->inheritable = TRUE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 19472;
-  mrange->end = 19612;
-  mrange->inheritable = FALSE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  /* This range is optional for reproducing issue #4686 */
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 19612;
-  mrange->end = 19614;
-  mrange->inheritable = TRUE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 19614;
-  mrange->end = 19630;
-  mrange->inheritable = FALSE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 19630;
-  mrange->end = 19634;
-  mrange->inheritable = TRUE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  /* This range is optional for reproducing issue #4686 */
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 19634;
-  mrange->end = 20055;
-  mrange->inheritable = FALSE;
-  APR_ARRAY_PUSH(rangelist, svn_merge_range_t *) = mrange;
-
-  /* 15014-20515* */
-  changes = apr_array_make(pool, 1, sizeof(svn_merge_range_t *));
-  mrange = apr_pcalloc(pool, sizeof(*mrange));
-  mrange->start = 15013;
-  mrange->end = 20515;
-  mrange->inheritable = FALSE;
-  APR_ARRAY_PUSH(changes, svn_merge_range_t *) = mrange;
-#if 0
-  {
-    svn_string_t * tmpString;
-
-    svn_rangelist_to_string(&tmpString, rangelist, pool);
-    printf("rangelist %s\n", tmpString->data);
-  }
-  {
-    svn_string_t * tmpString;
-
-    svn_rangelist_to_string(&tmpString, changes, pool);
-    printf("changes %s\n", tmpString->data);
-  }
-#endif
-
+  const char *rangelist_str = "19473-19612*,19615-19630*,19631-19634";
+  const char *changes_str = "15014-20515*";
+  const char *expected_str = "15014-19630*,19631-19634,19635-20515*";
+  /* wrong result: "15014-19630*,19634-19631*,19631-19634,19635-20515*" */
+  svn_rangelist_t *rangelist, *changes;
+  svn_string_t *result_string;
+
+  /* prepare the inputs */
+  SVN_ERR(svn_rangelist__parse(&rangelist, rangelist_str, pool));
+  SVN_ERR(svn_rangelist__parse(&changes, changes_str, pool));
   SVN_TEST_ASSERT(svn_rangelist__is_canonical(rangelist));
   SVN_TEST_ASSERT(svn_rangelist__is_canonical(changes));
 
+  /* perform the merge */
   SVN_ERR(svn_rangelist_merge2(rangelist, changes, pool, pool));
 
+  /* check the output */
   SVN_TEST_ASSERT(svn_rangelist__is_canonical(rangelist));
+  SVN_ERR(svn_rangelist_to_string(&result_string, rangelist, pool));
+  SVN_TEST_STRING_ASSERT(result_string->data, expected_str);
 
-#if 0
-  {
-    svn_string_t * tmpString;
-
-    svn_rangelist_to_string(&tmpString, rangelist, pool);
-    printf("result %s\n", tmpString->data);
-  }
-#endif
-
-  /* wrong result
-    result 15014-19472,19473-19612*,19613-19614,19615-19630*,19634-19631*,19631-19634,19635-20515*
                
-  */
-
-  {
-     svn_string_t * tmp_string;
-     svn_rangelist_t *range_list;
-
-     SVN_ERR(svn_rangelist_to_string(&tmp_string, rangelist, pool));
-
-     SVN_ERR(svn_rangelist__parse(&range_list, tmp_string->data, pool));
-  }
-  
   return SVN_NO_ERROR;
 }
 
@@ -1900,9 +1827,9 @@ static struct svn_test_descriptor_t test
                    "diff of rangelists"),
     SVN_TEST_PASS2(test_remove_prefix_from_catalog,
                    "removal of prefix paths from catalog keys"),
-    SVN_TEST_XFAIL2(test_rangelist_merge_overlap,
+    SVN_TEST_PASS2(test_rangelist_merge_overlap,
                    "merge of rangelists with overlaps (issue 4686)"),
-    SVN_TEST_XFAIL2(test_rangelist_loop,
+    SVN_TEST_PASS2(test_rangelist_loop,
                     "test rangelist edgecases via loop"),
     SVN_TEST_NULL
   };

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_subr/utf-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_subr/utf-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_subr/utf-test.c (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_subr/utf-test.c Wed Nov 28 \
21:25:32 2018 @@ -752,8 +752,10 @@ test_utf_conversions(apr_pool_t *pool)
   {
     svn_boolean_t sixteenbit;
     svn_boolean_t bigendian;
+    apr_size_t sourcelen;
     const char *source;
     const char *result;
+    svn_boolean_t counted;
   } tests[] = {
 
 #define UTF_32_LE FALSE, FALSE
@@ -762,32 +764,36 @@ test_utf_conversions(apr_pool_t *pool)
 #define UTF_16_BE TRUE, TRUE
 
     /* Normal character conversion */
-    { UTF_32_LE, "t\0\0\0" "e\0\0\0" "s\0\0\0" "t\0\0\0" "\0\0\0\0", "test" },
-    { UTF_32_BE, "\0\0\0t" "\0\0\0e" "\0\0\0s" "\0\0\0t" "\0\0\0\0", "test" },
-    { UTF_16_LE, "t\0" "e\0" "s\0" "t\0" "\0\0", "test" },
-    { UTF_16_BE, "\0t" "\0e" "\0s" "\0t" "\0\0", "test" },
+    { UTF_32_LE, 4, "t\0\0\0" "e\0\0\0" "s\0\0\0" "t\0\0\0" "\0\0\0\0", "test", \
FALSE }, +    { UTF_32_BE, 4, "\0\0\0t" "\0\0\0e" "\0\0\0s" "\0\0\0t" "\0\0\0\0", \
"test", FALSE }, +    { UTF_16_LE, 4, "t\0" "e\0" "s\0" "t\0" "\0\0", "test", FALSE \
}, +    { UTF_16_BE, 4, "\0t" "\0e" "\0s" "\0t" "\0\0", "test", FALSE },
 
     /* Valid surrogate pairs */
-    { UTF_16_LE, "\x00\xD8" "\x00\xDC" "\0\0", "\xf0\x90\x80\x80" }, /* U+010000 */
-    { UTF_16_LE, "\x34\xD8" "\x1E\xDD" "\0\0", "\xf0\x9d\x84\x9e" }, /* U+01D11E */
-    { UTF_16_LE, "\xFF\xDB" "\xFD\xDF" "\0\0", "\xf4\x8f\xbf\xbd" }, /* U+10FFFD */
-
-    { UTF_16_BE, "\xD8\x00" "\xDC\x00" "\0\0", "\xf0\x90\x80\x80" }, /* U+010000 */
-    { UTF_16_BE, "\xD8\x34" "\xDD\x1E" "\0\0", "\xf0\x9d\x84\x9e" }, /* U+01D11E */
-    { UTF_16_BE, "\xDB\xFF" "\xDF\xFD" "\0\0", "\xf4\x8f\xbf\xbd" }, /* U+10FFFD */
+    { UTF_16_LE, 2, "\x00\xD8" "\x00\xDC" "\0\0", "\xf0\x90\x80\x80", FALSE }, /* \
U+010000 */ +    { UTF_16_LE, 2, "\x34\xD8" "\x1E\xDD" "\0\0", "\xf0\x9d\x84\x9e", \
FALSE }, /* U+01D11E */ +    { UTF_16_LE, 2, "\xFF\xDB" "\xFD\xDF" "\0\0", \
"\xf4\x8f\xbf\xbd", FALSE }, /* U+10FFFD */ +
+    { UTF_16_BE, 2, "\xD8\x00" "\xDC\x00" "\0\0", "\xf0\x90\x80\x80", FALSE }, /* \
U+010000 */ +    { UTF_16_BE, 2, "\xD8\x34" "\xDD\x1E" "\0\0", "\xf0\x9d\x84\x9e", \
FALSE }, /* U+01D11E */ +    { UTF_16_BE, 2, "\xDB\xFF" "\xDF\xFD" "\0\0", \
"\xf4\x8f\xbf\xbd", FALSE }, /* U+10FFFD */  
     /* Swapped, single and trailing surrogate pairs */
-    { UTF_16_LE, "*\0" "\x00\xDC" "\x00\xD8" "*\0\0\0", "*\xed\xb0\x80" \
                "\xed\xa0\x80*" },
-    { UTF_16_LE, "*\0" "\x1E\xDD" "*\0\0\0", "*\xed\xb4\x9e*" },
-    { UTF_16_LE, "*\0" "\xFF\xDB" "*\0\0\0", "*\xed\xaf\xbf*" },
-    { UTF_16_LE, "\x1E\xDD" "\0\0", "\xed\xb4\x9e" },
-    { UTF_16_LE, "\xFF\xDB" "\0\0", "\xed\xaf\xbf" },
-
-    { UTF_16_BE, "\0*" "\xDC\x00" "\xD8\x00" "\0*\0\0", "*\xed\xb0\x80" \
                "\xed\xa0\x80*" },
-    { UTF_16_BE, "\0*" "\xDD\x1E" "\0*\0\0", "*\xed\xb4\x9e*" },
-    { UTF_16_BE, "\0*" "\xDB\xFF" "\0*\0\0", "*\xed\xaf\xbf*" },
-    { UTF_16_BE, "\xDD\x1E" "\0\0", "\xed\xb4\x9e" },
-    { UTF_16_BE, "\xDB\xFF" "\0\0", "\xed\xaf\xbf" },
+    { UTF_16_LE, 4, "*\0" "\x00\xDC" "\x00\xD8" "*\0\0\0", "*\xed\xb0\x80" \
"\xed\xa0\x80*", FALSE }, +    { UTF_16_LE, 3, "*\0" "\x1E\xDD" "*\0\0\0", \
"*\xed\xb4\x9e*", FALSE }, +    { UTF_16_LE, 3, "*\0" "\xFF\xDB" "*\0\0\0", \
"*\xed\xaf\xbf*", FALSE }, +    { UTF_16_LE, 1, "\x1E\xDD" "\0\0", "\xed\xb4\x9e", \
FALSE }, +    { UTF_16_LE, 1, "\xFF\xDB" "\0\0", "\xed\xaf\xbf", FALSE },
+
+    { UTF_16_BE, 4, "\0*" "\xDC\x00" "\xD8\x00" "\0*\0\0", "*\xed\xb0\x80" \
"\xed\xa0\x80*", FALSE }, +    { UTF_16_BE, 3, "\0*" "\xDD\x1E" "\0*\0\0", \
"*\xed\xb4\x9e*", FALSE }, +    { UTF_16_BE, 3, "\0*" "\xDB\xFF" "\0*\0\0", \
"*\xed\xaf\xbf*", FALSE }, +    { UTF_16_BE, 1, "\xDD\x1E" "\0\0", "\xed\xb4\x9e", \
FALSE }, +    { UTF_16_BE, 1, "\xDB\xFF" "\0\0", "\xed\xaf\xbf", FALSE },
+
+    /* Counted strings with NUL characters */
+    { UTF_16_LE, 3, "x\0" "\0\0" "y\0" "*\0", "x\0y", TRUE },
+    { UTF_32_BE, 3, "\0\0\0x" "\0\0\0\0" "\0\0\0y" "\0\0\0*", "x\0y", TRUE },
 
 #undef UTF_32_LE
 #undef UTF_32_BE
@@ -799,33 +805,46 @@ test_utf_conversions(apr_pool_t *pool)
 
   const struct cvt_test_t *tc;
   const svn_string_t *result;
-  int i;
+  apr_size_t maxlen = 0;
 
-  for (i = 1, tc = tests; tc->source; ++tc, ++i)
+  /* To assure proper alignment of the source string, it needs to be copied
+     into an array of the appropriate type before calling
+     svn_utf__utf{16,32}_to_utf8. */
+  apr_uint16_t *source16;
+  apr_int32_t *source32;
+
+  for (tc = tests; tc->source; ++tc)
+    if (tc->sourcelen > maxlen)
+      maxlen = tc->sourcelen;
+  maxlen++;
+
+  source16 = apr_pcalloc(pool, maxlen * sizeof(*source16));
+  source32 = apr_pcalloc(pool, maxlen * sizeof(*source32));
+
+  for (tc = tests; tc->source; ++tc)
     {
       if (tc->sixteenbit)
-        SVN_ERR(svn_utf__utf16_to_utf8(&result, (const void*)tc->source,
-                                       SVN_UTF__UNKNOWN_LENGTH,
-                                       tc->bigendian, pool, pool));
+        {
+          memset(source16, 0, maxlen * sizeof(*source16));
+          memcpy(source16, tc->source, (tc->sourcelen + 1) * sizeof(*source16));
+          SVN_ERR(svn_utf__utf16_to_utf8(&result, source16,
+                                         tc->counted ? tc->sourcelen : \
SVN_UTF__UNKNOWN_LENGTH, +                                         tc->bigendian, \
pool, pool)); +        }
       else
-        SVN_ERR(svn_utf__utf32_to_utf8(&result, (const void*)tc->source,
-                                       SVN_UTF__UNKNOWN_LENGTH,
-                                       tc->bigendian, pool, pool));
-      SVN_ERR_ASSERT(0 == strcmp(result->data, tc->result));
+        {
+          memset(source32, 0, maxlen * sizeof(*source32));
+          memcpy(source32, tc->source, (tc->sourcelen + 1) * sizeof(*source32));
+          SVN_ERR(svn_utf__utf32_to_utf8(&result, source32,
+                                         tc->counted ? tc->sourcelen : \
SVN_UTF__UNKNOWN_LENGTH, +                                         tc->bigendian, \
pool, pool)); +        }
+      if (tc->counted)
+        SVN_ERR_ASSERT(0 == memcmp(result->data, tc->result, tc->sourcelen));
+      else
+        SVN_ERR_ASSERT(0 == strcmp(result->data, tc->result));
     }
 
-  /* Test counted strings with NUL characters */
-  SVN_ERR(svn_utf__utf16_to_utf8(
-              &result, (void*)("x\0" "\0\0" "y\0" "*\0"), 3,
-              FALSE, pool, pool));
-  SVN_ERR_ASSERT(0 == memcmp(result->data, "x\0y", 3));
-
-  SVN_ERR(svn_utf__utf32_to_utf8(
-              &result,
-              (void*)("\0\0\0x" "\0\0\0\0" "\0\0\0y" "\0\0\0*"), 3,
-              TRUE, pool, pool));
-  SVN_ERR_ASSERT(0 == memcmp(result->data, "x\0y", 3));
-
   return SVN_NO_ERROR;
 }
 

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_subr/x509-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_subr/x509-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_subr/x509-test.c (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_subr/x509-test.c Wed Nov 28 \
21:25:32 2018 @@ -592,6 +592,32 @@ static struct x509_test cert_tests[] = {
     "good.example.com",
     "9693f17e59205f41ca2e14450d151b945651b2d7"
   },
+  /* Signed using RSASSA-PSS algorithm with algorithm parameters */
+  {
+    "MIICsjCCAWkCCQDHslXYA8hCxTA+BgkqhkiG9w0BAQowMaANMAsGCWCGSAFlAwQC"
+    "AaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiBAICAN4wKjEUMBIGA1UECgwL"
+    "TXkgTG9jYWwgQ0ExEjAQBgNVBAMMCWxvY2FsaG9zdDAeFw0xODAyMDIxNjQ4MzVa"
+    "Fw0xODAyMDMxNjQ4MzVaMC4xGDAWBgNVBAoMD015IExvY2FsIFNlcnZlcjESMBAG"
+    "A1UEAwwJbG9jYWxob3N0MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCues61"
+    "JXXpLQI5yeg4aCLWRfvnJY7wnuU6FSA++3wwCJREx1/7ebnP9RRRqqKM+ZeeFMC+"
+    "UlJE3ft2tJTDOVk9j6qjvKrJUKM1YkIe0lARxs4RtZKDGfOdBhw/+iD+6fZzhL0n"
+    "+w+dIJGzl6ADWsE/x9yjDTkdgbtxHrx/76K0KQIDAQABMD4GCSqGSIb3DQEBCjAx"
+    "oA0wCwYJYIZIAWUDBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIEAgIA"
+    "3gOCAQEABYRAijCSGyFdSuUYALUnNzPylqYXlW+dMKPywlUrFEhKnvS+FD9twerI"
+    "8kT4MDW6XvhScmL1MCDPNAkFY92UqaUrgT80oyrbpuakVrxFSS1i28xy8+kXAWYq"
+    "RNQVaME1NqnATYF0ZMD5xQK4rpa76gvWj3K8Lt++9EjjbkNiirIIMQEOxh1lwnDQ"
+    "81q1Rk6iujlnVDGHDQ+w8reE6fKfSWfv1EaQRcjNKCuzrW8WNN387G2byvwaaKeL"
+    "M7lV7wiV6PwrTNTZzVG3cWKDOEP1mGE7gyMu66siLECo8U95+ahK7O6vfeT3m3gv"
+    "7kzWNYozAQtBSC7b0WqWbVrzWI4HSg==",
+    "O=My Local Server, CN=localhost",
+    "2.5.4.10 2.5.4.3",
+    "O=My Local CA, CN=localhost",
+    "2.5.4.10 2.5.4.3",
+    "2018-02-02T16:48:35.000000Z ",
+    "2018-02-03T16:48:35.000000Z ",
+    "localhost",
+    "25ab5a059acfc793fc0d3734d426794a4ca7b631"
+  },
   { NULL }
 };
 

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_wc/conflict-data-test.c
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_wc/conflict-data-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_wc/conflict-data-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_wc/conflict-data-test.c Wed \
Nov 28 21:25:32 2018 @@ -594,6 +594,7 @@ test_serialize_tree_conflict(const svn_t
                               svn_wc_conflict_reason_moved_away,
                               svn_wc_conflict_action_delete,
                               sbox_wc_path(&sbox, "A/B"),
+                              sbox_wc_path(&sbox, "A/C"),
                               pool, pool));
 
   SVN_ERR(svn_wc__conflict_skel_set_op_switch(
@@ -610,11 +611,13 @@ test_serialize_tree_conflict(const svn_t
   {
     svn_wc_conflict_reason_t reason;
     svn_wc_conflict_action_t action;
-    const char *moved_away_op_root_abspath;
+    const char *moved_away_src_op_root_abspath;
+    const char *moved_away_dst_op_root_abspath;
 
     SVN_ERR(svn_wc__conflict_read_tree_conflict(&reason,
                                                 &action,
-                                                &moved_away_op_root_abspath,
+                                                &moved_away_src_op_root_abspath,
+                                                &moved_away_dst_op_root_abspath,
                                                 sbox.wc_ctx->db,
                                                 sbox.wc_abspath,
                                                 conflict_skel,
@@ -622,8 +625,10 @@ test_serialize_tree_conflict(const svn_t
 
     SVN_TEST_ASSERT(reason == svn_wc_conflict_reason_moved_away);
     SVN_TEST_ASSERT(action == svn_wc_conflict_action_delete);
-    SVN_TEST_STRING_ASSERT(moved_away_op_root_abspath,
+    SVN_TEST_STRING_ASSERT(moved_away_src_op_root_abspath,
                            sbox_wc_path(&sbox, "A/B"));
+    SVN_TEST_STRING_ASSERT(moved_away_dst_op_root_abspath,
+                           sbox_wc_path(&sbox, "A/C"));
   }
 
   return SVN_NO_ERROR;

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_wc/op-depth-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_wc/op-depth-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_wc/op-depth-test.c Wed Nov \
28 21:25:32 2018 @@ -535,7 +535,7 @@ check_db_conflicts(svn_test__sandbox_t *
           SVN_ERR(svn_wc__conflict_read_tree_conflict(&info->tc.reason,
                                                       &info->tc.action,
                                                       &move_src_abspath,
-                                                      b->wc_ctx->db,
+                                                      NULL, b->wc_ctx->db,
                                                       local_abspath,
                                                       conflict,
                                                       b->pool, iterpool));

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_wc/utils.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_wc/utils.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_wc/utils.c (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_wc/utils.c Wed Nov 28 \
21:25:32 2018 @@ -417,11 +417,12 @@ sbox_wc_revert(svn_test__sandbox_t *b, c
   SVN_ERR(svn_wc__acquire_write_lock(&lock_root_abspath, b->wc_ctx,
                                      dir_abspath, FALSE /* lock_anchor */,
                                      b->pool, b->pool));
-  SVN_ERR(svn_wc_revert5(b->wc_ctx, abspath, depth,
+  SVN_ERR(svn_wc_revert6(b->wc_ctx, abspath, depth,
                          FALSE /* use_commit_times */,
                          NULL /* changelist_filter */,
                          FALSE /* clear_changelists */,
                          FALSE /* metadata_only */,
+                         TRUE /*added_keep_local*/,
                          NULL, NULL, /* cancel baton + func */
                          NULL, NULL, /* notify baton + func */
                          b->pool));

Modified: subversion/branches/swig-py3/subversion/tests/libsvn_wc/wc-queries-test.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/libsvn_wc/wc-queries-test.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/libsvn_wc/wc-queries-test.c \
                (original)
+++ subversion/branches/swig-py3/subversion/tests/libsvn_wc/wc-queries-test.c Wed Nov \
28 21:25:32 2018 @@ -99,6 +99,7 @@ static const int slow_statements[] =
   STMT_SELECT_DELETE_LIST,
   STMT_SELECT_UPDATE_MOVE_LIST,
   STMT_FIND_REPOS_PATH_IN_WC,
+  STMT_SELECT_PRESENT_HIGHEST_WORKING_NODES_BY_BASENAME_AND_KIND,
 
   /* Designed as slow to avoid penalty on other queries */
   STMT_SELECT_UNREFERENCED_PRISTINES,

Modified: subversion/branches/swig-py3/subversion/tests/svn_test_main.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/tests/svn_test_main.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/subversion/tests/svn_test_main.c (original)
+++ subversion/branches/swig-py3/subversion/tests/svn_test_main.c Wed Nov 28 21:25:32 \
2018 @@ -903,9 +903,12 @@ svn_test_main(int argc, const char *argv
       apr_err = apr_getopt_long(os, cl_options, &opt_id, &opt_arg);
       if (APR_STATUS_IS_EOF(apr_err))
         break;
-      else if (apr_err && (apr_err != APR_BADCH))
+      else if (apr_err)
         {
           /* Ignore invalid option error to allow passing arbitrary options */
+          if (apr_err == APR_BADCH)
+            continue;
+
           fprintf(stderr, "apr_getopt_long failed : [%d] %s\n",
                   apr_err, apr_strerror(apr_err, errmsg, sizeof(errmsg)));
           exit(1);

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/bb-openbsd/svnbuild.sh
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/bb-openbsd/svnbuild.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/bb-openbsd/svnbuild.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/bb-openbsd/svnbuild.sh Wed Nov \
28 21:25:32 2018 @@ -25,4 +25,5 @@ set -x
 url="$(svn info --show-item url)"
 branch="${url##*/}"
 (test -h ../GNUmakefile || ln -s ../unix-build/Makefile.svn ../GNUmakefile)
+touch ../objdir/svn-${branch}/.retrieved
 (cd .. && gmake BRANCH="$branch" THREADING="no" JAVA="no" MAKE_JOBS=8)

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/setenv.sh
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/setenv.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/setenv.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/setenv.sh Wed \
Nov 28 21:25:32 2018 @@ -24,8 +24,9 @@
 ##     SVNBB_SERF               Serf installation prefix
 ##                              Note: Serf should be built only
 ##                                    with the system APR/-Util.
+##     SVNBB_APR                Path of the default APR
+##     SVNBB_APRUTIL            Path of the default APR-Util
 ##     SVNBB_APR_13_NOTHREAD    Path of APR-1.3 with threading disabled
-##     SVNBB_APR_15             Path of APR-1.5
 ##     SVNBB_APR_20_DEV         Path of APR-2.0
 ##     SVNBB_JUNIT              The path of the junit.jar
 ##     SVNBB_PARALLEL           Optional: parallelization; defaults to 2
@@ -45,7 +46,8 @@ export SVNBB_BDB
 export SVNBB_SWIG
 export SVNBB_SERF
 export SVNBB_APR_13_NOTHREAD
-export SVNBB_APR_15
+export SVNBB_APR
+export SVNBB_APRUTIL
 export SVNBB_APR_20_DEV
 export SVNBB_JUNIT
 export SVNBB_PARALLEL

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild-bindings.sh \
Wed Nov 28 21:25:32 2018 @@ -25,21 +25,16 @@ scripts=$(cd $(dirname "$0") && pwd)
 . ${scripts}/setenv.sh
 
 #
-# Step 4: build swig-py
+# Step 4: build bindings
 #
 
-echo "============ make swig-py"
-cd ${absbld}
-make swig-py
+build_bindings() {
+    echo "============ make $1"
+    cd ${absbld}
+    make $1
+}
 
-echo "============ make swig-pl"
-cd ${absbld}
-make swig-pl
-
-echo "============ make swig-rb"
-cd ${absbld}
-make swig-rb
-
-echo "============ make javahl"
-cd ${absbld}
-make javahl
+build_bindings swig-py
+build_bindings swig-pl
+build_bindings swig-rb
+build_bindings javahl

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svnbuild.sh Wed \
Nov 28 21:25:32 2018 @@ -27,17 +27,33 @@ scripts=$(cd $(dirname "$0") && pwd)
 ${scripts}/mkramdisk.sh ${volume_name} ${ramconf}
 
 # These are the default APR and Serf config options
-serfconfig="--with-serf=${SVNBB_SERF} --with-apxs=/usr/sbin/apxs"
+serfconfig=" --with-serf=${SVNBB_SERF} --with-apxs=/usr/local/opt/httpd/bin/apxs"
 
 # An optional parameter tells build scripts which version of APR to use
 if [ ! -z "$1" ]; then
     aprdir=$(eval 'echo $SVNBB_'"$1")
+else
+    aprconfig="--with-apr=${SVNBB_APR} --with-apr-util=${SVNBB_APRUTIL}"
 fi
 if [ ! -z "${aprdir}" -a  -d "${aprdir}" ]; then
     aprconfig="--with-apr=${aprdir} --with-apr-util=${aprdir}"
     serfconfig=" --without-serf --without-apxs"
 fi
 
+# An optional parameter tells us if this is a warnings-only build.
+# We run the warnings build with a number of additional options.
+if [ "$2" = "warnings" ]; then
+    parallel=1
+    maintainer_mode=' -q --enable-maintainer-mode'
+    config_cflags="-Wno-deprecated-declarations"
+    config_cflags="${config_cflags} -DPACK_AFTER_EVERY_COMMIT"
+    config_cflags="${config_cflags} -DSVN_UNALIGNED_ACCESS_IS_OK=0"
+    config_cflags="${config_cflags} -DSUFFIX_LINES_TO_KEEP=0"
+    config_cflags="${config_cflags} -DSVN_DEPRECATED="
+else
+    parallel=${SVNBB_PARALLEL}
+fi
+
 #
 # Step 0: Create a directory for the test log files
 #
@@ -82,8 +98,10 @@ fi
 
 echo "============ configure"
 cd ${absbld}
-env CC=clang CXX=clang++ \
-${abssrc}/configure \
+env CC=clang CFLAGS="${config_cflags}" \
+    CXX=clang++ CXXFLAGS="${config_cxxflags}" \
+    LDFLAGS='-Wl,-w' \
+${abssrc}/configure${maintainer_mode} \
     --prefix="${absbld}/.install-prefix" \
     --enable-debug${optimizeconfig} \
     --disable-nls \
@@ -91,6 +109,7 @@ ${abssrc}/configure \
     ${aprconfig}${serfconfig} \
     --with-swig="${SVNBB_SWIG}" \
     --with-berkeley-db=db.h:"${SVNBB_BDB}/include":${SVNBB_BDB}/lib:db \
+    --enable-bdb6 \
     --enable-javahl \
     --without-jikes \
     ${lz4config} \
@@ -105,4 +124,4 @@ test -f config.log && mv config.log "${a
 
 echo "============ make"
 cd ${absbld}
-make -j${SVNBB_PARALLEL}
+make -j${parallel}

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck-bindings.sh \
Wed Nov 28 21:25:32 2018 @@ -24,6 +24,8 @@ run_tests() {
 
     echo "============ make check-${check}"
     cd ${absbld}
+    make -s install
+    make -s install-${check}
     make check-${check} ${cleanup} || exit 1
 }
 

Modified: subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh \
                (original)
+++ subversion/branches/swig-py3/tools/buildbot/slaves/svn-x64-macosx/svncheck.sh Wed \
Nov 28 21:25:32 2018 @@ -24,15 +24,22 @@ run_tests() {
     ok=true
 
     case "${ra}" in
-        local) check=check;             skipC=;;
-        svn)   check=svnserveautocheck; skipC="SKIP_C_TESTS=1";;
-        dav)   check=davautocheck;      skipC="SKIP_C_TESTS=1";;
+        local) check=check;             more=;;
+        svn)   check=svnserveautocheck; more="SKIP_C_TESTS=1";;
+        dav)   check=davautocheck;      more="SKIP_C_TESTS=1";
+               if [ "${fs}" == "bdb" ]; then
+                   more="${more} APACHE_MPM=prefork"
+               else
+                   more="${more} APACHE_MPM=event"
+               fi;;
         *)     exit 1;;
     esac
 
+    ${allow_remote} && more="${more} ALLOW_REMOTE_HTTP_CONNECTION=1"
+
     echo "============ make check ${ra}+${fs}"
     cd ${absbld}
-    make ${check} FS_TYPE=${fs} PARALLEL=${SVNBB_PARALLEL} CLEANUP=1 ${skipC} || \
ok=false +    make ${check} FS_TYPE=${fs} PARALLEL=${SVNBB_PARALLEL} CLEANUP=1 \
${more} || ok=false  
     # Move any log files to the buildbot work directory
     test -f tests.log && mv tests.log "${abssrc}/.test-logs/tests-${ra}-${fs}.log"
@@ -72,6 +79,7 @@ check_fsfs_v6=false
 check_fsfs_v4=false
 check_fsx=false
 check_bdb=false
+allow_remote=false
 
 while [ ! -z "$1" ]; do
     case "$1" in
@@ -84,6 +92,7 @@ while [ ! -z "$1" ]; do
         fsfs-v4) check_fsfs_v4=true;;
         fsx)     check_fsx=true;;
         bdb)     check_bdb=true;;
+        remote)  allow_remote=true;;
         *)       exit 1;;
     esac
     shift

Modified: subversion/branches/swig-py3/tools/client-side/bash_completion
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/bash_completion?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/bash_completion (original)
+++ subversion/branches/swig-py3/tools/client-side/bash_completion Wed Nov 28 \
21:25:32 2018 @@ -248,8 +248,8 @@ _svn()
 	cmds="$cmds patch propdel pdel propedit pedit propget pget proplist"
 	cmds="$cmds plist propset pset relocate resolve resolved revert status"
 	cmds="$cmds switch unlock update upgrade"
-	cmds="$cmds shelf-diff shelf-drop shelf-list shelf-log shelf-save"
-	cmds="$cmds shelve shelves unshelve"
+	cmds="$cmds x-shelf-diff x-shelf-drop x-shelf-list x-shelf-list-by-paths"
+	cmds="$cmds x-shelf-log x-shelf-save x-shelve x-shelves x-unshelve"
 
 	# help options have a strange command status...
 	local helpOpts='--help -h'
@@ -1024,32 +1024,35 @@ _svn()
 	upgrade)
 		cmdOpts="$qOpts $pOpts"
 		;;
-	shelf-diff)
+	x-shelf-list-by-paths)
 		cmdOpts="$pOpts"
 		;;
-	shelf-drop)
+	x-shelf-diff)
+		cmdOpts="$pOpts --summarize"
+		;;
+	x-shelf-drop)
 		cmdOpts="$pOpts"
 		;;
-	shelf-list|shelves)
+	x-shelf-list|x-shelves)
 		cmdOpts="$qOpts $pOpts"
 		;;
-	shelf-log)
+	x-shelf-log)
 		cmdOpts="$qOpts $pOpts"
 		;;
-	shelf-save)
+	x-shelf-save)
 		cmdOpts="--dry-run \
                          --depth --targets $cOpts \
                          $mOpts \
                          $qOpts $pOpts"
 		;;
-	shelve)
+	x-shelve)
 		cmdOpts="--keep-local --dry-run \
                          --depth --targets $cOpts \
                          $mOpts \
                          $qOpts $pOpts"
 		;;
-	unshelve)
-		cmdOpts="--dry-run \
+	x-unshelve)
+		cmdOpts="--drop --dry-run \
                          $qOpts $pOpts"
 		;;
 	*)

Modified: subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/help-cmd.c
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/help-cmd.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/help-cmd.c \
                (original)
+++ subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/help-cmd.c \
Wed Nov 28 21:25:32 2018 @@ -163,7 +163,7 @@ svn_min__help(apr_getopt_t *os,
                                                              pool)),
                          pool);
 #endif
-#ifdef SVN_HAVE_GNOME_KEYRING
+#if (defined(SVN_HAVE_GNOME_KEYRING) || defined(SVN_HAVE_LIBSECRET))
   svn_stringbuf_appendcstr(version_footer, "* Gnome Keyring\n");
 #endif
 #ifdef SVN_HAVE_GPG_AGENT
@@ -176,7 +176,7 @@ svn_min__help(apr_getopt_t *os,
   svn_stringbuf_appendcstr(version_footer, "* KWallet (KDE)\n");
 #endif
 
-  return svn_opt_print_help4(os,
+  return svn_opt_print_help5(os,
                              "svn-mergeinfo-normalizer",
                              opt_state ? opt_state->version : FALSE,
                              opt_state ? opt_state->quiet : FALSE,

Modified: subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svn-m \
ergeinfo-normalizer/mergeinfo-normalizer.h?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h \
                (original)
+++ subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/mergeinfo-normalizer.h \
Wed Nov 28 21:25:32 2018 @@ -117,7 +117,7 @@ svn_opt_subcommand_t
   svn_min__remove_branches;
 
 /* See definition in svn.c for documentation. */
-extern const svn_opt_subcommand_desc2_t svn_min__cmd_table[];
+extern const svn_opt_subcommand_desc3_t svn_min__cmd_table[];
 
 /* See definition in svn.c for documentation. */
 extern const int svn_min__global_options[];

Modified: subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svn-m \
ergeinfo-normalizer/svn-mergeinfo-normalizer.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c \
                (original)
+++ subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/svn-mergeinfo-normalizer.c \
Wed Nov 28 21:25:32 2018 @@ -221,43 +221,44 @@ const int svn_min__global_options[] =
   opt_config_dir, opt_config_options, 0
 };
 
-const svn_opt_subcommand_desc2_t svn_min__cmd_table[] =
+const svn_opt_subcommand_desc3_t svn_min__cmd_table[] =
 {
-  { "help", svn_min__help, {"?", "h"}, N_
-    ("Describe the usage of this program or its subcommands.\n"
-     "usage: help [SUBCOMMAND...]\n"),
+  { "help", svn_min__help, {"?", "h"}, {N_(
+     "Describe the usage of this program or its subcommands.\n"
+     "usage: help [SUBCOMMAND...]\n"
+    )},
     {0} },
 
   /* This command is also invoked if we see option "--help", "-h" or "-?". */
 
-  { "analyze", svn_min__analyze, { "analyse" }, N_
-    ("Generate a report of which part of the sub-tree mergeinfo can be\n"
+  { "analyze", svn_min__analyze, { "analyse" }, {N_(
+     "Generate a report of which part of the sub-tree mergeinfo can be\n"
      "removed and which part can't.\n"
      "usage: analyze [WCPATH...]\n"
-     "\n"
+     "\n"), N_(
      "  If neither --remove-obsoletes, --remove-redundant nor --combine-ranges\n"
      "  option is given, all three will be used implicitly.\n"
-     "\n"
+     "\n"), N_(
      "  In verbose mode, the command will behave just like 'normalize --dry-run'\n"
      "  but will show an additional summary of all deleted branches that were\n"
      "  encountered plus the revision of their latest deletion (if available).\n"
-     "\n"
+     "\n"), N_(
      "  In non-verbose mode, the per-node output does not give the parent path,\n"
      "  no successful elisions and branch removals nor the list of remaining\n"
      "  branches.\n"
-    ),
+    )},
     {opt_targets, opt_depth, 'v',
      opt_remove_obsoletes, opt_remove_redundant,
      opt_remove_redundant_misaligned, opt_combine_ranges} },
 
-  { "normalize", svn_min__normalize, { 0 }, N_
-    ("Normalize / reduce the mergeinfo throughout the working copy sub-tree.\n"
+  { "normalize", svn_min__normalize, { 0 }, {N_(
+     "Normalize / reduce the mergeinfo throughout the working copy sub-tree.\n"
      "usage: normalize [WCPATH...]\n"
-     "\n"
+     "\n"), N_(
      "  If neither --remove-obsoletes, --remove-redundant, --combine-ranges\n"
      "  nor --remove-redundant-misaligned option is given, --remove-redundant\n"
      "  will be used implicitly.\n"
-     "\n"
+     "\n"), N_(
      "  In non-verbose mode, only general progress as well as a summary before\n"
      "  and after the normalization process will be shown.  Note that sub-node\n"
      "  mergeinfo which could be removed entirely does not contribute to the\n"
@@ -265,12 +266,12 @@ const svn_opt_subcommand_desc2_t svn_min
      "  ranges combined only refers to the mergeinfo lines still present after\n"
      "  the normalization process.  To get total numbers, compare the initial\n"
      "  with the final mergeinfo statistics.\n"
-     "\n"
+     "\n"), N_(
      "  The detailed operation log in verbose mode replaces the progress display.\n"
      "  For each node with mergeinfo, the nearest parent node with mergeinfo is\n"
      "  given - if there is one and the result of trying to remove the mergeinfo\n"
      "  is shown for each branch.  The various outputs are:\n"
-     "\n"
+     "\n"), N_(
      "    elide redundant branch - Revision ranges are the same as in the parent.\n"
      "                             Mergeinfo for this branch can be elided.\n"
      "    elide branch           - Not an exact match with the parent but the\n"
@@ -324,32 +325,34 @@ const svn_opt_subcommand_desc2_t svn_min
      "                             The sub-tree mergeinfo cannot be elided.\n"
      "    REVERSE RANGE(S) found - The mergeinfo contains illegal reverse ranges.\n"
      "                             The sub-tree mergeinfo cannot be elided.\n"
-     "\n"
+     "\n"), N_(
      "  If all branches have been removed from a nodes' mergeinfo, the whole\n"
      "  svn:mergeinfo property will be removed.  Otherwise, only obsolete\n"
      "  branches will be removed.  In verbose mode, a list of branches that\n"
-     "  could not be removed will be shown per node.\n"),
+     "  could not be removed will be shown per node.\n"
+    )},
     {opt_targets, opt_depth, opt_dry_run, 'q', 'v',
      opt_remove_obsoletes, opt_remove_redundant,
      opt_remove_redundant_misaligned, opt_combine_ranges} },
 
-  { "remove-branches", svn_min__remove_branches, { 0 }, N_
-    ("Read a list of branch names from the given file and remove all\n"
+  { "remove-branches", svn_min__remove_branches, { 0 }, {N_(
+     "Read a list of branch names from the given file and remove all\n"
      "mergeinfo referring to these branches from the given targets.\n"
      "usage: remove-branches [WCPATH...] --file FILE\n"
-     "\n"
+     "\n"), N_(
      "  The command will behave just like 'normalize --remove-obsoletes' but\n"
      "  will never actually contact the repository.  Instead, it assumes any\n"
      "  path given in FILE is a deleted branch.\n"
-     "\n"
+     "\n"), N_(
      "  Compared to a simple 'normalize --remove-obsoletes' run, this command\n"
      "  allows for selective removal of obsolete branches.  It may therefore be\n"
      "  better suited for large deployments with complex branch structures.\n"
      "  You may also use this to remove mergeinfo that refers to still existing\n"
-     "  branches.\n"),
+     "  branches.\n"
+    )},
     {opt_targets, opt_depth, opt_dry_run, 'q', 'v', 'F'} },
 
-  { NULL, NULL, {0}, NULL, {0} }
+  { NULL, NULL, {0}, {NULL}, {0} }
 };
 
 
@@ -414,7 +417,7 @@ sub_main(int *exit_code, int argc, const
   svn_client_ctx_t *ctx;
   apr_array_header_t *received_opts;
   int i;
-  const svn_opt_subcommand_desc2_t *subcommand = NULL;
+  const svn_opt_subcommand_desc3_t *subcommand = NULL;
   svn_min__cmd_baton_t command_baton = { 0 };
   svn_auth_baton_t *ab;
   svn_config_t *cfg_config;
@@ -639,7 +642,7 @@ sub_main(int *exit_code, int argc, const
      just typos/mistakes.  Whatever the case, the subcommand to
      actually run is svn_cl__help(). */
   if (opt_state.help)
-    subcommand = svn_opt_get_canonical_subcommand2(svn_min__cmd_table, "help");
+    subcommand = svn_opt_get_canonical_subcommand3(svn_min__cmd_table, "help");
 
   /* If we're not running the `help' subcommand, then look for a
      subcommand in the first argument. */
@@ -650,8 +653,8 @@ sub_main(int *exit_code, int argc, const
           if (opt_state.version)
             {
               /* Use the "help" subcommand to handle the "--version" option. */
-              static const svn_opt_subcommand_desc2_t pseudo_cmd =
-                { "--version", svn_min__help, {0}, "",
+              static const svn_opt_subcommand_desc3_t pseudo_cmd =
+                { "--version", svn_min__help, {0}, {""},
                   {opt_version,    /* must accept its own option */
                    'q',            /* brief output */
                    'v',            /* verbose output */
@@ -676,7 +679,7 @@ sub_main(int *exit_code, int argc, const
 
           SVN_ERR(svn_utf_cstring_to_utf8(&first_arg, os->argv[os->ind++],
                                           pool));
-          subcommand = svn_opt_get_canonical_subcommand2(svn_min__cmd_table,
+          subcommand = svn_opt_get_canonical_subcommand3(svn_min__cmd_table,
                                                          first_arg);
           if (subcommand == NULL)
             {
@@ -704,12 +707,12 @@ sub_main(int *exit_code, int argc, const
       if (opt_id == 'h' || opt_id == '?')
         continue;
 
-      if (! svn_opt_subcommand_takes_option3(subcommand, opt_id,
+      if (! svn_opt_subcommand_takes_option4(subcommand, opt_id,
                                              svn_min__global_options))
         {
           const char *optstr;
           const apr_getopt_option_t *badopt =
-            svn_opt_get_option_from_code2(opt_id, svn_min__options,
+            svn_opt_get_option_from_code3(opt_id, svn_min__options,
                                           subcommand, pool);
           svn_opt_format_option(&optstr, badopt, FALSE, pool);
           if (subcommand->name[0] == '-')

Modified: subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/wc_mergeinfo.c
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/wc_mergeinfo.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/wc_mergeinfo.c \
                (original)
+++ subversion/branches/swig-py3/tools/client-side/svn-mergeinfo-normalizer/wc_mergeinfo.c \
Wed Nov 28 21:25:32 2018 @@ -112,8 +112,8 @@ static int
 compare_mergeinfo(const void *lhs,
                   const void *rhs)
 {
-  const mergeinfo_t *lhs_mi = *(const mergeinfo_t **)lhs;
-  const mergeinfo_t *rhs_mi = *(const mergeinfo_t **)rhs;
+  const mergeinfo_t *lhs_mi = *(const mergeinfo_t *const *)lhs;
+  const mergeinfo_t *rhs_mi = *(const mergeinfo_t *const *)rhs;
 
   return strcmp(lhs_mi->local_path, rhs_mi->local_path);
 }

Modified: subversion/branches/swig-py3/tools/client-side/svn-viewspec.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svn-viewspec.py?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svn-viewspec.py (original)
+++ subversion/branches/swig-py3/tools/client-side/svn-viewspec.py Wed Nov 28 \
21:25:32 2018 @@ -121,6 +121,8 @@ DEPTH_FILES      = 'files'
 DEPTH_IMMEDIATES = 'immediates'
 DEPTH_INFINITY   = 'infinity'
 
+os_system = None
+args = None
 
 class TreeNode:
     """A representation of a single node in a Subversion sparse
@@ -159,8 +161,8 @@ def svn_path_compare_paths(path1, path2)
     NOTE: Stolen unapologetically from Subversion's Python bindings
     module svn.core."""
 
-    path1_len = len(path1);
-    path2_len = len(path2);
+    path1_len = len(path1)
+    path2_len = len(path2)
     min_len = min(path1_len, path2_len)
     i = 0
 
@@ -280,10 +282,10 @@ def checkout_tree(base_url, revision, tr
     if revision != -1:
         revision_str = "--revision=%d " % (revision)
     if is_top:
-        os.system('svn checkout "%s" "%s" --depth=%s %s'
+        os_system('svn checkout "%s" "%s" --depth=%s %s'
                   % (base_url, target_dir, depth, revision_str))
     else:
-        os.system('svn update "%s" --set-depth=%s %s'
+        os_system('svn update "%s" --set-depth=%s %s'
                   % (target_dir, depth, revision_str))
     child_names = tree_node.children.keys()
     child_names.sort(svn_path_compare_paths)
@@ -304,27 +306,34 @@ def checkout_spec(viewspec, target_dir):
 
 def usage_and_exit(errmsg=None):
     stream = errmsg and sys.stderr or sys.stdout
-    msg = __doc__.replace("__SCRIPTNAME__", os.path.basename(sys.argv[0]))
+    msg = __doc__.replace("__SCRIPTNAME__", os.path.basename(args[0]))
     stream.write(msg)
     if errmsg:
         stream.write("ERROR: %s\n" % (errmsg))
-    sys.exit(errmsg and 1 or 0)
+        return 1
+    return 0
+
+def main(os_sys, args_in):
+    global os_system
+    global args
+    os_system = os_sys
+    args = args_in
 
-def main():
-    argc = len(sys.argv)
+    argc = len(args)
     if argc < 2:
-        usage_and_exit('Not enough arguments.')
-    subcommand = sys.argv[1]
+        return usage_and_exit('Not enough arguments.')
+    subcommand = args[1]
     if subcommand == 'help':
-        usage_and_exit()
+        return usage_and_exit()
     elif subcommand == 'help-format':
         msg = FORMAT_HELP.replace("__SCRIPTNAME__",
-                                  os.path.basename(sys.argv[0]))
+                                  os.path.basename(args[0]))
         sys.stdout.write(msg)
+        return 1
     elif subcommand == 'examine':
         if argc < 3:
-            usage_and_exit('No viewspec file specified.')
-        fp = (sys.argv[2] == '-') and sys.stdin or open(sys.argv[2], 'r')
+            return usage_and_exit('No viewspec file specified.')
+        fp = (args[2] == '-') and sys.stdin or open(args[2], 'r')
         viewspec = parse_viewspec(fp)
         sys.stdout.write("Url: %s\n" % (viewspec.base_url))
         revision = viewspec.revision
@@ -336,13 +345,14 @@ def main():
         viewspec.tree.dump(True)
     elif subcommand == 'checkout':
         if argc < 3:
-            usage_and_exit('No viewspec file specified.')
+            return usage_and_exit('No viewspec file specified.')
         if argc < 4:
-            usage_and_exit('No target directory specified.')
-        fp = (sys.argv[2] == '-') and sys.stdin or open(sys.argv[2], 'r')
-        checkout_spec(parse_viewspec(fp), sys.argv[3])
+            return usage_and_exit('No target directory specified.')
+        fp = (args[2] == '-') and sys.stdin or open(args[2], 'r')
+        checkout_spec(parse_viewspec(fp), args[3])
     else:
-        usage_and_exit('Unknown subcommand "%s".' % (subcommand))
+        return usage_and_exit('Unknown subcommand "%s".' % (subcommand))
 
 if __name__ == "__main__":
-    main()
+    if main(os.system, sys.argv):
+        sys.exit(1)

Modified: subversion/branches/swig-py3/tools/client-side/svnconflict/svnconflict.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/client-side/svnconflict/svnconflict.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/client-side/svnconflict/svnconflict.c \
                (original)
+++ subversion/branches/swig-py3/tools/client-side/svnconflict/svnconflict.c Wed Nov \
28 21:25:32 2018 @@ -148,18 +148,19 @@ static const int svnconflict_global_opti
 { opt_auth_username, opt_auth_password, opt_auth_password_from_stdin,
   opt_config_dir, opt_config_options, 0 };
 
-static const svn_opt_subcommand_desc2_t svnconflict_cmd_table[] =
+static const svn_opt_subcommand_desc3_t svnconflict_cmd_table[] =
 {
   /* This command is also invoked if we see option "--help", "-h" or "-?". */
-  { "help", svnconflict_help, {"?", "h"}, N_
-    ("Describe the usage of this program or its subcommands.\n"
-     "usage: help [SUBCOMMAND...]\n"),
+  { "help", svnconflict_help, {"?", "h"}, {N_(
+     "Describe the usage of this program or its subcommands.\n"
+     "usage: help [SUBCOMMAND...]\n"
+    )},
     {0} },
 
-  { "list", svnconflict_list, {"ls"}, N_
-    ("List conflicts at a conflicted path.\n"
+  { "list", svnconflict_list, {"ls"}, {N_(
+     "List conflicts at a conflicted path.\n"
      "usage: list PATH\n"
-     "\n"
+     "\n"), N_(
      "  List conflicts at PATH, one per line. Possible conflicts are:\n"
      "  \n"
      "  text-conflict\n"
@@ -176,67 +177,67 @@ static const svn_opt_subcommand_desc2_t
      "    If a tree conflict exists, no text or property conflicts exist.\n"
      "  \n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "options-text", svnconflict_options_text, {0}, N_
-    ("List options for resolving a text conflict at path.\n"
+  { "options-text", svnconflict_options_text, {0}, {N_(
+     "List options for resolving a text conflict at path.\n"
      "usage: options-text PATH\n"
-     "\n"
+     "\n"), N_(
      "  List text conflict resolution options at PATH, one per line.\n"
      "  Each line contains a numeric option ID, a colon, and a description.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "options-prop", svnconflict_options_prop, {0}, N_
-    ("List options for resolving a property conflict at path.\n"
+  { "options-prop", svnconflict_options_prop, {0}, {N_(
+     "List options for resolving a property conflict at path.\n"
      "usage: options-prop PATH\n"
-     "\n"
+     "\n"), N_(
      "  List property conflict resolution options at PATH, one per line.\n"
      "  Each line contains a numeric option ID, a colon, and a description.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "options-tree", svnconflict_options_tree, {0}, N_
-    ("List options for resolving a tree conflict at path.\n"
+  { "options-tree", svnconflict_options_tree, {0}, {N_(
+     "List options for resolving a tree conflict at path.\n"
      "usage: options-tree PATH\n"
-     "\n"
+     "\n"), N_(
      "  List tree conflict resolution options at PATH, one per line.\n"
      "  Each line contains a numeric option ID, a colon, and a description.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "resolve-text", svnconflict_resolve_text, {0}, N_
-    ("Resolve the text conflict at path.\n"
+  { "resolve-text", svnconflict_resolve_text, {0}, {N_(
+     "Resolve the text conflict at path.\n"
      "usage: resolve-text OPTION_ID PATH\n"
-     "\n"
+     "\n"), N_(
      "  Resolve the text conflict at PATH with a given resolution option.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "resolve-prop", svnconflict_resolve_prop, {0}, N_
-    ("Resolve the property conflict at path.\n"
+  { "resolve-prop", svnconflict_resolve_prop, {0}, {N_(
+     "Resolve the property conflict at path.\n"
      "usage: resolve-prop PROPNAME OPTION_ID PATH\n"
-     "\n"
+     "\n"), N_(
      "  Resolve conflicted property PROPNAME at PATH with a given resolution \
                option.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { "resolve-tree", svnconflict_resolve_tree, {0}, N_
-    ("Resolve the tree conflict at path.\n"
+  { "resolve-tree", svnconflict_resolve_tree, {0}, {N_(
+     "Resolve the tree conflict at path.\n"
      "usage: resolve-tree OPTION_ID PATH\n"
-     "\n"
+     "\n"), N_(
      "  Resolve the tree conflict at PATH with a given resolution option.\n"
      "  If PATH is not in conflict, the exit code will be 1, and 0 otherwise.\n"
-     ""),
+    )},
     {0}, },
 
-  { NULL, NULL, {0}, NULL, {0} }
+  { NULL, NULL, {0}, {NULL}, {0} }
 };
 
 /* Version compatibility check */
@@ -297,7 +298,7 @@ svnconflict_help(apr_getopt_t *os, void
       SVN_ERR(svn_ra_print_modules(version_footer, pool));
     }
 
-  SVN_ERR(svn_opt_print_help4(os,
+  SVN_ERR(svn_opt_print_help5(os,
                               "svnconflict",   /* ### erm, derive somehow? */
                               opt_state ? opt_state->version : FALSE,
                               FALSE, /* quiet */
@@ -641,7 +642,7 @@ sub_main(int *exit_code, int argc, const
   apr_array_header_t *received_opts;
   svnconflict_cmd_baton_t command_baton;
   int i;
-  const svn_opt_subcommand_desc2_t *subcommand = NULL;
+  const svn_opt_subcommand_desc3_t *subcommand = NULL;
   svn_auth_baton_t *ab;
   svn_config_t *cfg_config;
   apr_hash_t *cfg_hash;
@@ -742,7 +743,7 @@ sub_main(int *exit_code, int argc, const
      just typos/mistakes.  Whatever the case, the subcommand to
      actually run is svnconflict_help(). */
   if (opt_state.help)
-    subcommand = svn_opt_get_canonical_subcommand2(svnconflict_cmd_table,
+    subcommand = svn_opt_get_canonical_subcommand3(svnconflict_cmd_table,
                                                    "help");
 
   /* If we're not running the `help' subcommand, then look for a
@@ -754,8 +755,8 @@ sub_main(int *exit_code, int argc, const
           if (opt_state.version)
             {
               /* Use the "help" subcommand to handle the "--version" option. */
-              static const svn_opt_subcommand_desc2_t pseudo_cmd =
-                { "--version", svnconflict_help, {0}, "",
+              static const svn_opt_subcommand_desc3_t pseudo_cmd =
+                { "--version", svnconflict_help, {0}, {""},
                   {opt_version,    /* must accept its own option */
                    opt_config_dir  /* all commands accept this */
                   } };
@@ -778,7 +779,7 @@ sub_main(int *exit_code, int argc, const
 
           SVN_ERR(svn_utf_cstring_to_utf8(&first_arg, os->argv[os->ind++],
                                           pool));
-          subcommand = svn_opt_get_canonical_subcommand2(svnconflict_cmd_table,
+          subcommand = svn_opt_get_canonical_subcommand3(svnconflict_cmd_table,
                                                          first_arg);
           if (subcommand == NULL)
             {
@@ -805,12 +806,12 @@ sub_main(int *exit_code, int argc, const
       if (opt_id == 'h' || opt_id == '?')
         continue;
 
-      if (! svn_opt_subcommand_takes_option3(subcommand, opt_id,
+      if (! svn_opt_subcommand_takes_option4(subcommand, opt_id,
                                              svnconflict_global_options))
         {
           const char *optstr;
           const apr_getopt_option_t *badopt =
-            svn_opt_get_option_from_code2(opt_id, svnconflict_options,
+            svn_opt_get_option_from_code3(opt_id, svnconflict_options,
                                           subcommand, pool);
           svn_opt_format_option(&optstr, badopt, FALSE, pool);
           if (subcommand->name[0] == '-')

Modified: subversion/branches/swig-py3/tools/dev/svnmover/svnmover.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dev/svnmover/svnmover.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dev/svnmover/svnmover.c (original)
+++ subversion/branches/swig-py3/tools/dev/svnmover/svnmover.c Wed Nov 28 21:25:32 \
2018 @@ -4042,7 +4042,7 @@ display_version(apr_getopt_t *os, svn_bo
   version_footer = svn_stringbuf_create(ra_desc_start, pool);
   SVN_ERR(svn_ra_print_modules(version_footer, pool));
 
-  SVN_ERR(svn_opt_print_help4(NULL, "svnmover", TRUE, _quiet, FALSE,
+  SVN_ERR(svn_opt_print_help5(NULL, "svnmover", TRUE, _quiet, FALSE,
                               version_footer->data,
                               NULL, NULL, NULL, NULL, NULL, pool));
 

Modified: subversion/branches/swig-py3/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c
                
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c \
                (original)
+++ subversion/branches/swig-py3/tools/dev/svnraisetreeconflict/svnraisetreeconflict.c \
Wed Nov 28 21:25:32 2018 @@ -52,7 +52,7 @@
 static svn_error_t *
 version(apr_pool_t *pool)
 {
-  return svn_opt_print_help4(NULL, "svnraisetreeconflict", TRUE, FALSE, FALSE,
+  return svn_opt_print_help5(NULL, "svnraisetreeconflict", TRUE, FALSE, FALSE,
                              NULL, NULL, NULL, NULL, NULL, NULL, pool);
 }
 

Modified: subversion/branches/swig-py3/tools/dev/unix-build/Makefile.svn
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dev/unix-build/Makefile.svn?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dev/unix-build/Makefile.svn (original)
+++ subversion/branches/swig-py3/tools/dev/unix-build/Makefile.svn Wed Nov 28 \
21:25:32 2018 @@ -72,6 +72,12 @@ endif # 2.2
 endif # 2.3
 endif # 2.4
 
+ifeq ($(UNAME),OpenBSD)
+# Pick the correct base compiler (ie. clang rather than ancient gcc 4.2.1)
+CC = cc
+CXX = c++
+endif
+
 TAG		?= none
 ifeq ($(TAG),none)
 BRANCH		?= trunk
@@ -102,7 +108,7 @@ SERF_OLD_VER	= 0.3.1
 CYRUS_SASL_VER	= 2.1.25
 SQLITE_VER	= 3160200
 LIBMAGIC_VER	= 5.30
-RUBY_VER	= 2.4.2
+RUBY_VER	= 2.4.4
 BZ2_VER	= 1.0.6
 PYTHON_VER	= 2.7.13
 JUNIT_VER	= 4.10
@@ -132,7 +138,7 @@ SHA256_${NEON_DIST} = db0bd8cdec329b48f5
 SHA256_${CYRUS_SASL_DIST} = \
418c16e6240a4f9b637cbe3d62937b9675627bad27c622191d47de8686fe24fe  \
SHA256_${SQLITE_DIST} = \
65cc0c3e9366f50c0679c5ccd31432cea894bc4a3e8947dabab88c8693263615  \
SHA256_${LIBMAGIC_DIST} = \
                694c2432e5240187524c9e7cf1ec6acc77b47a0e19554d34c14773e43dbbf214
-SHA256_${RUBY_DIST} = \
93b9e75e00b262bc4def6b26b7ae8717efc252c47154abb7392e54357e6c8c9c +SHA256_${RUBY_DIST} \
= 254f1c1a79e4cc814d1e7320bc5bdd995dc57e08727d30a767664619a9c8ae5a  \
SHA256_${BZ2_DIST} = a2848f34fcd5d6cf47def00461fcb528a0484d8edef8208d6d2e2909dc61d9cd \
SHA256_${PYTHON_DIST} = \
a4f05a0720ce0fd92626f0278b6b433eee9a6173ddf2bced7957dfb599a5ece1  \
SHA256_${JUNIT_DIST} = \
36a747ca1e0b86f6ea88055b8723bb87030d627766da6288bf077afdeeb0f75a @@ -171,7 +177,7 @@ \
FETCH_CMD	= wget -c  SUBVERSION_REPOS_URL = \
https://svn.apache.org/repos/asf/subversion  BDB_URL		= \
http://download.oracle.com/berkeley-db/$(BDB_DIST)  APR_URL		= \
                https://svn.apache.org/repos/asf/apr/apr
-APR_ICONV_URL	= https://www.apache.org/dist/apr/$(APR_ICONV_DIST)
+APR_ICONV_URL	= https://archive.apache.org/dist/apr/$(APR_ICONV_DIST)
 GNU_ICONV_URL	= https://ftp.gnu.org/pub/gnu/libiconv/$(GNU_ICONV_DIST)
 APR_UTIL_URL	= https://svn.apache.org/repos/asf/apr/apr-util
 HTTPD_URL	= https://archive.apache.org/dist/httpd/$(HTTPD_DIST)
@@ -183,7 +189,7 @@ SQLITE_URL	= https://www.sqlite.org/2017
 CYRUS_SASL_URL	= ftp://ftp.andrew.cmu.edu/pub/cyrus-mail/$(CYRUS_SASL_DIST)
 LIBMAGIC_URL	= ftp://ftp.astron.com/pub/file/$(LIBMAGIC_DIST)
 RUBY_URL	= https://cache.ruby-lang.org/pub/ruby/2.4/$(RUBY_DIST)
-BZ2_URL		= http://bzip.org/$(BZ2_VER)/$(BZ2_DIST)
+BZ2_URL		= https://ftp.openbsd.org/pub/OpenBSD/distfiles/$(BZ2_DIST)
 PYTHON_URL	= https://python.org/ftp/python/$(PYTHON_VER)/$(PYTHON_DIST)
 JUNIT_URL	= https://downloads.sourceforge.net/project/junit/junit/$(JUNIT_VER)/$(JUNIT_DIST)
  GETTEXT_URL	= https://ftp.gnu.org/pub/gnu/gettext/$(GETTEXT_DIST)
@@ -240,6 +246,10 @@ endif
 # We need this to make sure some targets below pick up the right libraries
 LD_LIBRARY_PATH=$(PREFIX)/apr/lib:$(PREFIX)/gettext/lib:$(PREFIX)/iconv/lib:$(PREFIX) \
/bdb/lib:$(PREFIX)/neon/lib:$(PREFIX)/serf/lib:$(PREFIX)/sqlite/lib:$(PREFIX)/cyrus-sa \
sl/lib:$(PREFIX)/iconv/lib:$(PREFIX)/libmagic/lib:$(PREFIX)/ruby/lib:$(PREFIX)/python/lib:$(PREFIX)/svn-$(WC)/lib
  
+# We need this to make sure some targets below pick up the right pkg-config files
+PKG_CONFIG_PATH=$(PREFIX)/apr/lib/pkgconfig:$(PREFIX)/neon/lib/pkgconfig:$(PREFIX)/se \
rf/lib/pkgconfig:$(PREFIX)/sqlite/lib/pkgconfig:$(PREFIX)/ruby/lib/pkgconfig:$(PREFIX)/python/lib/pkgconfig:$(PREFIX)/lz4/lib/pkgconfig
 +
+
 #######################################################################
 # Main targets.
 #######################################################################
@@ -333,6 +343,7 @@ $(BDB_OBJDIR)/.retrieved: $(DISTDIR)/$(B
 $(BDB_OBJDIR)/.configured: $(BDB_OBJDIR)/.retrieved
 	cd $(BDB_SRCDIR)/build_unix \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		CC=$(CC) CXX=$(CXX) \
 		../dist/configure \
 		--prefix=$(PREFIX)/bdb \
 		--enable-debug
@@ -390,6 +401,8 @@ $(APR_OBJDIR)/.configured: $(APR_OBJDIR)
 	cd $(APR_SRCDIR) && ./buildconf
 	cd $(APR_OBJDIR) \
 		&& env CFLAGS="-O0 -g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
+		CC=$(CC) CXX=$(CXX) \
 		$(APR_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
 		--enable-maintainer-mode \
@@ -438,7 +451,9 @@ $(APR_ICONV_OBJDIR)/.configured: $(APR_I
 	$(APR_OBJDIR)/.installed
 	cd $(APR_ICONV_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
+		CC=$(CC) CXX=$(CXX) \
 		GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(APR_ICONV_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
 		--with-apr=$(PREFIX)/apr
@@ -522,6 +537,8 @@ $(GNU_ICONV_OBJDIR)/.configured: $(GNU_I
 		${MAKE} -f Makefile.devel lib/aliases.h
 	cd $(GNU_ICONV_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`"\
+		CC=$(CC) CXX=$(CXX) \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(GNU_ICONV_SRCDIR)/configure \
 		--prefix=$(PREFIX)/iconv \
 		--enable-extra-encodings
@@ -592,7 +609,9 @@ $(APR_UTIL_OBJDIR)/.configured: $(APR_UT
 	cd $(APR_UTIL_SRCDIR) && ./buildconf --with-apr=$(APR_SRCDIR)
 	cd $(APR_UTIL_OBJDIR) \
 		&& env LD_LIBRARY_PATH=$(PREFIX)/bdb/lib \
+			PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 			CFLAGS="-O0 -g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
+			CC=$(CC) CXX=$(CXX) \
 			GREP="`which grep`" \
 			$(APR_UTIL_SRCDIR)/configure \
 		--prefix=$(PREFIX)/apr \
@@ -727,7 +746,9 @@ $(HTTPD_OBJDIR)/.configured: $(HTTPD_OBJ
 	cd $(HTTPD_SRCDIR) && ./buildconf
 	cd $(HTTPD_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
+		CC=$(CC) CXX=$(CXX) \
 		GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(HTTPD_SRCDIR)/configure \
 		--prefix=$(PREFIX)/httpd \
 		--enable-maintainer-mode \
@@ -812,6 +833,8 @@ $(NEON_OBJDIR)/.configured: $(NEON_OBJDI
 	fi
 	cd $(NEON_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		CC=$(CC) CXX=$(CXX) \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(NEON_SRCDIR)/configure \
 		PATH=$(NEON_OBJDIR):$$PATH \
 		--prefix=$(PREFIX)/neon \
@@ -872,9 +895,11 @@ $(SERF_OBJDIR)/.compiled: $(SERF_OBJDIR)
 	cd $(SERF_SRCDIR) && \
 		scons -j${MAKE_JOBS} DEBUG=1 \
 			CFLAGS="-O0 -g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
+			CC=$(CC) CXX=$(CXX) \
 			APR=$(PREFIX)/apr \
 			APU=$(PREFIX)/apr \
-			PREFIX=$(PREFIX)/serf
+			PREFIX=$(PREFIX)/serf \
+			PKG_CONFIG_PATH=$(PKG_CONFIG_PATH)
 	touch $@
 
 # install serf
@@ -915,6 +940,7 @@ $(SERF_OLD_OBJDIR)/.compiled: $(SERF_OLD
 	$(APR_UTIL_OBJDIR)/.installed
 	cd $(SERF_OLD_SRCDIR) && \
 		env CFLAGS="-O0 -g $(PROFILE_CFLAGS) -DAPR_POOL_DEBUG" \
+			CC=$(CC) CXX=$(CXX) \
 			./serfmake --with-apr=$(PREFIX)/apr \
 			--prefix=$(PREFIX)/serf-old \
 			build
@@ -966,6 +992,8 @@ endif
 $(SQLITE_OBJDIR)/.configured: $(SQLITE_OBJDIR)/.retrieved
 	cd $(SQLITE_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
+		CC=$(CC) CXX=$(CXX) \
 		$(SQLITE_SRCDIR)/configure \
 		--prefix=$(PREFIX)/sqlite \
 		$(THREADSAFE_FLAG)
@@ -1035,7 +1063,9 @@ $(CYRUS_SASL_OBJDIR)/.configured: $(CYRU
 	cd $(CYRUS_SASL_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" \
 		CPPFLAGS="-I/usr/include/kerberosV" \
+		CC=$(CC) CXX=$(CXX) \
 		GREP="`which grep`" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(CYRUS_SASL_SRCDIR)/configure \
 		--with-dbpath=$(PREFIX)/cyrus-sasl/etc/sasldb2 \
 		--with-plugindir=$(PREFIX)/cyrus-sasl/lib/sasl2 \
@@ -1087,6 +1117,8 @@ $(LIBMAGIC_OBJDIR)/.retrieved: $(DISTDIR
 $(LIBMAGIC_OBJDIR)/.configured: $(LIBMAGIC_OBJDIR)/.retrieved
 	cd $(LIBMAGIC_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`"\
+		CC=$(CC) CXX=$(CXX) \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(LIBMAGIC_SRCDIR)/configure \
 		--enable-fsect-man5 \
 		--prefix=$(PREFIX)/libmagic
@@ -1121,13 +1153,54 @@ ruby-clean:
 $(DISTDIR)/$(RUBY_DIST):
 	cd $(DISTDIR) && $(FETCH_CMD) $(RUBY_URL)
 
+$(RUBY_OBJDIR)/openssl_missing.patch:
+	mkdir -p $(dir $@)
+	echo > $@.tmp 'Index: ext/openssl/openssl_missing.h'
+	echo >> $@.tmp '--- ext/openssl/openssl_missing.h.orig'
+	echo >> $@.tmp '+++ ext/openssl/openssl_missing.h'
+	echo >> $@.tmp '@@ -119,6 +119,9 @@ void ossl_HMAC_CTX_free(HMAC_CTX *);'
+	echo >> $@.tmp ' #if !defined(HAVE_X509_STORE_SET_EX_DATA)'
+	echo >> $@.tmp ' #  define X509_STORE_set_ex_data(x, idx, data) \'
+	echo >> $@.tmp ' 	CRYPTO_set_ex_data(&(x)->ex_data, (idx), (data))'
+	echo >> $@.tmp '+#endif'
+	echo >> $@.tmp '+'
+	echo >> $@.tmp '+#if !defined(HAVE_X509_STORE_GET_EX_NEW_INDEX)'
+	echo >> $@.tmp ' #  define X509_STORE_get_ex_new_index(l, p, newf, dupf, freef) \'
+	echo >> $@.tmp ' 	CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509_STORE, (l), (p), \'
+	echo >> $@.tmp ' 				(newf), (dupf), (freef))'
+	echo >> $@.tmp '@@ -192,6 +195,7 @@ void ossl_X509_REQ_get0_signature(const \
X509_REQ *, co' +	echo >> $@.tmp ' #endif'
+	echo >> $@.tmp ' '
+	echo >> $@.tmp ' #if !defined(HAVE_OPAQUE_OPENSSL)'
+	echo >> $@.tmp '+#if defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < \
0x2070000fL' +	echo >> $@.tmp ' #define IMPL_PKEY_GETTER(_type, _name) \'
+	echo >> $@.tmp ' static inline _type *EVP_PKEY_get0_##_type(EVP_PKEY *pkey) { \'
+	echo >> $@.tmp ' 	return pkey->pkey._name; }'
+	echo >> $@.tmp '@@ -243,6 +247,7 @@ IMPL_PKEY_GETTER(EC_KEY, ec)'
+	echo >> $@.tmp ' #undef IMPL_PKEY_GETTER'
+	echo >> $@.tmp ' #undef IMPL_KEY_ACCESSOR2'
+	echo >> $@.tmp ' #undef IMPL_KEY_ACCESSOR3'
+	echo >> $@.tmp '+#endif'
+	echo >> $@.tmp ' #endif /* HAVE_OPAQUE_OPENSSL */'
+	echo >> $@.tmp ' '
+	echo >> $@.tmp ' #if defined(HAVE_AUTHENTICATED_ENCRYPTION) && \
!defined(EVP_CTRL_AEAD_GET_TAG)' +	mv -f $@.tmp $@
+
+ifeq ($(UNAME),OpenBSD)
+RUBY_SSL_EX_NEW_DATA_PATCH = sed -i -e '/^have_func("X509_STORE_set_ex_data")$$/ { \
p; s/^.*$$/\have_func("X509_STORE_get_ex_new_index")/; }' +else
+RUBY_SSL_EX_NEW_DATA_PATCH = true
+endif
+
 # retrieve ruby
 #
-$(RUBY_OBJDIR)/.retrieved: $(DISTDIR)/$(RUBY_DIST)
+$(RUBY_OBJDIR)/.retrieved: $(DISTDIR)/$(RUBY_DIST) \
$(RUBY_OBJDIR)/openssl_missing.patch  $(call do_check_sha256,$(RUBY_DIST))
 	[ -d $(RUBY_OBJDIR) ] || mkdir -p $(RUBY_OBJDIR)
 	tar -C $(SRCDIR) -zxf $(DISTDIR)/$(RUBY_DIST)
 	-which ghead && sed -i -e "s/head -c/ghead -c/" $(RUBY_SRCDIR)/configure
+	$(RUBY_SSL_EX_NEW_DATA_PATCH) $(RUBY_SRCDIR)/ext/openssl/extconf.rb
+	cd $(RUBY_SRCDIR) && patch -p0 < $(RUBY_OBJDIR)/openssl_missing.patch
 	touch $@
 
 ifeq ($(THREADING),yes)
@@ -1140,6 +1213,8 @@ endif
 $(RUBY_OBJDIR)/.configured: $(RUBY_OBJDIR)/.retrieved
 	cd $(RUBY_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`"\
+		CC=$(CC) CXX=$(CXX) \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(RUBY_SRCDIR)/configure \
 		--prefix=$(PREFIX)/ruby \
 		--enable-shared \
@@ -1187,7 +1262,8 @@ $(BZ2_OBJDIR)/.retrieved: $(DISTDIR)/$(B
 
 # compile bz2
 $(BZ2_OBJDIR)/.compiled: $(BZ2_OBJDIR)/.retrieved
-	(cd $(BZ2_SRCDIR) && env MAKEFLAGS= make CFLAGS="-g $(PROFILE_CFLAGS) -fPIC" \
-j${MAKE_JOBS}) +	(cd $(BZ2_SRCDIR) && env MAKEFLAGS= make CC=$(CC) CXX=$(CXX) \
+		CFLAGS="-g $(PROFILE_CFLAGS) -fPIC" -j${MAKE_JOBS})
 	touch $@
 
 # install bz2
@@ -1247,9 +1323,11 @@ $(PYTHON_OBJDIR)/.configured: $(PYTHON_O
 	$(BZ2_OBJDIR)/.installed
 	cd $(PYTHON_OBJDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`" \
+		CC=$(CC) CXX=$(CXX) \
 		CPPFLAGS="-I$(PREFIX)/bz2/include" \
 		LDFLAGS="-Wl,-rpath=$(PREFIX)/python/lib -L$(PREFIX)/bz2/lib" \
 		LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(PYTHON_SRCDIR)/configure \
 		--prefix=$(PREFIX)/python \
 		--enable-shared \
@@ -1316,7 +1394,9 @@ $(GETTEXT_OBJDIR)/.retrieved: $(DISTDIR)
 $(GETTEXT_OBJDIR)/.configured: $(GETTEXT_OBJDIR)/.retrieved
 	cd $(GETTEXT_SRCDIR) \
 		&& env CFLAGS="-g $(PROFILE_CFLAGS)" GREP="`which grep`"\
+		CC=$(CC) CXX=$(CXX) \
 		LDFLAGS="-L$(PREFIX)/iconv/lib" \
+		PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 		$(GETTEXT_SRCDIR)/configure \
 		--prefix=$(PREFIX)/gettext \
 		--with-libiconv-prefix=$(PREFIX)/iconv \
@@ -1375,7 +1455,8 @@ $(LZ4_OBJDIR)/.configured: $(LZ4_OBJDIR)
 # compile lz4
 $(LZ4_OBJDIR)/.compiled: $(LZ4_OBJDIR)/.configured
 	(cd $(LZ4_SRCDIR)/lib && \
-		env MAKEFLAGS= $(MAKE) -j${MAKE_JOBS} PREFIX=$(PREFIX)/lz4)
+		env MAKEFLAGS= $(MAKE) CC=$(CC) CXX=$(CXX) \
+			-j${MAKE_JOBS} PREFIX=$(PREFIX)/lz4)
 	touch $@
 
 # install lz4
@@ -1503,6 +1584,17 @@ SVN_WITH_HTTPD=--with-apxs="$(PREFIX)/ht
 SVN_WITH_SASL=--with-sasl="$(PREFIX)/cyrus-sasl"
 endif
 
+# On OpenBSD, MExtUtils -e ldopts outputs -L/usr/local/lib, which can
+# cause us to link Perl bindings against the wrong set of SVN libraries.
+# As a workaround, we patch the configure script after it has been generated.
+ifeq ($(UNAME),OpenBSD)
+SWIG_PL_INCLUDES_HACK= sed -i 's^\($$PERL -MExtUtils::Embed -e ccopts\)^\1 | sed -e \
s@-I/usr/local/include@@^' $(svn_builddir)/configure +SWIG_PL_LINK_HACK= sed -i \
's^\($$PERL -MExtUtils::Embed -e ldopts\)^\1 | sed -e s@-L/usr/local/lib@@^' \
$(svn_builddir)/configure +else
+SWIG_PL_INCLUDES_HACK=true
+SWIG_PL_LINK_HACK=true
+endif
+
 $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)/.retrieved $(DISTDIR)/$(JUNIT_DIST) \
 	$(APR_OBJDIR)/.installed $(APR_UTIL_OBJDIR)/.installed \
 	$(BDB_OBJDIR)/.installed $(SQLITE_OBJDIR)/.installed \
@@ -1511,11 +1603,15 @@ $(SVN_OBJDIR)/.configured: $(SVN_OBJDIR)
 	$(SERF_OBJDIR)/.installed $(SERF_OLD_OBJDIR)/.installed \
 	$(RUBY_OBJDIR)/.installed $(PYTHON_OBJDIR)/.installed
 	cd $(SVN_SRCDIR) && ./autogen.sh
+	$(SWIG_PL_INCLUDES_HACK)
+	$(SWIG_PL_LINK_HACK)
 	cd $(svn_builddir) && \
 		env LDFLAGS="-L$(PREFIX)/neon/lib -L$(PREFIX)/apr/lib $(SERF_LDFLAG) $(LZ4_LDFLAG) \
-L$(PREFIX)/gettext/lib -L$(PREFIX)/iconv/lib" \ +			CC=$(CC) CXX=$(CXX) \
 			CFLAGS="-I$(PREFIX)/gettext/include -DAPR_POOL_DEBUG" \
 			CXXFLAGS="-I$(PREFIX)/gettext/include -DAPR_POOL_DEBUG" \
 			LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$$LD_LIBRARY_PATH" \
+			PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) \
 			GREP="`which grep`" \
 			PATH=$(PREFIX)/ruby/bin:$(PREFIX)/python/bin:$(PREFIX)/gettext/bin:$$PATH \
 			$(SVN_SRCDIR)/configure \
@@ -1563,6 +1659,17 @@ $(SVN_OBJDIR)/.pre-generated-swig-cleane
 		&& env MAKEFLAGS= make clean-swig
 	touch $@
 
+
+# On OpenBSD, Perl's LDDLFLAGS include -L/usr/local/lib, which can cause
+# us to link Perl bindings against the wrong set of SVN libraries.
+# We manually fix up the generated Makefile.PL to work around this issue.
+ifeq ($(UNAME),OpenBSD)
+MAKEFILE_PL_LDDLFLAGS_HACK= sed -i 's@^WriteMakefile@$$config{LDDLFLAGS} =~ \
s+-L/usr/local/lib++; WriteMakefile@' \ \
+			$(SVN_SRCDIR)/subversion/bindings/swig/perl/native/Makefile.PL +else
+MAKEFILE_PL_LDDLFLAGS_HACK=true
+endif
+
 $(SVN_OBJDIR)/.bindings-compiled: $(SVN_OBJDIR)/.installed \
$(SVN_OBJDIR)/.pre-generated-swig-cleaned  cd $(svn_builddir) \
 		&& env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
@@ -1571,13 +1678,15 @@ $(SVN_OBJDIR)/.bindings-compiled: $(SVN_
 		env PATH=$(PREFIX)/ruby/bin:$$PATH \
 		LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) env MAKEFLAGS= make -j${MAKE_JOBS} swig-rb
 	if [ $(ENABLE_PERL_BINDINGS) = yes ]; then \
+		cd $(svn_builddir) && make \
$(SVN_SRCDIR)/subversion/bindings/swig/perl/native/Makefile.PL; \ \
+		$(MAKEFILE_PL_LDDLFLAGS_HACK); \  cd $(svn_builddir) \
 			&& env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
 				env MAKEFLAGS= make -j${MAKE_JOBS} swig-pl; \
 	fi
 	if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
 		cd $(svn_builddir) \
-			&& env MAKEFLAGS= make -j${MAKE_JOBS} javahl; \
+			&& env MAKEFLAGS= make javahl; \
 	fi
 	touch $@
 
@@ -1587,13 +1696,15 @@ $(SVN_OBJDIR)/.bindings-installed: $(SVN
 		env MAKEFLAGS= make install-swig-py
 	cd $(svn_builddir) && \
 		env PATH=$(PREFIX)/ruby/bin:$$PATH \
-		LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) env MAKEFLAGS= make install-swig-rb
+		LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) MAKEFLAGS= make install-swig-rb
 	if [ $(ENABLE_PERL_BINDINGS) = yes ]; then \
 		cd $(svn_builddir) \
-	    && env MAKEFLAGS= make install-swig-pl-lib; \
-	  cd subversion/bindings/swig/perl/native \
-		  && perl Makefile.PL PREFIX="$(SVN_PREFIX)" \
-		  && env MAKEFLAGS= make install; \
+			&& env MAKEFLAGS= LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
+				make install-swig-pl-lib; \
+		cd subversion/bindings/swig/perl/native \
+			&& perl Makefile.PL PREFIX="$(SVN_PREFIX)" \
+			&& env MAKEFLAGS= LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
+				make install; \
 	fi
 	if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
 		cd $(svn_builddir) \
@@ -1924,6 +2035,7 @@ endif
 
 HTTPD_CMD = env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) $(LIB_PTHREAD_HACK) \
 		$(PREFIX)/httpd/bin/apachectl
+HTTPD_LOG_ROTATE = mv $(PREFIX)/httpd/logs/error_log \
$(PREFIX)/httpd/logs/error_log.old  HTTPD_START_CMD = $(HTTPD_CMD) -f \
$(HTTPD_CHECK_CONF) -k start  HTTPD_START_CMD_PROXY = $(HTTPD_CMD) -f \
$(HTTPD_PROXY_CONF)  HTTPD_START_CMD_DEBUG = $(HTTPD_START_CMD) -X
@@ -1942,6 +2054,7 @@ SVNSERVE_STOP_CMD = kill `cat $(PWD)/svn
 			rm -f $(PWD)/svnserve-$(WC).pid
 
 start-httpd: $(HTTPD_CHECK_CONF)
+	-$(HTTPD_LOG_ROTATE)
 	$(HTTPD_START_CMD)
 	@echo "To run tests over http, run:"
 	@echo "    make check BASE_URL=http://localhost:$(HTTPD_CHECK_PORT)"
@@ -2064,7 +2177,7 @@ svn-check-javahl:
 	-if [ $(ENABLE_JAVA_BINDINGS) = yes ]; then \
 		(cd $(svn_builddir) && \
 			env LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) \
-			env MAKEFLAGS= make $(JAVAHL_CHECK_TARGET) 2>&1) | \
+			MAKEFLAGS= make $(JAVAHL_CHECK_TARGET) 2>&1) | \
 				tee $(svn_builddir)/tests.log.bindings.javahl; \
 	fi
 

Modified: subversion/branches/swig-py3/tools/dev/wc-ng/svn-wc-db-tester.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dev/wc-ng/svn-wc-db-tester.c?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dev/wc-ng/svn-wc-db-tester.c (original)
+++ subversion/branches/swig-py3/tools/dev/wc-ng/svn-wc-db-tester.c Wed Nov 28 \
21:25:32 2018 @@ -44,7 +44,7 @@
 static svn_error_t *
 version(apr_pool_t *pool)
 {
-  return svn_opt_print_help4(NULL, "svn-wc-db-tester", TRUE, FALSE, FALSE,
+  return svn_opt_print_help5(NULL, "svn-wc-db-tester", TRUE, FALSE, FALSE,
                              NULL, NULL, NULL, NULL, NULL, NULL, pool);
 }
 

Modified: subversion/branches/swig-py3/tools/dist/README.backport
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dist/README.backport?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dist/README.backport (original)
+++ subversion/branches/swig-py3/tools/dist/README.backport Wed Nov 28 21:25:32 2018
@@ -7,20 +7,23 @@ F1. Auto-merge bot; the nightly svn-role
 
 F2. Conflicts detector bot; the svn-backport-conflicts-1.9.x buildbot task.
 
-And two interactive functions, described later.
+And two interactive functions ¹:
+
+F3. Reviewing STATUS nominations and casting votes.
+
+F4. Adding new entries to STATUS.
 
 
 
 The scripts are:
 
 backport.pl:
-    oldest script, implements both [F1] and [F2], plus two interactive
-    functions ¹.  As of March 2015, used in production by svn-role and
-    by svn-backport-conflicts-1.9.x.
+    oldest script, implements [F1], [F2], and [F3].  As of Feb 2018, used in
+    production by svn-role (running on svn-qavm3) and by \
svn-backport-conflicts-1.9.x +    (a buildbot job).
 
 nominate.pl:
-    Symlink to backport.pl.  Implements one of the two interactive features.
-    Not used by bots.
+    Symlink to backport.pl.  Implements [F4].  (The script inspects its argv[0].)
 
 backport_tests_pl.py:
     Regression tests for backport.pl.
@@ -39,9 +42,11 @@ backport/*.py:
 
 detect-conflicting-backports.py:
     Implementation of [F2] using backport.py.
+    Not currently used in production.
 
 merge-approved-backports.py:
     Implementation of [F1] using backport.py.
+    Not currently used in production.
 
 backport_tests_py.py:
     Regression tests for detect-conflicting-backports.py and \
merge-approved-backports.py @@ -52,13 +57,28 @@ backport_tests.py:
     svntest framework (../../subversion/tests/cmdline/svntest/), which is
     written in Python  2.
 
-backport*.dump:
+    Note that backport_tests.py and backport/*.py are written in different
+    languages, so they never 'import' each other.  backport_tests.py invokes
+    detect-conflicting-backports.py, merge-approved-backports.py, and
+    backport.pl in the same manner: through subprocess.check_call().
+
+backport_tests_data/backport*.dump:
     Expected output files for backport_tests.py; see the BackportTest
-    decorator.
+    decorator in backport_tests.py.
 
 
 All scripts can be run with '--help' to display their usage messages.
 
+backport.pl is considered deprecated since backport.py is better architected
+and is written in a language that many more active developers are comfortable
+with.  The unattended jobs [F1] and [F2] should be converted to using
+backport.py whenever someone gets around to do the legwork.  The interactive
+versions [F3] and [F4] are still in active use, however, so the physical
+backport.pl script should be kept around until Python versions of these are
+available.
+
+
+TODO: document that "Notes: ... --accept=foo ..." is parsed, see backport_tests.py \
#3.  
 
 Â ¹ For backport.pl's interactive features, see:

Modified: subversion/branches/swig-py3/tools/dist/backport.pl
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/tools/dist/backport.pl?rev=1847678&r1=1847677&r2=1847678&view=diff
 ==============================================================================
--- subversion/branches/swig-py3/tools/dist/backport.pl (original)
+++ subversion/branches/swig-py3/tools/dist/backport.pl Wed Nov 28 21:25:32 2018
@@ -9,11 +9,11 @@ use v5.10.0; # needed for $^V
 # experimental and "subject to change" in v5.18 (see perl5180delta).  Every
 # use of it now triggers a warning.
 #
-# As of Perl v5.24.1, the semantics of given/when provided by Perl are
+# As of Perl v5.26.1, the semantics of given/when provided by Perl are
 # compatible with those expected by the script, so disable the warning for
 # those Perls.  But don't try to disable the the warning category on Perls
 # that don't know that category, since that breaks compilation.
-no if (v5.17.0 le $^V and $^V le v5.24.1),
+no if (v5.17.0 le $^V and $^V le v5.26.1),
    warnings => 'experimental::smartmatch';
 
 # Licensed to the Apache Software Foundation (ASF) under one
@@ -791,7 +791,7 @@ sub vote {
 
     # Add to state votes that aren't '+0' or 'edit'
     $state->{$_->{digest}}++ for grep
-                                   +{ qw/-1 t -0 t +1 t/ }->{$_->{vote}},
+                                 +($_->{approval} or $_->{vote} =~ \
/^(-1|-0|[+]1)$/),  @votesarray;
   }
 }
@@ -1279,7 +1279,7 @@ sub nominate_main {
   # Open the file in line-mode (not paragraph-mode).
   my @STATUS;
   tie @STATUS, "Tie::File", $STATUS, recsep => "\n";
-  my ($index) = grep { $STATUS[$_] =~ /^Veto/ } (0..$#STATUS);
+  my ($index) = grep { $STATUS[$_] =~ /^Veto|^Approved/ } (0..$#STATUS);
   die "Couldn't find where to add an entry" unless $index;
 
   # Add an empty line if needed.


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic