Modified: subversion/branches/ra-git/subversion/tests/libsvn_subr/stream-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_subr/stream-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_subr/stream-test.c 
(original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_subr/stream-test.c Tue 
Oct 11 09:11:50 2016
@@ -848,6 +848,158 @@ test_stream_compressed_read_full(apr_poo
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_stream_checksum(apr_pool_t *pool)
+{
+  svn_string_t *str =
+    svn_string_create("The quick brown fox jumps over the lazy dog", pool);
+  svn_checksum_t *actual;
+
+  SVN_ERR(svn_stream_contents_checksum(&actual,
+                                       svn_stream_from_string(str, pool),
+                                       svn_checksum_md5, pool, pool));
+  SVN_TEST_STRING_ASSERT("9e107d9d372bb6826bd81d3542a419d6",
+                         svn_checksum_to_cstring(actual, pool));
+
+  SVN_ERR(svn_stream_contents_checksum(&actual,
+                                       svn_stream_from_string(str, pool),
+                                       svn_checksum_sha1, pool, pool));
+  SVN_TEST_STRING_ASSERT("2fd4e1c67a2d28fced849ee1bb76e7391b93eb12",
+                         svn_checksum_to_cstring(actual, pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_stream_readline_file(const char *testname,
+                          const char *eol,
+                          apr_pool_t *pool)
+{
+  const char *tmp_dir;
+  const char *tmp_file;
+  svn_stream_t *stream;
+  svn_stringbuf_t *line;
+  svn_boolean_t eof;
+  static const char long_line[] =
+    "The quick brown fox jumps over the lazy dog, and "
+    "jackdaws love my big sphinx of quartz, and "
+    "pack my box with five dozen liquor jugs.";
+
+  SVN_ERR(svn_dirent_get_absolute(&tmp_dir, testname, pool));
+  SVN_ERR(svn_io_remove_dir2(tmp_dir, TRUE, NULL, NULL, pool));
+  SVN_ERR(svn_io_make_dir_recursively(tmp_dir, pool));
+  svn_test_add_dir_cleanup(tmp_dir);
+
+  /* Test 1: Read empty file. */
+  tmp_file = svn_dirent_join(tmp_dir, "empty", pool);
+  SVN_ERR(svn_io_file_create(tmp_file, "", pool));
+  SVN_ERR(svn_stream_open_readonly(&stream, tmp_file, pool, pool));
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_close(stream));
+
+  /* Test 2: Read empty line. */
+  tmp_file = svn_dirent_join(tmp_dir, "empty-line", pool);
+  SVN_ERR(svn_io_file_create(tmp_file, eol, pool));
+  SVN_ERR(svn_stream_open_readonly(&stream, tmp_file, pool, pool));
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(!eof);
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_close(stream));
+
+  /* Test 3: Read two lines. */
+  tmp_file = svn_dirent_join(tmp_dir, "lines", pool);
+  SVN_ERR(svn_io_file_create(tmp_file,
+                             apr_pstrcat(pool,
+                                         "first", eol, "second", eol,
+                                         SVN_VA_NULL),
+                             pool));
+  SVN_ERR(svn_stream_open_readonly(&stream, tmp_file, pool, pool));
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 5);
+  SVN_TEST_STRING_ASSERT(line->data, "first");
+  SVN_TEST_ASSERT(!eof);
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 6);
+  SVN_TEST_STRING_ASSERT(line->data, "second");
+  SVN_TEST_ASSERT(!eof);
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_close(stream));
+
+  /* Test 4: Content without end-of-line. */
+  tmp_file = svn_dirent_join(tmp_dir, "no-eol", pool);
+  SVN_ERR(svn_io_file_create(tmp_file, "text", pool));
+  SVN_ERR(svn_stream_open_readonly(&stream, tmp_file, pool, pool));
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 4);
+  SVN_TEST_STRING_ASSERT(line->data, "text");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_close(stream));
+
+  /* Test 5: Read long line. */
+  tmp_file = svn_dirent_join(tmp_dir, "long-line", pool);
+  SVN_ERR(svn_io_file_create(tmp_file,
+                             apr_pstrcat(pool, long_line, eol, SVN_VA_NULL),
+                             pool));
+  SVN_ERR(svn_stream_open_readonly(&stream, tmp_file, pool, pool));
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == strlen(long_line));
+  SVN_TEST_STRING_ASSERT(line->data, long_line);
+  SVN_TEST_ASSERT(!eof);
+
+  SVN_ERR(svn_stream_readline(stream, &line, eol, &eof, pool));
+  SVN_TEST_ASSERT(line->len == 0);
+  SVN_TEST_STRING_ASSERT(line->data, "");
+  SVN_TEST_ASSERT(eof);
+
+  SVN_ERR(svn_stream_close(stream));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_stream_readline_file_lf(apr_pool_t *pool)
+{
+  SVN_ERR(test_stream_readline_file("test_stream_readline_file_lf",
+                                    "\n", pool));
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_stream_readline_file_crlf(apr_pool_t *pool)
+{
+  SVN_ERR(test_stream_readline_file("test_stream_readline_file_crlf",
+                                    "\r\n", pool));
+  return SVN_NO_ERROR;
+}
+
 /* The test table.  */
 
 static int max_threads = 1;
@@ -879,6 +1031,12 @@ static struct svn_test_descriptor_t test
                    "test svn_stringbuf_from_stream"),
     SVN_TEST_PASS2(test_stream_compressed_read_full,
                    "test compression for streams without partial read"),
+    SVN_TEST_PASS2(test_stream_checksum,
+                   "test svn_stream_contents_checksum()"),
+    SVN_TEST_PASS2(test_stream_readline_file_lf,
+                   "test reading LF-terminated lines from file"),
+    SVN_TEST_PASS2(test_stream_readline_file_crlf,
+                   "test reading CRLF-terminated lines from file"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/ra-git/subversion/tests/libsvn_subr/string-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_subr/string-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_subr/string-test.c 
(original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_subr/string-test.c Tue 
Oct 11 09:11:50 2016
@@ -873,7 +873,7 @@ test_string_matching(apr_pool_t *pool)
 }
 
 static svn_error_t *
-test_string_skip_prefix(apr_pool_t *pool)
+test_cstring_skip_prefix(apr_pool_t *pool)
 {
   SVN_TEST_STRING_ASSERT(svn_cstring_skip_prefix("12345", "12345"),
                          "");
@@ -893,6 +893,33 @@ test_string_skip_prefix(apr_pool_t *pool
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_stringbuf_set(apr_pool_t *pool)
+{
+  svn_stringbuf_t *str = svn_stringbuf_create_empty(pool);
+
+  SVN_TEST_STRING_ASSERT(str->data, "");
+  SVN_TEST_INT_ASSERT(str->len, 0);
+
+  svn_stringbuf_set(str, "0123456789");
+  SVN_TEST_STRING_ASSERT(str->data, "0123456789");
+  SVN_TEST_INT_ASSERT(str->len, 10);
+
+  svn_stringbuf_set(str, "");
+  SVN_TEST_STRING_ASSERT(str->data, "");
+  SVN_TEST_INT_ASSERT(str->len, 0);
+
+  svn_stringbuf_set(str, "0123456789abcdef");
+  SVN_TEST_STRING_ASSERT(str->data, "0123456789abcdef");
+  SVN_TEST_INT_ASSERT(str->len, 16);
+
+  svn_stringbuf_set(str, "t");
+  SVN_TEST_STRING_ASSERT(str->data, "t");
+  SVN_TEST_INT_ASSERT(str->len, 1);
+
+  return SVN_NO_ERROR;
+}
+
 /*
    ====================================================================
    If you add a new test to this file, update this array.
@@ -967,8 +994,10 @@ static struct svn_test_descriptor_t test
                    "test string similarity scores"),
     SVN_TEST_PASS2(test_string_matching,
                    "test string matching"),
-    SVN_TEST_PASS2(test_string_skip_prefix,
+    SVN_TEST_PASS2(test_cstring_skip_prefix,
                    "test svn_cstring_skip_prefix()"),
+    SVN_TEST_PASS2(test_stringbuf_set,
+                   "test svn_stringbuf_set()"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/ra-git/subversion/tests/libsvn_subr/utf-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_subr/utf-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_subr/utf-test.c 
(original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_subr/utf-test.c Tue Oct 
11 09:11:50 2016
@@ -823,6 +823,155 @@ test_utf_conversions(apr_pool_t *pool)
 }
 
 
+static svn_error_t *
+test_utf_normalize(apr_pool_t *pool)
+{
+  /* Normalized: NFC */
+  static const char nfc[] =
+    "\xe1\xb9\xa8"              /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "\xe1\xb8\x87"              /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "\xe1\xb8\x9d"              /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "\xc5\xa1"                  /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "\xe1\xbb\x9d"              /* o with grave and hook */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  /* Normalized: NFD */
+  static const char nfd[] =
+    "S\xcc\xa3\xcc\x87"         /* S with dot above and below */
+    "u\xcc\x8a"                 /* u with ring */
+    "b\xcc\xb1"                 /* b with macron below */
+    "v\xcc\x83"                 /* v with tilde */
+    "e\xcc\xa7\xcc\x86"         /* e with breve and cedilla */
+    "r\xcc\x8f"                 /* r with double grave */
+    "s\xcc\x8c"                 /* s with caron */
+    "i\xcc\x88\xcc\x81"         /* i with diaeresis and acute */
+    "o\xcc\x9b\xcc\x80"         /* o with grave and hook */
+    "n\xcc\xad";                /* n with circumflex below */
+
+  /* Mixed, denormalized */
+  static const char mixup[] =
+    "S\xcc\x87\xcc\xa3"         /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "b\xcc\xb1"                 /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "e\xcc\xa7\xcc\x86"         /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "s\xcc\x8c"                 /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "o\xcc\x80\xcc\x9b"         /* o with grave and hook */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  /* Invalid UTF-8 */
+  static const char invalid[] =
+    "\xe1\xb9\xa8"              /* S with dot above and below */
+    "\xc5\xaf"                  /* u with ring */
+    "\xe1\xb8\x87"              /* b with macron below */
+    "\xe1\xb9\xbd"              /* v with tilde */
+    "\xe1\xb8\x9d"              /* e with breve and cedilla */
+    "\xc8\x91"                  /* r with double grave */
+    "\xc5\xa1"                  /* s with caron */
+    "\xe1\xb8\xaf"              /* i with diaeresis and acute */
+    "\xe6"                      /* Invalid byte */
+    "\xe1\xb9\x8b";             /* n with circumflex below */
+
+  const char *result;
+  svn_membuf_t buf;
+
+  svn_membuf__create(&buf, 0, pool);
+  SVN_ERR(svn_utf__normalize(&result, nfc, strlen(nfc), &buf));
+  SVN_TEST_STRING_ASSERT(result, nfc);
+  SVN_ERR(svn_utf__normalize(&result, nfd, strlen(nfd), &buf));
+  SVN_TEST_STRING_ASSERT(result, nfc);
+  SVN_ERR(svn_utf__normalize(&result, mixup, strlen(mixup), &buf));
+  SVN_TEST_STRING_ASSERT(result, nfc);
+
+  SVN_TEST_ASSERT_ERROR(svn_utf__normalize(&result, invalid, strlen(invalid),
+                                           &buf),
+                        SVN_ERR_UTF8PROC_ERROR);
+
+  return SVN_NO_ERROR;
+}
+
+
+static svn_error_t *
+test_utf_xfrm(apr_pool_t *pool)
+{
+  const char *str;
+  const char *result;
+  svn_membuf_t buf;
+
+  svn_membuf__create(&buf, 0, pool);
+
+  /* ASCII string */
+  str = "Subversion";
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Subversion");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "subversion");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Subversion");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "subversion");
+
+  /* M (u with diaeresis) (sharp s) en */
+  str = "M" "\xc3\xbc" "\xc3\x9f" "en";
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "M" "\xc3\xbc" "\xc3\x9f" "en");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "m" "\xc3\xbc" "ssen");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Mu" "\xc3\x9f" "en");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "mussen");
+
+  /* Na (i with diaeresis) vet (e with acute), decomposed */
+  str = "Nai" "\xcc\x88" "vete" "\xcc\x81";
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Na" "\xc3\xaf" "vet" "\xc3\xa9");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "na" "\xc3\xaf" "vet" "\xc3\xa9");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Naivete");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "naivete");
+
+  /* (I with dot above) stanbul */
+  str = "\xc4\xb0" "stanbul";
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "\xc4\xb0" "stanbul");
+
+  /* The Latin Capital Letter I with Dot Above (0130) should fold into
+     Latin Small Letter I (0069) with Combining Dot Above (0307) per full
+     mapping in http://www.unicode.org/Public/UNIDATA/CaseFolding.txt */
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, FALSE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "i" "\xcc\x87" "stanbul");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), FALSE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "Istanbul");
+  SVN_ERR(svn_utf__xfrm(&result, str, strlen(str), TRUE, TRUE, &buf));
+  SVN_TEST_STRING_ASSERT(result, "istanbul");
+
+  /* Invalid UTF-8 */
+  str = "a" "\xe6" "bc";
+  SVN_TEST_ASSERT_ERROR(svn_utf__xfrm(&result, str, strlen(str),
+                                      FALSE, FALSE, &buf),
+                        SVN_ERR_UTF8PROC_ERROR);
+  SVN_TEST_ASSERT_ERROR(svn_utf__xfrm(&result, str, strlen(str),
+                                      TRUE, FALSE, &buf),
+                        SVN_ERR_UTF8PROC_ERROR);
+  SVN_TEST_ASSERT_ERROR(svn_utf__xfrm(&result, str, strlen(str),
+                                      FALSE, TRUE, &buf),
+                        SVN_ERR_UTF8PROC_ERROR);
+  SVN_TEST_ASSERT_ERROR(svn_utf__xfrm(&result, str, strlen(str),
+                                      TRUE, TRUE, &buf),
+                        SVN_ERR_UTF8PROC_ERROR);
+
+  return SVN_NO_ERROR;
+}
+
 
 /* The test table.  */
 
@@ -849,6 +998,10 @@ static struct svn_test_descriptor_t test
                    "test svn_utf__is_normalized"),
     SVN_TEST_PASS2(test_utf_conversions,
                    "test svn_utf__utf{16,32}_to_utf8"),
+    SVN_TEST_PASS2(test_utf_normalize,
+                   "test svn_utf__normalize"),
+    SVN_TEST_PASS2(test_utf_xfrm,
+                   "test svn_utf__xfrm"),
     SVN_TEST_NULL
   };
 

Modified: subversion/branches/ra-git/subversion/tests/libsvn_wc/op-depth-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_wc/op-depth-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_wc/op-depth-test.c 
(original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_wc/op-depth-test.c Tue 
Oct 11 09:11:50 2016
@@ -12032,7 +12032,7 @@ static struct svn_test_descriptor_t test
                        "move depth expansion"),
     SVN_TEST_OPTS_XFAIL(move_retract,
                        "move retract (issue 4336)"),
-    SVN_TEST_OPTS_PASS(move_delete_file_externals,
+    SVN_TEST_OPTS_XFAIL(move_delete_file_externals,
                        "move/delete file externals (issue 4293)"),
     SVN_TEST_OPTS_PASS(update_with_tree_conflict,
                        "update with tree conflict (issue 4347)"),

Modified: subversion/branches/ra-git/subversion/tests/libsvn_wc/utils.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_wc/utils.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_wc/utils.c (original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_wc/utils.c Tue Oct 11 
09:11:50 2016
@@ -530,6 +530,9 @@ sbox_wc_update_depth(svn_test__sandbox_t
   APR_ARRAY_PUSH(paths, const char *) = sbox_wc_path(b, path);
   SVN_ERR(svn_test__create_client_ctx(&ctx, b, b->pool));
 
+  /* Note: Tree conflict resolver tests for libsvn_client depend on this
+   * passing FALSE for adds_as_modifications so that tree conflicts are
+   * created in case of add vs add upon update. */
   return svn_client_update4(&result_revs, paths, &revision, depth,
                             sticky, FALSE, FALSE, FALSE, FALSE,
                             ctx, b->pool);

Modified: 
subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-queries-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-queries-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-queries-test.c 
(original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-queries-test.c Tue 
Oct 11 09:11:50 2016
@@ -101,6 +101,7 @@ static const int slow_statements[] =
   STMT_SELECT_REVERT_LIST_RECURSIVE,
   STMT_SELECT_DELETE_LIST,
   STMT_SELECT_UPDATE_MOVE_LIST,
+  STMT_FIND_REPOS_PATH_IN_WC,
 
   /* Designed as slow to avoid penalty on other queries */
   STMT_SELECT_UNREFERENCED_PRISTINES,

Modified: subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-test.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-test.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-test.c (original)
+++ subversion/branches/ra-git/subversion/tests/libsvn_wc/wc-test.c Tue Oct 11 
09:11:50 2016
@@ -434,6 +434,65 @@ test_legacy_commit2(const svn_test_opts_
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_internal_file_modified(const svn_test_opts_t *opts, apr_pool_t *pool)
+{
+  svn_test__sandbox_t b;
+  svn_boolean_t modified;
+  const char *iota_path;
+  apr_time_t time;
+
+  SVN_ERR(svn_test__sandbox_create(&b, "internal_file_modified_p",
+                                   opts, pool));
+  SVN_ERR(sbox_add_and_commit_greek_tree(&b));
+
+  iota_path = sbox_wc_path(&b, "iota");
+
+  /* No modification, timestamps match.*/
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, FALSE, pool));
+  SVN_TEST_ASSERT(!modified);
+
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, TRUE, pool));
+  SVN_TEST_ASSERT(!modified);
+
+  /* Change timestamp on 'iota' and check. */
+  SVN_ERR(svn_io_file_affected_time(&time, iota_path, pool));
+  SVN_ERR(svn_io_set_file_affected_time(time + apr_time_from_sec(1),
+                                        iota_path, pool));
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, FALSE, pool));
+  SVN_TEST_ASSERT(!modified);
+
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, TRUE, pool));
+  SVN_TEST_ASSERT(!modified);
+
+  /* Modify 'iota' to be different size. */
+  SVN_ERR(sbox_file_write(&b, iota_path, "new iota"));
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, FALSE, pool));
+  SVN_TEST_ASSERT(modified);
+
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, TRUE, pool));
+  SVN_TEST_ASSERT(modified);
+
+  /* Working copy is smart and able to detect changes in files of different
+   * size even if timestamp didn't change. */
+  SVN_ERR(svn_io_set_file_affected_time(time, iota_path, pool));
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, FALSE, pool));
+  SVN_TEST_ASSERT(modified);
+
+  SVN_ERR(svn_wc__internal_file_modified_p(&modified, b.wc_ctx->db,
+                                           iota_path, TRUE, pool));
+  SVN_TEST_ASSERT(modified);
+
+  return SVN_NO_ERROR;
+}
+
 /* ---------------------------------------------------------------------- */
 /* The list of test functions */
 
@@ -454,6 +513,8 @@ static struct svn_test_descriptor_t test
                        "test legacy commit1"),
     SVN_TEST_OPTS_PASS(test_legacy_commit2,
                        "test legacy commit2"),
+    SVN_TEST_OPTS_PASS(test_internal_file_modified,
+                       "test internal_file_modified"),
     SVN_TEST_NULL
   };
 

Modified: 
subversion/branches/ra-git/subversion/tests/manual/tree-conflicts-add-vs-add.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/manual/tree-conflicts-add-vs-add.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- 
subversion/branches/ra-git/subversion/tests/manual/tree-conflicts-add-vs-add.py 
(original)
+++ 
subversion/branches/ra-git/subversion/tests/manual/tree-conflicts-add-vs-add.py 
Tue Oct 11 09:11:50 2016
@@ -39,9 +39,9 @@ from itertools import product
 def run_cmd(cmd, verbose=True, shell=False):
   if verbose:
     if shell:
-      print '\n---', cmd
+      print('\n---', cmd)
     else:
-      print '\n---', ' '.join(cmd)
+      print('\n---', ' '.join(cmd))
   p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=shell)
   stdout,stderr = p.communicate()[0:2]
   if verbose and stdout:
@@ -254,7 +254,7 @@ def co(name, local_action, local_kind, i
   svn('up', ctx.WC)
 
   head = ctx.head()
-  print head
+  print(head)
 
   ctx.create_wc2()
   target = ctx.wc2(name)
@@ -289,7 +289,7 @@ def up(name, local_action, local_kind, i
   svn('up', ctx.WC)
 
   head = ctx.head()
-  print head
+  print(head)
 
   target = ctx.wc(name)
   incoming_action(ctx, target, incoming_kind, 'incoming')
@@ -401,12 +401,12 @@ try:
     if skip(row):
       continue
     name = nameof(row)
-    print name
+    print(name)
     test_func = row[0]
     results.append( (name, analyze( name, test_func( name, *row[1:] ) )) )
 except:
   if name:
-    print 'Error during', name
+    print('Error during', name)
   raise
 finally:
   lines = []
@@ -419,5 +419,5 @@ finally:
     else:
       lines.append('----- ' + name + ': nothing.')
   dump = '\n'.join(lines)
-  print dump
+  print(dump)
   rewrite_file('tree-conflicts-add-vs-add.py.results', dump)

Modified: subversion/branches/ra-git/subversion/tests/svn_test_fs.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/svn_test_fs.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/svn_test_fs.c (original)
+++ subversion/branches/ra-git/subversion/tests/svn_test_fs.c Tue Oct 11 
09:11:50 2016
@@ -646,10 +646,27 @@ svn_test__validate_changes(svn_fs_root_t
                            apr_hash_t *expected,
                            apr_pool_t *pool)
 {
+  svn_fs_path_change_iterator_t *iter;
   apr_hash_t *actual;
   apr_hash_index_t *hi;
+  svn_fs_path_change3_t *change;
 
-  SVN_ERR(svn_fs_paths_changed2(&actual, root, pool));
+  SVN_ERR(svn_fs_paths_changed3(&iter, root, pool, pool));
+  SVN_ERR(svn_fs_path_change_get(&change, iter));
+
+  /* We collect all changes b/c this is the easiest way to check for an
+     exact match against EXPECTED. */
+  actual = apr_hash_make(pool);
+  while (change)
+    {
+      const char *path = apr_pstrmemdup(pool, change->path.data,
+                                        change->path.len);
+      /* No duplicates! */
+      SVN_TEST_ASSERT(!apr_hash_get(actual, path, change->path.len));
+      apr_hash_set(actual, path, change->path.len, path);
+
+      SVN_ERR(svn_fs_path_change_get(&change, iter));
+    }
 
 #if 0
   /* Print ACTUAL and EXPECTED. */

Modified: subversion/branches/ra-git/subversion/tests/svn_test_fs.h
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/svn_test_fs.h?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/svn_test_fs.h (original)
+++ subversion/branches/ra-git/subversion/tests/svn_test_fs.h Tue Oct 11 
09:11:50 2016
@@ -134,7 +134,7 @@ svn_test__validate_tree(svn_fs_root_t *r
                         int num_entries,
                         apr_pool_t *pool);
 
-/* Verify that svn_fs_paths_changed2(ROOT) returns a hash with exactly
+/* Verify that svn_fs_paths_changed3(ROOT) returns a hash with exactly
    the same keys as EXPECTED_KEYS.  Values are not currently verified.
  */
 svn_error_t *

Modified: subversion/branches/ra-git/subversion/tests/svn_test_main.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/subversion/tests/svn_test_main.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/subversion/tests/svn_test_main.c (original)
+++ subversion/branches/ra-git/subversion/tests/svn_test_main.c Tue Oct 11 
09:11:50 2016
@@ -407,26 +407,29 @@ do_test_num(const char *progname,
             apr_pool_t *pool)
 {
   svn_boolean_t skip, xfail, wimp;
-  svn_error_t *err = NULL;
+  svn_error_t *err;
   const char *msg = NULL;  /* the message this individual test prints out */
   const struct svn_test_descriptor_t *desc;
   const int array_size = get_array_size(test_funcs);
   svn_boolean_t run_this_test; /* This test's mode matches DESC->MODE. */
   enum svn_test_mode_t test_mode;
+  volatile int adjusted_num = test_num; /* volatile for setjmp */
+
+  /* This allows './some-test -- -1' to run the last test. */
+  if (adjusted_num < 0)
+    adjusted_num += array_size + 1;
 
   /* Check our array bounds! */
-  if (test_num < 0)
-    test_num += array_size + 1;
-  if ((test_num > array_size) || (test_num <= 0))
+  if ((adjusted_num > array_size) || (adjusted_num <= 0))
     {
       if (header_msg && *header_msg)
         printf("%s", *header_msg);
-      printf("FAIL: %s: THERE IS NO TEST NUMBER %2d\n", progname, test_num);
+      printf("FAIL: %s: THERE IS NO TEST NUMBER %2d\n", progname, 
adjusted_num);
       skip_cleanup = TRUE;
       return TRUE;  /* BAIL, this test number doesn't exist. */
     }
 
-  desc = &test_funcs[test_num];
+  desc = &test_funcs[adjusted_num];
   /* Check the test predicate. */
   if (desc->predicate.func
       && desc->predicate.func(opts, desc->predicate.value, pool))
@@ -462,7 +465,7 @@ do_test_num(const char *progname,
     {
       /* Do test */
       if (msg_only || skip || !run_this_test)
-        ; /* pass */
+        err = NULL; /* pass */
       else if (desc->func2)
         err = (*desc->func2)(pool);
       else
@@ -480,7 +483,7 @@ do_test_num(const char *progname,
     }
 
   /* Failure means unexpected results -- FAIL or XPASS. */
-  skip_cleanup = log_results(progname, test_num, msg_only, run_this_test,
+  skip_cleanup = log_results(progname, adjusted_num, msg_only, run_this_test,
                              skip, xfail, wimp, err, msg, desc);
 
   return skip_cleanup;

Modified: subversion/branches/ra-git/tools/backup/hot-backup.py.in
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/backup/hot-backup.py.in?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/backup/hot-backup.py.in (original)
+++ subversion/branches/ra-git/tools/backup/hot-backup.py.in Tue Oct 11 
09:11:50 2016
@@ -70,7 +70,7 @@ def chmod_tree(path, mode, mask):
 def safe_rmtree(dirname, retry=0):
   "Remove the tree at DIRNAME, making it writable first"
   def rmtree(dirname):
-    chmod_tree(dirname, 0666, 0666)
+    chmod_tree(dirname, 0o666, 0o666)
     shutil.rmtree(dirname)
 
   if not os.path.exists(dirname):
@@ -117,7 +117,7 @@ try:
                                                       "num-backups=",
                                                       "verify",
                                                       "help"])
-except getopt.GetoptError, e:
+except getopt.GetoptError as e:
   sys.stderr.write("ERROR: %s\n\n" % e)
   sys.stderr.flush()
   usage(sys.stderr)
@@ -137,6 +137,11 @@ for o, a in opts:
     usage()
     sys.exit()
 
+if archive_type not in (None, 'bz2', 'gz', 'zip', 'zip64'):
+  sys.stderr.write("ERROR: Bad --archive-type\n")
+  usage(sys.stderr)
+  sys.exit(2)
+
 if len(args) != 2:
   sys.stderr.write("ERROR: only two arguments allowed.\n\n")
   sys.stderr.flush()
@@ -198,7 +203,7 @@ def get_youngest_revision():
   """Examine the repository REPO_DIR using the svnlook binary
   specified by SVNLOOK, and return the youngest revision."""
 
-  p = subprocess.Popen([svnlook, 'youngest', repo_dir],
+  p = subprocess.Popen([svnlook, 'youngest', '--', repo_dir],
                        stdin=subprocess.PIPE,
                        stdout=subprocess.PIPE,
                        stderr=subprocess.PIPE)
@@ -226,7 +231,7 @@ print("Beginning hot backup of '"+ repo_
 
 try:
   youngest = get_youngest_revision()
-except Exception, e:
+except Exception as e:
   sys.stderr.write("%s\n" % e)
   sys.stderr.flush()
   sys.exit(1)
@@ -245,7 +250,7 @@ backup_subdir = os.path.join(backup_dir,
 # rather than start from 1 and increment because the starting
 # increments may have already been removed due to num_backups.
 
-regexp = re.compile("^" + repo + "-" + youngest +
+regexp = re.compile("^" + re.escape(repo) + "-" + re.escape(youngest) +
                     "(-(?P<increment>[0-9]+))?" + ext_re + "$")
 directory_list = os.listdir(backup_dir)
 young_list = [x for x in directory_list if regexp.search(x)]
@@ -262,8 +267,8 @@ if young_list:
 ###         copied last.
 
 print("Backing up repository to '" + backup_subdir + "'...")
-err_code = subprocess.call([svnadmin, "hotcopy", repo_dir, 
-                            backup_subdir, "--clean-logs"])
+err_code = subprocess.call([svnadmin, "hotcopy", "--clean-logs",
+                            '--', repo_dir, backup_subdir])
 if err_code != 0:
   sys.stderr.write("Unable to backup the repository.\n")
   sys.stderr.flush()
@@ -274,7 +279,7 @@ else:
 ### Step 4: Verify the hotcopy
 if verify_copy:
   print("Verifying backup...")
-  err_code = subprocess.call([svnadmin, "verify", "--quiet", backup_subdir])
+  err_code = subprocess.call([svnadmin, "verify", "--quiet", '--', 
backup_subdir])
   if err_code != 0:
     sys.stderr.write("Backup verification failed.\n")
     sys.stderr.flush()
@@ -294,10 +299,10 @@ if archive_type:
       tar = tarfile.open(archive_path, 'w:' + archive_type)
       tar.add(backup_subdir, os.path.basename(backup_subdir))
       tar.close()
-    except ImportError, e:
+    except ImportError as e:
       err_msg = "Import failed: " + str(e)
       err_code = -2
-    except tarfile.TarError, e:
+    except tarfile.TarError as e:
       err_msg = "Tar failed: " + str(e)
       err_code = -3
 
@@ -320,10 +325,10 @@ if archive_type:
       for dirpath, dirs, files in os.walk(backup_subdir):
         add_to_zip(zp, backup_dir, dirpath, dirs + files)
       zp.close()
-    except ImportError, e:
+    except ImportError as e:
       err_msg = "Import failed: " + str(e)
       err_code = -4
-    except zipfile.error, e:
+    except zipfile.error as e:
       err_msg = "Zip failed: " + str(e)
       err_code = -5
 
@@ -340,7 +345,7 @@ if archive_type:
 ###         NUM_BACKUPS.
 
 if num_backups > 0:
-  regexp = re.compile("^" + repo + "-[0-9]+(-[0-9]+)?" + ext_re + "$")
+  regexp = re.compile("^" + re.escape(repo) + "-[0-9]+(-[0-9]+)?" + ext_re + 
"$")
   directory_list = os.listdir(backup_dir)
   old_list = [x for x in directory_list if regexp.search(x)]
   old_list.sort(comparator)

Modified: subversion/branches/ra-git/tools/client-side/bash_completion
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/bash_completion?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/client-side/bash_completion (original)
+++ subversion/branches/ra-git/tools/client-side/bash_completion Tue Oct 11 
09:11:50 2016
@@ -1136,7 +1136,7 @@ _svnadmin ()
                ;;
        dump)
                cmdOpts="-r --revision --incremental -q --quiet --deltas \
-                        -M --memory-cache-size"
+                        -M --memory-cache-size -F --file"
                ;;
        freeze)
                cmdOpts="-F --file"
@@ -1150,7 +1150,8 @@ _svnadmin ()
        load)
                cmdOpts="--ignore-uuid --force-uuid --parent-dir -q --quiet \
                         --use-pre-commit-hook --use-post-commit-hook \
-                        --bypass-prop-validation -M --memory-cache-size"
+                        --bypass-prop-validation -M --memory-cache-size \
+                        --no-flush-to-disk -F --file"
                ;;
        lstxns)
                cmdOpts="-r --revision"

Modified: subversion/branches/ra-git/tools/client-side/change-svn-wc-format.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/change-svn-wc-format.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/client-side/change-svn-wc-format.py 
(original)
+++ subversion/branches/ra-git/tools/client-side/change-svn-wc-format.py Tue 
Oct 11 09:11:50 2016
@@ -24,6 +24,7 @@
 import sys
 import os
 import getopt
+import stat
 try:
   my_getopt = getopt.gnu_getopt
 except AttributeError:
@@ -96,7 +97,7 @@ class WCFormatConverter:
       print("Parsing file '%s'" % entries.path)
     try:
       entries.parse(self.verbosity)
-    except UnrecognizedWCFormatException, e:
+    except UnrecognizedWCFormatException as e:
       if self.error_on_unrecognized:
         raise
       sys.stderr.write("%s, skipping\n" % e)
@@ -116,7 +117,7 @@ class WCFormatConverter:
       print("Checking whether WC format can be converted")
     try:
       entries.assert_valid_format(format_nbr, self.verbosity)
-    except LossyConversionException, e:
+    except LossyConversionException as e:
       # In --force mode, ignore complaints about lossy conversion.
       if self.force:
         print("WARNING: WC format conversion will be lossy. Dropping "\
@@ -265,11 +266,11 @@ class Entries:
     assert len(str(format_nbr)) <= self.format_nbr_bytes
     format_string = '%0' + str(self.format_nbr_bytes) + 'd'
 
-    os.chmod(self.path, 0600)
+    os.chmod(self.path, stat.S_IRUSR | stat.S_IWUSR)
     output = open(self.path, "r+", 0)
     output.write(format_string % format_nbr)
     output.close()
-    os.chmod(self.path, 0400)
+    os.chmod(self.path, stat.S_IRUSR)
 
 class Entry:
   "Describes an entry in a WC."
@@ -334,14 +335,14 @@ class Format:
     if os.path.exists(self.path):
       if verbosity >= 1:
         print("%s will be updated." % self.path)
-      os.chmod(self.path,0600)
+      os.chmod(self.path, stat.S_IRUSR | stat.S_IWUSR)
     else:
       if verbosity >= 1:
         print("%s does not exist, creating it." % self.path)
     format = open(self.path, "w")
     format.write(format_string % format_nbr)
     format.close()
-    os.chmod(self.path, 0400)
+    os.chmod(self.path, stat.S_IRUSR)
 
 class LocalException(Exception):
   """Root of local exception class hierarchy."""
@@ -405,7 +406,7 @@ def main():
 
   try:
     converter.change_wc_format(new_format_nbr)
-  except LocalException, e:
+  except LocalException as e:
     if debug:
       raise
     sys.stderr.write("%s\n" % e)

Modified: subversion/branches/ra-git/tools/client-side/mergeinfo-sanitizer.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/mergeinfo-sanitizer.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/client-side/mergeinfo-sanitizer.py 
(original)
+++ subversion/branches/ra-git/tools/client-side/mergeinfo-sanitizer.py Tue Oct 
11 09:11:50 2016
@@ -106,14 +106,14 @@ def location_segment_callback(segment, p
 # This function does the authentication in an interactive way
 ##
 def prompt_func_ssl_unknown_cert(realm, failures, cert_info, may_save, pool):
-  print "The certificate details are as follows:"
-  print "--------------------------------------"
-  print "Issuer     : " + str(cert_info.issuer_dname)
-  print "Hostname   : " + str(cert_info.hostname)
-  print "ValidFrom  : " + str(cert_info.valid_from)
-  print "ValidUpto  : " + str(cert_info.valid_until)
-  print "Fingerprint: " + str(cert_info.fingerprint)
-  print ""
+  print("The certificate details are as follows:")
+  print("--------------------------------------")
+  print("Issuer     : " + str(cert_info.issuer_dname))
+  print("Hostname   : " + str(cert_info.hostname))
+  print("ValidFrom  : " + str(cert_info.valid_from))
+  print("ValidUpto  : " + str(cert_info.valid_until))
+  print("Fingerprint: " + str(cert_info.fingerprint))
+  print("")
   ssl_trust = core.svn_auth_cred_ssl_server_trust_t()
   if may_save:
     choice = raw_input( "accept (t)temporarily   (p)permanently: ")
@@ -166,7 +166,7 @@ def get_new_location_segments(parsed_ori
                                      revision_range.end, revision_range.start 
+ 1, location_segment_callback)
           except svn.core.SubversionException:
             sys.stderr.write(" Could not find location segments for %s \n" % 
path)
-      except Exception, e:
+      except Exception as e:
         sys.stderr.write("")
 
 
@@ -182,13 +182,13 @@ def sanitize_mergeinfo(parsed_original_m
                                            mergeinfo, 1, temp_pool)
   #There should be no mergeinfo added by our population. There should only
   #be deletion of mergeinfo. so take it from diff_mergeinfo[0]
-  print "The bogus mergeinfo summary:"
+  print("The bogus mergeinfo summary:")
   bogus_mergeinfo_deleted = diff_mergeinfo[0]
   for bogus_mergeinfo_path in bogus_mergeinfo_deleted:
     sys.stdout.write(bogus_mergeinfo_path + ": ")
     for revision_range in bogus_mergeinfo_deleted[bogus_mergeinfo_path]:
       sys.stdout.write(str(revision_range.start + 1) + "-" + 
str(revision_range.end) + ",")
-    print ""
+    print("")
 
 ##
 # This function tries to 'propset the new mergeinfo into the working copy.
@@ -204,7 +204,7 @@ def fix_sanitized_mergeinfo(parsed_origi
     with open(hash_file, "r") as f:
       old_hash = pickle.load(f)
     f.close
-  except IOError, e:
+  except IOError as e:
     get_new_location_segments(parsed_original_mergeinfo, repo_root, wcpath, 
ctx)
     hasher(hash_file, newmergeinfo_file)
     try:
@@ -217,7 +217,7 @@ def fix_sanitized_mergeinfo(parsed_origi
     with open(newmergeinfo_file, "r") as f:
       new_hash = md5_of_file(f)
     f.close
-  except IOError, e:
+  except IOError as e:
     if not mergeinfo:
       get_new_location_segments(parsed_original_mergeinfo, repo_root, wcpath, 
ctx)
     hasher(hash_file, newmergeinfo_file)
@@ -233,7 +233,7 @@ def fix_sanitized_mergeinfo(parsed_origi
       os.remove(newmergeinfo_file)
       os.remove(hash_file)
   else:
-    print "The hashes are not matching. Probable chance of unwanted tweaking 
in the mergeinfo"
+    print("The hashes are not matching. Probable chance of unwanted tweaking 
in the mergeinfo")
 
 
 ##
@@ -242,8 +242,8 @@ def fix_sanitized_mergeinfo(parsed_origi
 def check_local_modifications(wcpath, temp_pool):
   has_local_mod = wc.svn_wc_revision_status(wcpath, None, 0, None, temp_pool)
   if has_local_mod.modified:
-    print """The working copy has local modifications. Please revert them or 
clean
-the working copy before running the script."""
+    print("""The working copy has local modifications. Please revert them or 
clean
+the working copy before running the script.""")
     sys.exit(1)
 
 def get_original_mergeinfo(wcpath, revision, depth, ctx, temp_pool):
@@ -263,7 +263,7 @@ def get_original_mergeinfo(wcpath, revis
 def main():
   try:
     opts, args = my_getopt(sys.argv[1:], "h?f", ["help", "fix"])
-  except Exception, e:
+  except Exception as e:
     sys.stderr.write(""" Improperly used """)
     sys.exit(1)
 
@@ -313,7 +313,7 @@ if __name__ == "__main__":
   try:
     main()
   except KeyboardInterrupt:
-    print ""
+    print("")
     sys.stderr.write("The script is interrupted and stopped manually.")
-    print ""
+    print("")
 

Modified: subversion/branches/ra-git/tools/client-side/svn-graph.pl
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/svn-graph.pl?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/client-side/svn-graph.pl (original)
+++ subversion/branches/ra-git/tools/client-side/svn-graph.pl Tue Oct 11 
09:11:50 2016
@@ -43,7 +43,6 @@ use Getopt::Std;
 $|=1;
 
 require SVN::Core;
-require SVN::Ra;
 require SVN::Client;
 
 # The URL of the Subversion repository we wish to graph
@@ -60,17 +59,6 @@ my $startpath;
 # Set the variables declared above.
 parse_commandline();
 
-# Point at the root of a repository so we get can look at
-# every revision.
-my $auth = (new SVN::Client())->auth;
-my $ra = SVN::Ra->new(url => $repos_url, auth => $auth);
-
-# Handle identifier for the aboslutely youngest revision.
-if ($youngest eq 'HEAD')
-{
-  $youngest = $ra->get_latest_revnum();
-}
-
 # The "interesting" nodes are potential sources for copies.  This list
 #   grows as we move through time.
 # The "tracking" nodes are the most recent revisions of paths we're
@@ -110,7 +98,7 @@ usage: svn-graph.pl [-r START_REV:END_RE
   getopts('r:p:h', \%cmd_opts) or die $usage;
 
   die $usage if scalar(@ARGV) < 1;
-  $repos_url = $ARGV[0];
+  $repos_url = SVN::Core::uri_canonicalize($ARGV[0]);
 
   $cmd_opts{'r'} =~ m/(\d+)(:(.+))?/;
   if ($3)
@@ -207,6 +195,7 @@ sub process_revision
 # Write a descriptor for the graph in GraphViz .dot format to stdout.
 sub write_graph_descriptor
 {
+  my $client = SVN::Client->new;
   # Begin writing the graph descriptor.
   print "digraph tree {\n";
   print "\tgraph [bgcolor=white];\n";
@@ -215,7 +204,7 @@ sub write_graph_descriptor
   print "\n";
 
   # Retrieve the requested history.
-  $ra->get_log(['/'], $startrev, $youngest, 0, 1, 0, \&process_revision);
+  $client->log($repos_url, $startrev, $youngest, 1, 0, \&process_revision);
 
   # Now ensure that everything is linked.
   foreach my $codeline_change (keys %codeline_changes_forward)

Modified: 
subversion/branches/ra-git/tools/client-side/svn-mergeinfo-normalizer/logic.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/svn-mergeinfo-normalizer/logic.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- 
subversion/branches/ra-git/tools/client-side/svn-mergeinfo-normalizer/logic.c 
(original)
+++ 
subversion/branches/ra-git/tools/client-side/svn-mergeinfo-normalizer/logic.c 
Tue Oct 11 09:11:50 2016
@@ -305,7 +305,7 @@ show_removing_obsoletes(svn_min__opt_sta
       && progress->needs_header)
     {
       SVN_ERR(svn_cmdline_printf(scratch_pool,
-                                _("\n    Removing obsolete entries ...\n")));
+                       _("\n    Trying to remove obsolete entries ...\n")));
       progress->needs_header = FALSE;
     }
 
@@ -498,9 +498,11 @@ find_surviving_copies(apr_array_header_t
  * enabled in it.
  *
  * If LOCAL_ONLY is set, only remove branches that are known to have been
- * deleted as per LOOKUP - this is for quick checks.  Track progress in
- * PROGRESS and update MERGEINFO is we can remove the info for branch PATH
- * from it.
+ * deleted (as per LOOKUP) with no surviving copies etc.  This is for quick
+ * checks.
+ *
+ * Track progress in PROGRESS and update MERGEINFO if we can remove the
+ * info for branch PATH from it.
  *
  * Use SCRATCH_POOL for temporaries.
  */
@@ -1339,10 +1341,10 @@ show_elision_result(svn_mergeinfo_t pare
           if (parent_mergeinfo)
             SVN_ERR(svn_cmdline_printf(scratch_pool,
                       _("\n    Sub-tree merge info cannot be elided due to "
-                        "the following branches:\n")));
+                        "the following branch(es):\n")));
           else
             SVN_ERR(svn_cmdline_printf(scratch_pool,
-                  _("\n    Merge info kept for the following branches:\n")));
+                _("\n    Merge info kept for the following branch(es):\n")));
 
           sorted_mi = svn_sort__hash(subtree_mergeinfo,
                                     svn_sort_compare_items_lexically,
@@ -1606,7 +1608,7 @@ show_obsoletes_summary(svn_min__branch_l
   iterpool = svn_pool_create(scratch_pool);
 
   SVN_ERR(svn_cmdline_printf(iterpool,
-                             _("\nEncountered %d missing branches:\n"),
+                             _("\nEncountered %d missing branch(es):\n"),
                              paths->nelts));
   for (i = 0; i < paths->nelts; ++i)
     {

Modified: subversion/branches/ra-git/tools/client-side/svn-vendor.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/client-side/svn-vendor.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/client-side/svn-vendor.py (original)
+++ subversion/branches/ra-git/tools/client-side/svn-vendor.py Tue Oct 11 
09:11:50 2016
@@ -200,7 +200,7 @@ class FSO(object):
     '''
     def __init__(self):
         self.wc_path = None
-        self.state = [ "-", "-" ] # '-': absent, 'F': file, 'D': dir
+        self.state = [ "-", "-" ] # '-': absent, 'F': file, 'D': dir, 'L': 
symlink
 
     def status(self):
         return "[%s%s]" % (self.state[S_WC], self.state[S_IM])
@@ -216,8 +216,8 @@ class FSOCollection(dict):
     Collection of FSOs
     '''
     def print(self):
-        print(" / Status in working copy (-:absent, F:file, D:dir)")
-        print(" |/ Status in imported sources (-:absent, F:file, D:dir)")
+        print(" / Status in working copy (-:absent, F:file, D:dir, L:link)")
+        print(" |/ Status in imported sources (-:absent, F:file, D:dir, 
L:link)")
         for k in sorted(self.keys(), key=filename_sort_key):
             e = self[k]
             print("%s %s%s" % (e.status(), shlex.quote(k),
@@ -310,9 +310,10 @@ class Config(dict):
     def print(self):
         for k in sorted(self):
             o = self[k]
-            print("# %s" % o.helpmsg)
+            for s in o.helpmsg.split('\n'):
+                print("# %s" % s)
             print("%-20s: %s" % (k, str(o)))
-            print()
+            print("")
 
 
 class SvnVndImport(cmd.Cmd):
@@ -330,6 +331,18 @@ class SvnVndImport(cmd.Cmd):
         self.importdir = importdir
         self.svninfo = svninfo
         self.config = Config()
+        self.config.add_option('symlink-handling',
+                ConfigOpt("as-is", "How symbolic links are handled;\n" +
+                    "  'dereference' treats as normal files/dirs (and " +
+                    "ignores dangling links);\n" +
+                    "  'as-is' imports as symlinks"))
+        self.config.add_option('exec-permission',
+                ConfigOpt("preserve", "How 'executable' permission bits " +
+                    "are handled;\n" +
+                    "  'preserve' sets svn:executable property as in " +
+                    "imported sources;\n" +
+                    "  'clear' removes svn:executable on all new files " +
+                    "(but keeps it intact on existing files)."))
         self.config.add_option('save-diff-copied',
                 ConfigOpt(None, "Save 'svn diff' output on the " +
                     "moved/copied files and directories to this " +
@@ -359,12 +372,13 @@ class SvnVndImport(cmd.Cmd):
     def scan(self):
         self.items = FSOCollection()
         self.info(1, "Scanning working copy directory...")
-        self.get_lists(self.wcdir, S_WC)
+        self.get_lists(self.wcdir, S_WC, False)
         self.info(1, "Scanning imported directory...")
-        self.get_lists(self.importdir, S_IM)
+        self.get_lists(self.importdir, S_IM,
+                self.config.get('symlink-handling') == "dereference")
 
-    def get_lists(self, top, where):
-        for d, dn, fn in os.walk(top, followlinks=True):
+    def get_lists(self, top, where, deref):
+        for d, dn, fn in os.walk(top, followlinks=deref):
             dr = os.path.relpath(d, top)
             # If under .svn directory at the top (SVN 1.7+) or has .svn
             # in the path (older SVN), ignore
@@ -374,9 +388,36 @@ class SvnVndImport(cmd.Cmd):
                 continue
             if dr != '.':
                 self.items.add(dr, where, "D")
-            for f in fn:
+            dnn = [] # List where we'll descend
+            for f in fn + dn:
                 fr = os.path.normpath(os.path.join(dr, f))
-                self.items.add(fr, where, "F")
+                frp = os.path.join(d, f)
+                if os.path.islink(frp):
+                    if deref:
+                        # Dereferencing:
+                        # - check for dangling/absolute/out-of-tree symlinks 
and abort
+                        rl = os.readlink(frp)
+                        if not os.path.exists(frp):
+                            self.info(1, "WARN: Ignoring dangling symlink %s 
-> %s" % (fr, rl))
+                            continue
+                        if os.path.isabs(rl):
+                            self.info(1, "WARN: Ignoring absolute symlink %s 
-> %s" % (fr, rl))
+                            continue
+                        tgt = os.path.normpath(os.path.join(dr, rl))
+                        if tgt == ".." or tgt.startswith(".." + os.sep):
+                            self.info(1, "WARN: Ignoring out-of-wc symlink %s 
-> %s" % (fr, rl))
+                            continue
+                    else:
+                        # Importing symlinks as-is, no need to check.
+                        self.items.add(fr, where, "L")
+                        continue
+                # If we get here, treat symlinks to files as regular files, 
and add directories
+                # to the list of traversed subdirs
+                if os.path.isfile(frp):
+                    self.items.add(fr, where, "F")
+                if os.path.isdir(frp):
+                    dnn.append(f)
+            dn[:] = dnn
 
     def onecmd(self, str):
         'Override for checking number of arguments'
@@ -385,7 +426,7 @@ class SvnVndImport(cmd.Cmd):
         except InvalidUsageException as e:
             if e.cmd is not None:
                 print("!!! Invalid usage of `%s' command: %s" % (e.cmd, e))
-                print()
+                print("")
                 self.onecmd("help " + e.cmd)
             else:
                 print("!!! %s" % e)
@@ -403,6 +444,10 @@ class SvnVndImport(cmd.Cmd):
         pos = 0
         atatime = 100
         output = ""
+        # svn treats '@' specially (peg revision); if there's such character 
in a
+        # file name - append an empty peg revision
+        args_fixed = list(map(lambda x: x + "@" if x.find("@") != -1 else x, 
args_fixed))
+        args_split = list(map(lambda x: x + "@" if x.find("@") != -1 else x, 
args_split))
         while pos < len(args_split) or (pos == 0 and len(args_split) == 0):
             svnargs = ['svn'] + args_fixed + args_split[pos : pos + atatime]
             pos += atatime
@@ -558,6 +603,10 @@ class SvnVndImport(cmd.Cmd):
         if xsrc.state[S_WC] != xdst.state[S_IM]:
             # Different kinds - definitely not the same object
             return 0
+        if xsrc.state[S_WC] == "L" or xdst.state[S_IM] == "L":
+            # Symlinks are not considered the same object (same target in
+            # different dirs refers to different objects).
+            return 0
         if xsrc.state[S_WC] == "D":
             return self.similarity_dir(src, dst, threshold, lst_removal)
         else:
@@ -734,8 +783,10 @@ class SvnVndImport(cmd.Cmd):
                  edit and load.
         '''
         self.parse_args(arg, 0, "detect")
+        # Configurable for file/dirs; symlinks are never similar.
         self.detect({ "D": self.config.get('dir-similarity'),
-            "F": self.config.get('file-similarity')})
+            "F": self.config.get('file-similarity'),
+            "L": 1001 })
 
     def do_apply(self, arg):
         '''
@@ -763,7 +814,28 @@ class SvnVndImport(cmd.Cmd):
         dirs_removed = []
         files_added = []
         files_removed = []
+        files_set_exec = []
+        files_clear_exec = []
+
         self.info(2, "  Creating dirs and copying files...")
+        def copyfile_helper(i, nk_wc):
+            '''Helper: copy a file and optionally, transfer permissions.'''
+            f = os.path.join(self.importdir, i)
+            t = os.path.join(self.wcdir, i)
+            shutil.copyfile(f, t)
+            # If exec-permission is 'clear', we don't need to do anything:
+            # shutil.copyfile will create the file as non-executable.
+            if self.config.get('exec-permission') == 'preserve':
+                # If the file is new, just copying the mode is enough:
+                # svn will set the svn:executable upon adding it.
+                if nk_wc == "F":
+                    # Existing file, check what the setting shall be
+                    if os.access(f, os.X_OK) and not os.access(t, os.X_OK):
+                        files_set_exec.append(i)
+                    elif not os.access(f, os.X_OK) and os.access(t, os.X_OK):
+                        files_clear_exec.append(i)
+                shutil.copymode(f, t)
+
         for i in sorted(self.items.keys()):
             e = self.items[i]
             nk_wc = e.state[S_WC]
@@ -778,14 +850,46 @@ class SvnVndImport(cmd.Cmd):
                     flg = "(added dir)"
                 elif nk_im == "F":
                     # New file added
-                    shutil.copyfile(os.path.join(self.importdir, i),
-                            os.path.join(self.wcdir, i))
+                    copyfile_helper(i, nk_wc);
                     files_added.append(i)
                     flg = "(added file)"
+                elif nk_im == "L":
+                    tim = os.readlink(os.path.join(self.importdir, i))
+                    os.symlink(tim, os.path.join(self.wcdir, i))
+                    files_added.append(i)
+                    flg = "(added symlink)"
                 else:
                     # Not in imported sources, not in WC (moved
                     # away/removed) - nothing to do
                     pass
+            elif nk_wc == "L":
+                # Symbolic link in a working copy
+                if nk_im == "L":
+                    # Symbolic link in both. If the same target, do nothing. 
Otherwise,
+                    # replace.
+                    twc = os.readlink(os.path.join(self.wcdir, i))
+                    tim = os.readlink(os.path.join(self.importdir, i))
+                    if tim != twc:
+                        self.run_svn(["rm", "--force", i])
+                        os.symlink(tim, os.path.join(self.wcdir, i))
+                        files_added.append(i)
+                        flg = "(replaced symlink)"
+                elif nk_im == "D":
+                    # Was a symlink, now a directory. Replace.
+                    self.run_svn(["rm", "--force", i])
+                    os.mkdir(os.path.join(self.wcdir, i))
+                    dirs_added.append(i)
+                    flg = "(replaced symlink with dir)"
+                elif nk_im == "F":
+                    # Symlink replaced with file.
+                    self.run_svn(["rm", "--force", i])
+                    copyfile_helper(i, nk_wc);
+                    files_added.append(i)
+                    flg = "(replaced symlink with file)"
+                else:
+                    # Was a symlink, removed
+                    files_removed.append(i)
+                    flg = "(removed symlink)"
             elif nk_wc == "F":
                 # File in a working copy
                 if nk_im == "D":
@@ -796,9 +900,15 @@ class SvnVndImport(cmd.Cmd):
                     flg = "(replaced file with dir)"
                 elif nk_im == "F":
                     # Was a file, is a file - just copy contents
-                    shutil.copyfile(os.path.join(self.importdir, i),
-                            os.path.join(self.wcdir, i))
+                    copyfile_helper(i, nk_wc);
                     flg = "(copied)"
+                elif nk_im == "L":
+                    # Was a file, now a symlink. Replace.
+                    self.run_svn(["rm", "--force", i])
+                    tim = os.readlink(os.path.join(self.importdir, i))
+                    os.symlink(tim, os.path.join(self.wcdir, i))
+                    files_added.append(i)
+                    flg = "(replaced file with symlink)"
                 else:
                     # Was a file, removed
                     files_removed.append(i)
@@ -811,12 +921,21 @@ class SvnVndImport(cmd.Cmd):
                 elif nk_im == "F":
                     # Directory replaced with file. Need to remove dir
                     # immediately, as bulk removals/additions assume new files
-                    # and dirs already in place.
+                    # and dirs already in place. Also, removing a directory
+                    # removes all its descendants - mark them as removed.
                     self.run_svn(["rm", "--force", i])
-                    shutil.copyfile(os.path.join(self.importdir, i),
-                            os.path.join(self.wcdir, i))
+                    self.items.wc_remove(i)
+                    copyfile_helper(i, nk_wc);
                     files_added.append(i)
                     flg = "(replaced dir with file)"
+                elif nk_im == "L":
+                    # Was a directory, now a symlink. Replace.
+                    self.run_svn(["rm", "--force", i])
+                    self.items.wc_remove(i)
+                    tim = os.readlink(os.path.join(self.importdir, i))
+                    os.symlink(tim, os.path.join(self.wcdir, i))
+                    files_added.append(i)
+                    flg = "(replaced dir with symlink)"
                 else:
                     # Directory removed
                     dirs_removed.append(i)
@@ -832,7 +951,7 @@ class SvnVndImport(cmd.Cmd):
             dirs_added, files_added))
         dirs_added = list(filter(lambda x: os.path.dirname(x) not in
             dirs_added, dirs_added))
-        self.info(2, "  Running SVN add/rm commands");
+        self.info(2, "  Running SVN add/rm/propset/propdel commands");
         if len(dirs_added):
             self.run_svn(["add"], dirs_added)
         if len(files_added):
@@ -841,6 +960,10 @@ class SvnVndImport(cmd.Cmd):
             self.run_svn(["rm"], dirs_removed)
         if len(files_removed):
             self.run_svn(["rm"], files_removed)
+        if len(files_set_exec):
+            self.run_svn(["propset", "svn:executable", "*"], files_set_exec)
+        if len(files_clear_exec):
+            self.run_svn(["propdel", "svn:executable"], files_clear_exec)
         # Save the diff for the copied/moved items
         diff_save = self.config.get('save-diff-copied')
         if diff_save is not None:
@@ -918,7 +1041,7 @@ class SvnVndImport(cmd.Cmd):
         colsz = int((self.termwidth - 14) / 2)
         if len(self.prepare_ops):
             print("Currently recorded preparatory operations:")
-            print()
+            print("")
             print("%5s  %s  %-*s  %-*s" %
                     ("#", "Op", colsz, "Source", colsz, "Destination"))
             for id, o in enumerate(self.prepare_ops):
@@ -930,10 +1053,10 @@ class SvnVndImport(cmd.Cmd):
                             (id, o[0], colsz, o[1], colsz, o[2]))
                 else:
                     print("%5d  %s  %-*s" % (id, o[0], colsz, o[1]))
-            print()
+            print("")
         else:
             print("No copies/moves/removals recorded")
-            print()
+            print("")
 
     def do_save(self, arg):
         '''
@@ -1039,7 +1162,7 @@ if __name__ == '__main__':
     if p.returncode != 0:
         print("%s: does not appear to be SVN working copy." % args.wcdir)
         print("`svn info' exited with status %d and returned:" % p.returncode)
-        print()
+        print("")
         print(se.decode())
         sys.exit(1)
     imp = SvnVndImport(args.wcdir, args.importdir, so.decode())

Modified: subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/copy_repo.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/copy_repo.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/copy_repo.py 
(original)
+++ subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/copy_repo.py Tue 
Oct 11 09:11:50 2016
@@ -296,15 +296,15 @@ def copy_repos(src, dst, count, separato
 def show_usage():
   """ Write a simple CL docstring """
 
-  print "Copies and duplicates repositories in a way that mimics larger 
deployments."
-  print
-  print "Usage:"
-  print "copy_repo.py SRC DST COUNT SEPARATOR_SIZE"
-  print
-  print "SRC            Immediate parent folder of all the repositories to 
copy."
-  print "DST            Folder to copy into; current contents will be lost."
-  print "COUNT          Number of copies to create of each source repository."
-  print "SEPARATOR_SIZE Additional spacing, in kBytes, between revisions."
+  print("Copies and duplicates repositories in a way that mimics larger 
deployments.")
+  print("")
+  print("Usage:")
+  print("copy_repo.py SRC DST COUNT SEPARATOR_SIZE")
+  print("")
+  print("SRC            Immediate parent folder of all the repositories to 
copy.")
+  print("DST            Folder to copy into; current contents will be lost.")
+  print("COUNT          Number of copies to create of each source repository.")
+  print("SEPARATOR_SIZE Additional spacing, in kBytes, between revisions.")
 
 #main function
 if len(argv) == 5:

Modified: 
subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/win_repo_bench.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/win_repo_bench.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/win_repo_bench.py 
(original)
+++ subversion/branches/ra-git/tools/dev/benchmarks/RepoPerf/win_repo_bench.py 
Tue Oct 11 09:11:50 2016
@@ -115,7 +115,7 @@ def run_cs_command(state, config, reposi
 
   # Display the operation
   repo_title = repository.replace('nonpacked', 'nopack')
-  print state, "\t", repo_title, "\t", prefix, "\t", config, "\t",
+  sys.stdout.write(state, "\t", repo_title, "\t", prefix, "\t", config, "\t ")
   sys.stdout.flush()
 
   # Execute the command and show the execution times
@@ -189,8 +189,8 @@ def run_test_cs_configurations(command,
       repeatedly with all servers on all repositories. """
 
   print
-  print command
-  print
+  print(command)
+  print("")
 
   for config in configurations:
     set_config(config)
@@ -215,7 +215,7 @@ def run_admin_command(state, config, rep
   else:
     extra = []
 
-  print state, "\t", repository, "\t", config, "\t",
+  sys.stdout.write(state, "\t", repository, "\t", config, "\t ")
   sys.stdout.flush()
   subprocess.call(["TimeWin.exe", exe] + args + extra)
 
@@ -241,9 +241,9 @@ def run_test_admin_configurations(comman
   """ Run svnadmin COMMAND with basic arguments ARGS in all configurations
       repeatedly on all repositories. """
 
-  print
-  print command
-  print
+  print("")
+  print(command)
+  print("")
 
   for config in configurations:
     # These two must be the innermost loops and must be in that order.

Modified: subversion/branches/ra-git/tools/dev/benchmarks/suite1/benchmark.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/benchmarks/suite1/benchmark.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/benchmarks/suite1/benchmark.py 
(original)
+++ subversion/branches/ra-git/tools/dev/benchmarks/suite1/benchmark.py Tue Oct 
11 09:11:50 2016
@@ -164,7 +164,7 @@ j = os.path.join
 
 def bail(msg=None):
   if msg:
-    print msg
+    print(msg)
   exit(1)
 
 def time_str():
@@ -181,7 +181,7 @@ def run_cmd(cmd, stdin=None, shell=False
       printable_cmd = cmd
     else:
       printable_cmd = ' '.join(cmd)
-    print 'CMD:', printable_cmd
+    print('CMD:', printable_cmd)
 
   if stdin:
     stdin_arg = subprocess.PIPE
@@ -197,9 +197,9 @@ def run_cmd(cmd, stdin=None, shell=False
 
   if verbose:
     if (stdout):
-      print "STDOUT: [[[\n%s]]]" % ''.join(stdout)
+      print("STDOUT: [[[\n%s]]]" % ''.join(stdout))
   if (stderr):
-    print "STDERR: [[[\n%s]]]" % ''.join(stderr)
+    print("STDERR: [[[\n%s]]]" % ''.join(stderr))
 
   return stdout, stderr
 
@@ -350,7 +350,7 @@ class TimingsDb:
       # exists
       return
 
-    print 'Creating database tables.'
+    print('Creating database tables.')
     c.executescript('''
         CREATE TABLE batch (
           batch_id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -468,7 +468,7 @@ class Run:
   def submit_timings(self):
     conn = self.batch.db.conn
     c = conn.cursor()
-    print 'submitting...'
+    print('submitting...')
 
     c.executemany("""
       INSERT INTO timings
@@ -629,7 +629,7 @@ def perform_run(batch, run_kind,
     cmd = [ svn_bin ]
     cmd.extend( list(args) )
     if verbose:
-      print 'svn cmd:', ' '.join(cmd)
+      print('svn cmd:', ' '.join(cmd))
 
     stdin = None
     if stdin:
@@ -652,9 +652,9 @@ def perform_run(batch, run_kind,
 
     if verbose:
       if (stdout):
-        print "STDOUT: [[[\n%s]]]" % ''.join(stdout)
+        print("STDOUT: [[[\n%s]]]" % ''.join(stdout))
       if (stderr):
-        print "STDERR: [[[\n%s]]]" % ''.join(stderr)
+        print("STDERR: [[[\n%s]]]" % ''.join(stderr))
 
     return stdout,stderr
 
@@ -792,9 +792,9 @@ def perform_run(batch, run_kind,
     else:
       file_url = 'file:///%s' % repos
 
-    print '\nRunning svn benchmark in', base
-    print 'dir levels: %s; new files and dirs per leaf: %s' %(
-          run_kind.levels, run_kind.spread)
+    print('\nRunning svn benchmark in', base)
+    print('dir levels: %s; new files and dirs per leaf: %s' %(
+          run_kind.levels, run_kind.spread))
 
     started = datetime.datetime.now()
 
@@ -876,7 +876,7 @@ def perform_run(batch, run_kind,
 
     finally:
       stopped = datetime.datetime.now()
-      print '\nDone with svn benchmark in', (stopped - started)
+      print('\nDone with svn benchmark in', (stopped - started))
 
       run.remember_timing(TOTAL_RUN,
                         timedelta_to_seconds(stopped - started))
@@ -896,8 +896,8 @@ def cmdline_run(db, options, run_kind_st
 
   N = int(N)
 
-  print 'Hi, going to run a Subversion benchmark series of %d runs...' % N
-  print 'Label is %s' % run_kind.label()
+  print('Hi, going to run a Subversion benchmark series of %d runs...' % N)
+  print('Label is %s' % run_kind.label())
 
   # can we run the svn binaries?
   svn_bin = j(options.svn_bin_dir, 'svn')
@@ -908,12 +908,12 @@ def cmdline_run(db, options, run_kind_st
     if not so:
       bail("Can't run %s" % b)
 
-    print ', '.join([s.strip() for s in so.split('\n')[:2]])
+    print(', '.join([s.strip() for s in so.split('\n')[:2]]))
 
   batch = Batch(db)
 
   for i in range(N):
-    print 'Run %d of %d' % (i + 1, N)
+    print('Run %d of %d' % (i + 1, N))
     perform_run(batch, run_kind,
                 svn_bin, svnadmin_bin, options.verbose)
 
@@ -934,31 +934,31 @@ def cmdline_list(db, options, *args):
     add_if_not_none('levels', run_kind.levels)
     add_if_not_none('spread', run_kind.spread)
     if constraints:
-      print 'For\n', '\n'.join(constraints)
-    print 'I found:'
+      print('For\n', '\n'.join(constraints))
+    print('I found:')
 
     d = TimingQuery(db, run_kind)
 
     cmd_names = d.get_sorted_command_names()
     if cmd_names:
-      print '\n%d command names:\n ' % len(cmd_names), '\n  '.join(cmd_names)
+      print('\n%d command names:\n ' % len(cmd_names), '\n  '.join(cmd_names))
 
     branches = d.get_sorted_branches()
     if branches and (len(branches) > 1 or branches[0] != run_kind.branch):
-      print '\n%d branches:\n ' % len(branches), '\n  '.join(branches)
+      print('\n%d branches:\n ' % len(branches), '\n  '.join(branches))
 
     revisions = d.get_sorted_revisions()
     if revisions and (len(revisions) > 1 or revisions[0] != run_kind.revision):
-      print '\n%d revisions:\n ' % len(revisions), '\n  '.join(revisions)
+      print('\n%d revisions:\n ' % len(revisions), '\n  '.join(revisions))
 
     levels_spread = d.get_sorted_levels_spread()
     if levels_spread and (
          len(levels_spread) > 1
          or levels_spread[0] != (run_kind.levels, run_kind.spread)):
-      print '\n%d kinds of levels x spread:\n ' % len(levels_spread), '\n  
'.join(
-              [ ('%dx%d' % (l, s)) for l,s in levels_spread ])
+      print('\n%d kinds of levels x spread:\n ' % len(levels_spread), '\n  
'.join(
+              [ ('%dx%d' % (l, s)) for l,s in levels_spread ]))
 
-    print "\n%d runs in %d batches.\n" % (d.count_runs_batches())
+    print("\n%d runs in %d batches.\n" % (d.count_runs_batches()))
 
 
 def cmdline_show(db, options, *run_kind_strings):
@@ -983,7 +983,7 @@ def cmdline_show(db, options, *run_kind_
                  tavg,
                  command_name))
 
-    print '\n'.join(s)
+    print('\n'.join(s))
 
 
 def cmdline_compare(db, options, *args):
@@ -1004,7 +1004,7 @@ def cmdline_compare(db, options, *args):
     rightq = TimingQuery(db, right_kind)
     right = rightq.get_timings()
     if not right:
-      print "No timings for %s" % right_kind.label()
+      print("No timings for %s" % right_kind.label())
       continue
 
     label = 'Compare %s to %s' % (right_kind.label(), left_kind.label())
@@ -1051,7 +1051,7 @@ def cmdline_compare(db, options, *args):
       ])
 
 
-    print '\n'.join(s)
+    print('\n'.join(s))
 
 
 # ------------------------------------------------------- charts
@@ -1073,7 +1073,7 @@ def cmdline_chart_compare(db, options, *
     query = TimingQuery(db, run_kind)
     timings = query.get_timings()
     if not timings:
-      print "No timings for %s" % run_kind.label()
+      print("No timings for %s" % run_kind.label())
       continue
     labels.append(run_kind.label())
     timing_sets.append(timings)
@@ -1215,7 +1215,7 @@ def cmdline_chart_compare(db, options, *
                 va='center', weight='bold')
 
   plt.savefig(chart_path)
-  print 'wrote chart file:', chart_path
+  print('wrote chart file:', chart_path)
 
 
 # ------------------------------------------------------------ main
@@ -1270,8 +1270,8 @@ if __name__ == '__main__':
   def usage(msg=None):
     parser.print_help()
     if msg:
-      print
-      print msg
+      print("")
+      print(msg)
     bail()
 
   # there should be at least one arg left: the sub-command

Modified: subversion/branches/ra-git/tools/dev/build-svn-deps-win.pl
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/build-svn-deps-win.pl?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/build-svn-deps-win.pl (original)
+++ subversion/branches/ra-git/tools/dev/build-svn-deps-win.pl Tue Oct 11 
09:11:50 2016
@@ -177,7 +177,7 @@ sub set_defaults {
   set_default(\$PCRE_URL, 
"ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-$PCRE_VER.zip";);
   set_default(\$BDB_URL, 
"http://download.oracle.com/berkeley-db/db-5.3.21.zip";);
   set_default(\$SQLITE_URL, 
"http://www.sqlite.org/2013/sqlite-amalgamation-$SQLITE_VER.zip";);
-  set_default(\$SERF_URL, 
"http://serf.googlecode.com/svn/src_releases/serf-$SERF_VER.zip";);
+  set_default(\$SERF_URL, 
"https://archive.apache.org/dist/serf/serf-$SERF_VER.zip";);
   set_default(\$NEON_URL, "http://www.webdav.org/neon/neon-$NEON_VER.tar.gz";);
   set_default(\$INSTDIR, $TOPDIR);
   set_default(\$BLDDIR, "$TOPDIR\\build");

Modified: subversion/branches/ra-git/tools/dev/contribulyze.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/contribulyze.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/contribulyze.py (original)
+++ subversion/branches/ra-git/tools/dev/contribulyze.py Tue Oct 11 09:11:50 
2016
@@ -741,7 +741,7 @@ def usage():
 def main():
   try:
     opts, args = my_getopt(sys.argv[1:], 'C:U:hH?', [ 'help' ])
-  except getopt.GetoptError, e:
+  except getopt.GetoptError as e:
     complain(str(e) + '\n\n')
     usage()
     sys.exit(1)

Modified: subversion/branches/ra-git/tools/dev/gen-javahl-errors.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/gen-javahl-errors.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/gen-javahl-errors.py (original)
+++ subversion/branches/ra-git/tools/dev/gen-javahl-errors.py Tue Oct 11 
09:11:50 2016
@@ -27,7 +27,7 @@ import sys, os
 
 try:
   from svn import core
-except ImportError, e:
+except ImportError as e:
   sys.stderr.write("ERROR: Unable to import Subversion's Python bindings: 
'%s'\n" \
                    "Hint: Set your PYTHONPATH environment variable, or adjust 
your " \
                    "PYTHONSTARTUP\nfile to point to your Subversion install " \

Modified: subversion/branches/ra-git/tools/dev/gen-py-errors.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/gen-py-errors.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/gen-py-errors.py (original)
+++ subversion/branches/ra-git/tools/dev/gen-py-errors.py Tue Oct 11 09:11:50 
2016
@@ -52,11 +52,11 @@ RE_DEF_VALUE = re.compile(r'SVN_ERR_([A-
 
 
 def write_output(codes):
-  print HEADER
+  print(HEADER)
 
   for name, value in codes:
     # skip SVN_ERR_ on the name
-    print '%s = %d' % (name[8:], value)
+    print('%s = %d' % (name[8:], value))
 
 
 def main(codes_fname):

Modified: subversion/branches/ra-git/tools/dev/gen_junit_report.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/gen_junit_report.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/gen_junit_report.py (original)
+++ subversion/branches/ra-git/tools/dev/gen_junit_report.py Tue Oct 11 
09:11:50 2016
@@ -178,7 +178,7 @@ def main():
     try:
         opts, args = getopt.getopt(sys.argv[1:], 'l:d:h',
                                   ['log-file=', 'output-dir=', 'help'])
-    except getopt.GetoptError, err:
+    except getopt.GetoptError as err:
         usage(err)
 
     log_file = None
@@ -201,7 +201,7 @@ def main():
         print("Directory '%s' not exists, creating ..." % output_dir)
         try:
             os.makedirs(output_dir)
-        except OSError, err:
+        except OSError as err:
             sys.stderr.write("ERROR: %s\n" % err)
             sys.exit(1)
     patterns = {
@@ -221,7 +221,7 @@ def main():
     fp = None
     try:
         fp = open(log_file, 'r')
-    except IOError, err:
+    except IOError as err:
         sys.stderr.write("ERROR: %s\n" % err)
         sys.exit(1)
 

Modified: subversion/branches/ra-git/tools/dev/graph-dav-servers.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/graph-dav-servers.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/graph-dav-servers.py (original)
+++ subversion/branches/ra-git/tools/dev/graph-dav-servers.py Tue Oct 11 
09:11:50 2016
@@ -181,7 +181,7 @@ def draw_graph(dates, counts):
     im = im.resize((width, height), Image.ANTIALIAS)
     im.save(OUTPUT_FILE, im.format)
     os.unlink(OUTPUT_FILE + ".tmp.png")
-  except Exception, e:
+  except Exception as e:
     sys.stderr.write("Error attempting to resize the graphic: %s\n" % (str(e)))
     os.rename(OUTPUT_FILE + ".tmp.png", OUTPUT_FILE)
     raise

Modified: subversion/branches/ra-git/tools/dev/histogram.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/histogram.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/histogram.py (original)
+++ subversion/branches/ra-git/tools/dev/histogram.py Tue Oct 11 09:11:50 2016
@@ -42,7 +42,7 @@ def histogram(counts, width):
   for author, count in sorted(counts.items(),
                               key=operator.itemgetter(1),  # sort on count
                               reverse=True):
-    print "%-*s | %s" % (max_len, author, "X"*int(count/adjustor))
+    print("%-*s | %s" % (max_len, author, "X"*int(count/adjustor)))
 
 
 if __name__ == '__main__':

Modified: subversion/branches/ra-git/tools/dev/iz/ff2csv.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/iz/ff2csv.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/iz/ff2csv.py (original)
+++ subversion/branches/ra-git/tools/dev/iz/ff2csv.py Tue Oct 11 09:11:50 2016
@@ -66,7 +66,7 @@ manager-speak pictures."""
 
     try:
         opts, args = my_getopt(sys.argv[1:], "", [x[0] for x in long_opts])
-    except getopt.GetoptError, e:
+    except getopt.GetoptError as e:
         print("Error: %s" % e.msg)
         shortusage()
         print(me + " --help for options.")

Modified: subversion/branches/ra-git/tools/dev/iz/find-fix.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/iz/find-fix.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/iz/find-fix.py (original)
+++ subversion/branches/ra-git/tools/dev/iz/find-fix.py Tue Oct 11 09:11:50 2016
@@ -127,7 +127,7 @@ def main():
 
   try:
       opts, args = my_getopt(sys.argv[1:], "", [x[0] for x in long_opts])
-  except getopt.GetoptError, e:
+  except getopt.GetoptError as e:
       sys.stderr.write("Error: %s\n" % e.msg)
       shortusage()
       sys.stderr.write("%s --help for options.\n" % me)

Modified: subversion/branches/ra-git/tools/dev/merge-graph.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/merge-graph.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/merge-graph.py (original)
+++ subversion/branches/ra-git/tools/dev/merge-graph.py Tue Oct 11 09:11:50 2016
@@ -35,8 +35,8 @@ if __name__ == '__main__':
 
   prog_name = sys.argv[0]
   if not args:
-    usage = '%s: usage: "%s %s"' % (prog_name, prog_name, args_message)
-    print >> sys.stderr, usage
+    usage = '%s: usage: "%s %s"\n' % (prog_name, prog_name, args_message)
+    sys.stderr.write(usage)
     sys.exit(1)
 
   formats = []
@@ -49,10 +49,10 @@ if __name__ == '__main__':
     formats.append('png')
 
   for config_filename in args:
-    print "%s: reading '%s'," % (prog_name, config_filename),
+    sys.stdout.write("%s: reading '%s', " % (prog_name, config_filename))
     graph = MergeDot(config_filename, rankdir='LR', dpi='72')
     for format in formats:
       filename = '%s.%s' % (graph.basename, format)
-      print "writing '%s'" % filename,
+      sys.stdout.write("writing '%s' " % filename)
       graph.save(format=format, filename=filename)
     print

Modified: subversion/branches/ra-git/tools/dev/mergegraph/mergegraph.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/mergegraph/mergegraph.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/mergegraph/mergegraph.py (original)
+++ subversion/branches/ra-git/tools/dev/mergegraph/mergegraph.py Tue Oct 11 
09:11:50 2016
@@ -242,7 +242,7 @@ class MergeDot(MergeGraph, pydot.Dot):
                                              'annotations': '[]' })
     files_read = config.read(config_filename)
     if len(files_read) == 0:
-      print >> sys.stderr, 'graph: unable to read graph config from "' + 
config_filename + '"'
+      sys.stderr.write('graph: unable to read graph config from "' + 
config_filename + '"\n')
       sys.exit(1)
     graph.basename = config.get('graph', 'basename')
     graph.title = config.get('graph', 'title')

Modified: subversion/branches/ra-git/tools/dev/mergegraph/save_as_sh.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/mergegraph/save_as_sh.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/mergegraph/save_as_sh.py (original)
+++ subversion/branches/ra-git/tools/dev/mergegraph/save_as_sh.py Tue Oct 11 
09:11:50 2016
@@ -26,13 +26,13 @@
 
 
 def shebang_line(out):
-  print >> out, '#!/bin/sh'
+  out.write('#!/bin/sh\n')
 
 def command(out, cmd, *args):
   """Write the shell command CMD with the arguments ARGS to the file-like
      object OUT.
   """
-  print >> out, ' '.join((cmd,) + args)
+  out.write(' '.join((cmd,) + args) + "\n")
 
 def svn(out, subcmd, *args):
   """Write an svn command with the given subcommand and arguments.  Write
@@ -43,7 +43,7 @@ def svn(out, subcmd, *args):
 def comment(out, text):
   """Write the comment TEXT to the file-like object OUT.
   """
-  print >> out, '#', text
+  out.write('# %s\n' % text)
 
 def node_branch(node_name):
   """Extract branch name from a node name.

Modified: subversion/branches/ra-git/tools/dev/sbox-ospath.py
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/sbox-ospath.py?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/sbox-ospath.py (original)
+++ subversion/branches/ra-git/tools/dev/sbox-ospath.py Tue Oct 11 09:11:50 2016
@@ -54,10 +54,10 @@ def rewrite_file(fname):
       lines[i] = line[:start] + 'sbox.ospath(' + parts + ')' + line[end:]
       count += 1
   if count == 0:
-    print 'No changes.'
+    print('No changes.')
   else:
     open(fname, 'w').writelines(lines)
-    print '%s rewrites performed.' % (count,)
+    print('%s rewrites performed.' % (count,))
 
 
 if __name__ == '__main__':

Propchange: subversion/branches/ra-git/tools/dev/svnmover/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Oct 11 09:11:50 2016
@@ -0,0 +1 @@
+svnmover

Modified: subversion/branches/ra-git/tools/dev/svnmover/linenoise/linenoise.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/svnmover/linenoise/linenoise.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/svnmover/linenoise/linenoise.c 
(original)
+++ subversion/branches/ra-git/tools/dev/svnmover/linenoise/linenoise.c Tue Oct 
11 09:11:50 2016
@@ -103,6 +103,14 @@
  *
  */
 
+/* Tell the compiler to be quiet about implicit conversions from
+   [s]size_t to int. */
+#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2)
+#  if defined(__APPLE_CC__) || defined(__clang__)
+#    pragma GCC diagnostic ignored "-Wshorten-64-to-32"
+#  endif
+#endif
+
 #include <termios.h>
 #include <unistd.h>
 #include <stdlib.h>

Modified: subversion/branches/ra-git/tools/dev/svnmover/merge3.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/ra-git/tools/dev/svnmover/merge3.c?rev=1764214&r1=1764213&r2=1764214&view=diff
==============================================================================
--- subversion/branches/ra-git/tools/dev/svnmover/merge3.c (original)
+++ subversion/branches/ra-git/tools/dev/svnmover/merge3.c Tue Oct 11 09:11:50 
2016
@@ -899,8 +899,9 @@ merge_subbranch(svn_branch__txn_t *edit_
                                          scratch_pool);
       svn_branch__state_t *edit_subbranch;
 
-      SVN_ERR(svn_branch__txn_branch(edit_txn, &edit_subbranch, from,
-                                     new_branch_id, scratch_pool, 
scratch_pool));
+      SVN_ERR(svn_branch__txn_open_branch(edit_txn, &edit_subbranch,
+                                          new_branch_id, from->eid, from,
+                                          scratch_pool, scratch_pool));
 
       /* subbranch possibly changed in source => merge */
       SVN_ERR(branch_merge_subtree_r(edit_txn, edit_subbranch,
@@ -933,8 +934,9 @@ merge_subbranch(svn_branch__txn_t *edit_
                                          svn_branch__root_eid(src_subbranch),
                                          scratch_pool);
 
-      SVN_ERR(svn_branch__txn_branch(edit_txn, NULL /*new_branch_p*/, from,
-                                     new_branch_id, scratch_pool, 
scratch_pool));
+      SVN_ERR(svn_branch__txn_open_branch(edit_txn, NULL /*new_branch_p*/,
+                                          new_branch_id, from->eid, from,
+                                          scratch_pool, scratch_pool));
     }
   else if (subbr_tgt)  /* added on target branch */
     {
@@ -948,8 +950,9 @@ merge_subbranch(svn_branch__txn_t *edit_
                                          svn_branch__root_eid(tgt_subbranch),
                                          scratch_pool);
 
-      SVN_ERR(svn_branch__txn_branch(edit_txn, NULL /*new_branch_p*/, from,
-                                     new_branch_id, scratch_pool, 
scratch_pool));
+      SVN_ERR(svn_branch__txn_open_branch(edit_txn, NULL /*new_branch_p*/,
+                                          new_branch_id, from->eid, from,
+                                          scratch_pool, scratch_pool));
     }
   else if (subbr_yca)  /* double delete */
     {



Reply via email to