You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by tr...@apache.org on 2018/12/27 03:42:52 UTC

svn commit: r1849784 [2/2] - in /subversion/branches/swig-py3: build/ac-macros/ subversion/bindings/swig/ subversion/bindings/swig/include/ subversion/bindings/swig/python/libsvn_swig_py/ subversion/bindings/swig/python/svn/ subversion/bindings/swig/py...

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/mergeinfo.py Thu Dec 27 03:42:52 2018
@@ -42,11 +42,11 @@ class SubversionMergeinfoTestCase(unitte
   """Test cases for mergeinfo"""
 
   # Some textual mergeinfo.
-  TEXT_MERGEINFO1 = "/trunk:3-9,27,42*"
-  TEXT_MERGEINFO2 = "/trunk:27-29,41-43*"
+  TEXT_MERGEINFO1 = b"/trunk:3-9,27,42*"
+  TEXT_MERGEINFO2 = b"/trunk:27-29,41-43*"
 
   # Meta data used in conjunction with this mergeinfo.
-  MERGEINFO_SRC = "/trunk"
+  MERGEINFO_SRC = b"/trunk"
   MERGEINFO_NBR_REV_RANGES = 3
 
   def setUp(self):
@@ -113,15 +113,15 @@ class SubversionMergeinfoTestCase(unitte
                                 self.MERGEINFO_NBR_REV_RANGES)
 
   def test_mergeinfo_get(self):
-    mergeinfo = repos.fs_get_mergeinfo(self.repos, ['/trunk'], self.rev,
+    mergeinfo = repos.fs_get_mergeinfo(self.repos, [b'/trunk'], self.rev,
                                        core.svn_mergeinfo_inherited,
                                        False, None, None)
     expected_mergeinfo = \
-      { '/trunk' :
-          { '/branches/a' : [RevRange(2, 11)],
-            '/branches/b' : [RevRange(9, 13)],
-            '/branches/c' : [RevRange(2, 16)],
-            '/trunk'      : [RevRange(1, 9)],  },
+      { b'/trunk' :
+          { b'/branches/a' : [RevRange(2, 11)],
+            b'/branches/b' : [RevRange(9, 13)],
+            b'/branches/c' : [RevRange(2, 16)],
+            b'/trunk'      : [RevRange(1, 9)],  },
       }
     self.compare_mergeinfo_catalogs(mergeinfo, expected_mergeinfo)
 

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py Thu Dec 27 03:42:52 2018
@@ -53,16 +53,16 @@ class SubversionRepositoryAccessTestCase
   def test_get_file(self):
     # Test getting the properties of a file
     fs_revnum = fs.youngest_rev(self.fs)
-    rev, properties = ra.get_file(self.ra_ctx, "trunk/README2.txt",
+    rev, properties = ra.get_file(self.ra_ctx, b"trunk/README2.txt",
                                   core.SVN_INVALID_REVNUM, None)
     self.assertEqual(rev, fs_revnum)
-    self.assertEqual(properties["svn:mime-type"], "text/plain")
+    self.assertEqual(properties[b"svn:mime-type"], b"text/plain")
 
     # Test getting the contents of a file
     filestream = BytesIO()
-    rev, properties = ra.get_file(self.ra_ctx, "trunk/README2.txt",
+    rev, properties = ra.get_file(self.ra_ctx, b"trunk/README2.txt",
                                   fs_revnum, filestream)
-    self.assertEqual("A test.\n", filestream.getvalue().decode('UTF-8'))
+    self.assertEqual(b"A test.\n", filestream.getvalue())
 
   def test_get_repos_root(self):
     root = ra.get_repos_root(self.ra_ctx)
@@ -79,53 +79,53 @@ class SubversionRepositoryAccessTestCase
     self.assertEqual(ra_revnum, fs_revnum)
 
   def test_get_dir2(self):
-    (dirents, _, props) = ra.get_dir2(self.ra_ctx, '', 1, core.SVN_DIRENT_KIND)
-    self.assertTrue('trunk' in dirents)
-    self.assertTrue('branches' in dirents)
-    self.assertTrue('tags' in dirents)
-    self.assertEqual(dirents['trunk'].kind, core.svn_node_dir)
-    self.assertEqual(dirents['branches'].kind, core.svn_node_dir)
-    self.assertEqual(dirents['tags'].kind, core.svn_node_dir)
+    (dirents, _, props) = ra.get_dir2(self.ra_ctx, b'', 1, core.SVN_DIRENT_KIND)
+    self.assertTrue(b'trunk' in dirents)
+    self.assertTrue(b'branches' in dirents)
+    self.assertTrue(b'tags' in dirents)
+    self.assertEqual(dirents[b'trunk'].kind, core.svn_node_dir)
+    self.assertEqual(dirents[b'branches'].kind, core.svn_node_dir)
+    self.assertEqual(dirents[b'tags'].kind, core.svn_node_dir)
     self.assertTrue(core.SVN_PROP_ENTRY_UUID in props)
     self.assertTrue(core.SVN_PROP_ENTRY_LAST_AUTHOR in props)
 
-    (dirents, _, _) = ra.get_dir2(self.ra_ctx, 'trunk', 1, core.SVN_DIRENT_KIND)
+    (dirents, _, _) = ra.get_dir2(self.ra_ctx, b'trunk', 1, core.SVN_DIRENT_KIND)
 
     self.assertEqual(dirents, {})
 
-    (dirents, _, _) = ra.get_dir2(self.ra_ctx, 'trunk', 10,
+    (dirents, _, _) = ra.get_dir2(self.ra_ctx, b'trunk', 10,
                                   core.SVN_DIRENT_KIND)
 
-    self.assertTrue('README2.txt' in dirents)
-    self.assertEqual(dirents['README2.txt'].kind, core.svn_node_file)
+    self.assertTrue(b'README2.txt' in dirents)
+    self.assertEqual(dirents[b'README2.txt'].kind, core.svn_node_file)
 
   def test_commit3(self):
     commit_info = []
     def my_callback(info, pool):
       commit_info.append(info)
 
-    revprops = {"svn:log": "foobar", "testprop": ""}
+    revprops = {b"svn:log": b"foobar", b"testprop": b""}
     editor, edit_baton = ra.get_commit_editor3(self.ra_ctx, revprops, my_callback, None, False)
     root = editor.open_root(edit_baton, 4)
     self.assertNotEqual(root, None)
-    child = editor.add_directory("bla3", root, None, 0)
+    child = editor.add_directory(b"bla3", root, None, 0)
     self.assertNotEqual(child, None)
     editor.close_edit(edit_baton)
 
     info = commit_info[0]
     self.assertEqual(info.revision, fs.youngest_rev(self.fs))
-    revprops['svn:author'] = info.author
-    revprops['svn:date'] = info.date
+    revprops[b'svn:author'] = info.author
+    revprops[b'svn:date'] = info.date
     self.assertEqual(ra.rev_proplist(self.ra_ctx, info.revision), revprops)
 
   def test_commit2(self):
     def my_callback(info, pool):
         self.assertEqual(info.revision, fs.youngest_rev(self.fs))
 
-    editor, edit_baton = ra.get_commit_editor2(self.ra_ctx, "foobar", my_callback, None, False)
+    editor, edit_baton = ra.get_commit_editor2(self.ra_ctx, b"foobar", my_callback, None, False)
     root = editor.open_root(edit_baton, 4)
     self.assertNotEqual(root, None)
-    child = editor.add_directory("bla", root, None, 0)
+    child = editor.add_directory(b"bla", root, None, 0)
     self.assertNotEqual(child, None)
     editor.close_edit(edit_baton)
 
@@ -133,18 +133,18 @@ class SubversionRepositoryAccessTestCase
     def my_callback(revision, date, author):
         self.assertEqual(revision, fs.youngest_rev(self.fs))
 
-    editor, edit_baton = ra.get_commit_editor(self.ra_ctx, "foobar", my_callback, None, False)
+    editor, edit_baton = ra.get_commit_editor(self.ra_ctx, b"foobar", my_callback, None, False)
     root = editor.open_root(edit_baton, 4)
-    child = editor.add_directory("blah", root, None, 0)
+    child = editor.add_directory(b"blah", root, None, 0)
     editor.close_edit(edit_baton)
 
   def test_delta_driver_commit(self):
     # Setup paths we'll commit in this test.
-    to_delete = ['trunk/README.txt', 'trunk/dir1/dir2']
-    to_mkdir = ['test_delta_driver_commit.d', 'test_delta_driver_commit2.d']
-    to_add = ['test_delta_driver_commit', 'test_delta_driver_commit2']
-    to_dir_prop = ['trunk/dir1/dir3', 'test_delta_driver_commit2.d']
-    to_file_prop = ['trunk/README2.txt', 'test_delta_driver_commit2']
+    to_delete = [b'trunk/README.txt', b'trunk/dir1/dir2']
+    to_mkdir = [b'test_delta_driver_commit.d', b'test_delta_driver_commit2.d']
+    to_add = [b'test_delta_driver_commit', b'test_delta_driver_commit2']
+    to_dir_prop = [b'trunk/dir1/dir3', b'test_delta_driver_commit2.d']
+    to_file_prop = [b'trunk/README2.txt', b'test_delta_driver_commit2']
     all_paths = {}
     for i in to_delete + to_mkdir + to_add + to_dir_prop + to_file_prop:
       all_paths[i] = True
@@ -154,7 +154,7 @@ class SubversionRepositoryAccessTestCase
     commit_info = []
     def commit_cb(info, pool):
       commit_info.append(info)
-    revprops = {"svn:log": "foobar", "testprop": ""}
+    revprops = {b"svn:log": b"foobar", b"testprop": b""}
     (editor, edit_baton) = ra.get_commit_editor3(self.ra_ctx, revprops,
                                                  commit_cb, None, False)
     try:
@@ -177,12 +177,12 @@ class SubversionRepositoryAccessTestCase
           if dir_baton is None:
             dir_baton = editor.open_directory(path, parent, revision, pool)
           editor.change_dir_prop(dir_baton,
-                                 'test_delta_driver_commit', 'foo', pool)
+                                 b'test_delta_driver_commit', b'foo', pool)
         elif path in to_file_prop:
           if file_baton is None:
             file_baton = editor.open_file(path, parent, revision, pool)
           editor.change_file_prop(file_baton,
-                                  'test_delta_driver_commit', 'foo', pool)
+                                  b'test_delta_driver_commit', b'foo', pool)
         if file_baton is not None:
           editor.close_file(file_baton, None, pool)
         return dir_baton
@@ -199,8 +199,8 @@ class SubversionRepositoryAccessTestCase
     info = commit_info[0]
 
     if info.author is not None:
-      revprops['svn:author'] = info.author
-    revprops['svn:date'] = info.date
+      revprops[b'svn:author'] = info.author
+    revprops[b'svn:date'] = info.date
     self.assertEqual(ra.rev_proplist(self.ra_ctx, info.revision), revprops)
 
     receiver_called = [False]
@@ -209,17 +209,17 @@ class SubversionRepositoryAccessTestCase
       self.assertEqual(revision, info.revision)
       self.assertEqual(author, info.author)
       self.assertEqual(date, info.date)
-      self.assertEqual(message, revprops['svn:log'])
+      self.assertEqual(message, revprops[b'svn:log'])
       for (path, change) in core._as_list(changed_paths.items()):
-        path = path.lstrip('/')
+        path = path.lstrip(b'/')
         self.assertTrue(path in all_paths)
         if path in to_delete:
-          self.assertEqual(change.action, 'D')
+          self.assertEqual(change.action, b'D')
         elif path in to_mkdir or path in to_add:
-          self.assertEqual(change.action, 'A')
+          self.assertEqual(change.action, b'A')
         elif path in to_dir_prop or path in to_file_prop:
-          self.assertEqual(change.action, 'M')
-    ra.get_log(self.ra_ctx, [''], info.revision, info.revision,
+          self.assertEqual(change.action, b'M')
+    ra.get_log(self.ra_ctx, [b''], info.revision, info.revision,
                0,                       # limit
                True,                    # discover_changed_paths
                True,                    # strict_node_history
@@ -246,26 +246,26 @@ class SubversionRepositoryAccessTestCase
 
     sess_url = ra.get_session_url(self.ra_ctx)
     try:
-        ra.reparent(self.ra_ctx, self.repos_uri+"/trunk")
+        ra.reparent(self.ra_ctx, self.repos_uri+b"/trunk")
         reporter, reporter_baton = ra.do_diff2(self.ra_ctx, fs_revnum,
-                                               "README.txt", 0, 0, 1,
+                                               b"README.txt", 0, 0, 1,
                                                self.repos_uri
-                                                 +"/trunk/README.txt",
+                                                 +b"/trunk/README.txt",
                                                e_ptr, e_baton)
-        reporter.set_path(reporter_baton, "", 0, True, None)
+        reporter.set_path(reporter_baton, b"", 0, True, None)
         reporter.finish_report(reporter_baton)
     finally:
         ra.reparent(self.ra_ctx, sess_url)
 
-    self.assertEqual("A test.\n", editor.textdeltas[0].new_data)
+    self.assertEqual(b"A test.\n", editor.textdeltas[0].new_data)
     self.assertEqual(1, len(editor.textdeltas))
 
   def test_get_locations(self):
-    locations = ra.get_locations(self.ra_ctx, "trunk/README.txt", 2, list(range(1, 5)))
+    locations = ra.get_locations(self.ra_ctx, b"trunk/README.txt", 2, list(range(1, 5)))
     self.assertEqual(locations, {
-        2: '/trunk/README.txt',
-        3: '/trunk/README.txt',
-        4: '/trunk/README.txt'})
+        2: b'/trunk/README.txt',
+        3: b'/trunk/README.txt',
+        4: b'/trunk/README.txt'})
 
   def test_has_capability(self):
       self.assertEqual(True, ra.has_capability(self.ra_ctx,
@@ -274,23 +274,23 @@ class SubversionRepositoryAccessTestCase
   def test_get_file_revs(self):
     def rev_handler(path, rev, rev_props, prop_diffs, pool):
         self.assertTrue(rev == 2 or rev == 3)
-        self.assertEqual(path, "/trunk/README.txt")
+        self.assertEqual(path, b"/trunk/README.txt")
         if rev == 2:
             self.assertEqual(rev_props, {
-              'svn:log': 'Added README.',
-              'svn:author': 'john',
-              'svn:date': '2005-04-01T13:12:18.216267Z'
+              b'svn:log': b'Added README.',
+              b'svn:author': b'john',
+              b'svn:date': b'2005-04-01T13:12:18.216267Z'
             })
             self.assertEqual(prop_diffs, {})
         elif rev == 3:
             self.assertEqual(rev_props, {
-              'svn:log': 'Fixed README.\n',
-              'svn:author': 'kate',
-              'svn:date': '2005-04-01T13:24:58.234643Z'
+              b'svn:log': b'Fixed README.\n',
+              b'svn:author': b'kate',
+              b'svn:date': b'2005-04-01T13:24:58.234643Z'
             })
-            self.assertEqual(prop_diffs, {'svn:mime-type': 'text/plain', 'svn:eol-style': 'native'})
+            self.assertEqual(prop_diffs, {b'svn:mime-type': b'text/plain', b'svn:eol-style': b'native'})
 
-    ra.get_file_revs(self.ra_ctx, "trunk/README.txt", 0, 10, rev_handler)
+    ra.get_file_revs(self.ra_ctx, b"trunk/README.txt", 0, 10, rev_handler)
 
   def test_lock(self):
 
@@ -299,9 +299,9 @@ class SubversionRepositoryAccessTestCase
     self.errors = 0
     def callback(path, do_lock, lock, ra_err, pool):
       self.calls += 1
-      self.assertEqual(path, "trunk/README2.txt")
+      self.assertEqual(path, b"trunk/README2.txt")
       if lock:
-        self.assertEqual(lock.owner, "jrandom")
+        self.assertEqual(lock.owner, b"jrandom")
         self.locks += 1
       if ra_err:
         self.assertTrue(ra_err.apr_err == core.SVN_ERR_FS_PATH_ALREADY_LOCKED
@@ -312,31 +312,31 @@ class SubversionRepositoryAccessTestCase
     self.callbacks.auth_baton = core.svn_auth_open(providers)
     core.svn_auth_set_parameter(self.callbacks.auth_baton,
                                 core.SVN_AUTH_PARAM_DEFAULT_USERNAME,
-                                "jrandom")
+                                b"jrandom")
     self.ra_ctx = ra.open2(self.repos_uri, self.callbacks, {})
     rev = fs.youngest_rev(self.fs)
-    ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+    ra.lock(self.ra_ctx, {b"trunk/README2.txt":rev}, b"sleutel", False, callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 1)
     self.assertEqual(self.errors, 0)
 
     self.calls = 0
     self.locks = 0
-    ra.lock(self.ra_ctx, {"trunk/README2.txt":rev}, "sleutel", False, callback)
+    ra.lock(self.ra_ctx, {b"trunk/README2.txt":rev}, b"sleutel", False, callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 0)
     self.assertEqual(self.errors, 1)
 
     self.calls = 0
     self.errors = 0
-    the_lock = fs.get_lock(self.fs, "/trunk/README2.txt")
-    ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, callback)
+    the_lock = fs.get_lock(self.fs, b"/trunk/README2.txt")
+    ra.unlock(self.ra_ctx, {b"trunk/README2.txt":the_lock.token}, False, callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 0)
     self.assertEqual(self.errors, 0)
 
     self.calls = 0
-    ra.unlock(self.ra_ctx, {"trunk/README2.txt":the_lock.token}, False, callback)
+    ra.unlock(self.ra_ctx, {b"trunk/README2.txt":the_lock.token}, False, callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 0)
     self.assertEqual(self.errors, 1)
@@ -346,16 +346,16 @@ class SubversionRepositoryAccessTestCase
     self.test_commit3()
     rev = fs.youngest_rev(self.fs)
     revprops = ra.rev_proplist(self.ra_ctx, rev)
-    self.assertTrue("svn:log" in revprops)
-    self.assertTrue("testprop" in revprops)
+    self.assertTrue(b"svn:log" in revprops)
+    self.assertTrue(b"testprop" in revprops)
 
     def receiver(log_entry, pool):
       called[0] = True
       self.assertEqual(log_entry.revision, rev)
       if discover_changed_paths:
-        self.assertEqual(core._as_list(log_entry.changed_paths.keys()), ['/bla3'])
-        changed_path = log_entry.changed_paths['/bla3']
-        self.assertTrue(changed_path.action in ['A', 'D', 'R', 'M'])
+        self.assertEqual(core._as_list(log_entry.changed_paths.keys()), [b'/bla3'])
+        changed_path = log_entry.changed_paths[b'/bla3']
+        self.assertTrue(changed_path.action in [b'A', b'D', b'R', b'M'])
         self.assertEqual(changed_path.copyfrom_path, None)
         self.assertEqual(changed_path.copyfrom_rev, -1)
       else:
@@ -376,9 +376,9 @@ class SubversionRepositoryAccessTestCase
 
     for log_revprops in (
       # Retrieve the standard three.
-      ["svn:author", "svn:date", "svn:log"],
+      [b"svn:author", b"svn:date", b"svn:log"],
       # Retrieve just testprop.
-      ["testprop"],
+      [b"testprop"],
       # Retrieve all.
       None,
       # Retrieve none.
@@ -386,7 +386,7 @@ class SubversionRepositoryAccessTestCase
       ):
       for discover_changed_paths in [True, False]:
         called = [False]
-        ra.get_log2(self.ra_ctx, [""],
+        ra.get_log2(self.ra_ctx, [b""],
                     rev, rev,   # start, end
                     1,          # limit
                     discover_changed_paths,
@@ -403,22 +403,22 @@ class SubversionRepositoryAccessTestCase
 
     e_ptr, e_baton = delta.make_editor(editor)
 
-    reporter, reporter_baton = ra.do_update(self.ra_ctx, 10, "", True, e_ptr, e_baton)
+    reporter, reporter_baton = ra.do_update(self.ra_ctx, 10, b"", True, e_ptr, e_baton)
 
-    reporter.set_path(reporter_baton, "", 0, True, None)
+    reporter.set_path(reporter_baton, b"", 0, True, None)
 
     reporter.finish_report(reporter_baton)
 
   def test_namestring(self):
     # Only ra-{svn,serf} support this right now.
     uri = self.repos_uri
-    if uri.startswith('http') or uri.startswith('svn'):
+    if uri.startswith(b'http') or uri.startswith(b'svn'):
       called = [False]
       def cb(pool):
         called[0] = True
-        return 'namestring_test'
+        return b'namestring_test'
       self.callbacks.get_client_string = cb
-      ra.stat(self.ra_ctx, "", 1)
+      ra.stat(self.ra_ctx, b"", 1)
       self.assertTrue(called[0])
 
 def suite():

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py Thu Dec 27 03:42:52 2018
@@ -44,34 +44,34 @@ class DumpStreamParser(repos.ParseFns3):
     repos.ParseFns3.__init__(self)
     self.ops = []
   def magic_header_record(self, version, pool=None):
-    self.ops.append(("magic-header", version))
+    self.ops.append((b"magic-header", version))
   def uuid_record(self, uuid, pool=None):
-    self.ops.append(("uuid", uuid))
+    self.ops.append((b"uuid", uuid))
   def new_revision_record(self, headers, pool=None):
     rev = int(headers[repos.DUMPFILE_REVISION_NUMBER])
-    self.ops.append(("new-revision", rev))
+    self.ops.append((b"new-revision", rev))
     return rev
   def close_revision(self, revision_baton):
-    self.ops.append(("close-revision", revision_baton))
+    self.ops.append((b"close-revision", revision_baton))
   def new_node_record(self, headers, revision_baton, pool=None):
     node = headers[repos.DUMPFILE_NODE_PATH]
-    self.ops.append(("new-node", revision_baton, node))
+    self.ops.append((b"new-node", revision_baton, node))
     return (revision_baton, node)
   def close_node(self, node_baton):
-    self.ops.append(("close-node", node_baton[0], node_baton[1]))
+    self.ops.append((b"close-node", node_baton[0], node_baton[1]))
   def set_revision_property(self, revision_baton, name, value):
-    self.ops.append(("set-revision-prop", revision_baton, name, value))
+    self.ops.append((b"set-revision-prop", revision_baton, name, value))
   def set_node_property(self, node_baton, name, value):
-    self.ops.append(("set-node-prop", node_baton[0], node_baton[1], name, value))
+    self.ops.append((b"set-node-prop", node_baton[0], node_baton[1], name, value))
   def remove_node_props(self, node_baton):
-    self.ops.append(("remove-node-props", node_baton[0], node_baton[1]))
+    self.ops.append((b"remove-node-props", node_baton[0], node_baton[1]))
   def delete_node_property(self, node_baton, name):
-    self.ops.append(("delete-node-prop", node_baton[0], node_baton[1], name))
+    self.ops.append((b"delete-node-prop", node_baton[0], node_baton[1], name))
   def apply_textdelta(self, node_baton):
-    self.ops.append(("apply-textdelta", node_baton[0], node_baton[1]))
+    self.ops.append((b"apply-textdelta", node_baton[0], node_baton[1]))
     return None
   def set_fulltext(self, node_baton):
-    self.ops.append(("set-fulltext", node_baton[0], node_baton[1]))
+    self.ops.append((b"set-fulltext", node_baton[0], node_baton[1]))
     return None
 
 
@@ -104,17 +104,17 @@ class SubversionRepositoryTestCase(unitt
       raise core.SubversionException(apr_err=core.SVN_ERR_CEASE_INVOCATION,
                                      message="Hi from history_lookup")
 
-    repos.history2(self.fs, '/trunk/README2.txt', history_lookup, None, 0,
+    repos.history2(self.fs, b'/trunk/README2.txt', history_lookup, None, 0,
                    self.rev, True)
     self.assertEqual(len(revs), 1)
 
   def test_create(self):
     """Make sure that repos.create doesn't segfault when we set fs-type
        using a config hash"""
-    fs_config = { "fs-type": "fsfs" }
+    fs_config = { b"fs-type": b"fsfs" }
     for i in range(5):
       path = self.temper.alloc_empty_dir(suffix='-repository-create%d' % i)
-      repos.create(path, "", "", None, fs_config)
+      repos.create(path, b"", b"", None, fs_config)
 
   def test_dump_fs2(self):
     """Test the dump_fs2 function"""
@@ -131,10 +131,10 @@ class SubversionRepositoryTestCase(unitt
                    is_cancelled)
 
     # Check that we can dump stuff
-    dump = dumpstream.getvalue().decode("UTF-8")
-    feedback = feedbackstream.getvalue().decode("UTF-8")
-    expected_feedback = "* Dumped revision " + str(self.rev)
-    self.assertEqual(dump.count("Node-path: trunk/README.txt"), 2)
+    dump = dumpstream.getvalue()
+    feedback = feedbackstream.getvalue()
+    expected_feedback = b"* Dumped revision " + str(self.rev).encode('utf-8')
+    self.assertEqual(dump.count(b"Node-path: trunk/README.txt"), 2)
     self.assertEqual(feedback.count(expected_feedback), 1)
     self.assertEqual(self.callback_calls, 13)
 
@@ -154,13 +154,13 @@ class SubversionRepositoryTestCase(unitt
 
     # Check that we can grab the feedback stream, but not the dumpstream
     repos.dump_fs2(self.repos, None, feedbackstream, 0, self.rev, 0, 0, None)
-    feedback = feedbackstream.getvalue().decode('UTF-8')
+    feedback = feedbackstream.getvalue()
     self.assertEqual(feedback.count(expected_feedback), 1)
 
     # Check that we can grab the dumpstream, but not the feedbackstream
     repos.dump_fs2(self.repos, dumpstream, None, 0, self.rev, 0, 0, None)
-    dump = dumpstream.getvalue().decode('UTF-8')
-    self.assertEqual(dump.count("Node-path: trunk/README.txt"), 2)
+    dump = dumpstream.getvalue()
+    self.assertEqual(dump.count(b"Node-path: trunk/README.txt"), 2)
 
     # Check that we can ignore both the dumpstream and the feedbackstream
     repos.dump_fs2(self.repos, dumpstream, None, 0, self.rev, 0, 0, None)
@@ -184,43 +184,43 @@ class SubversionRepositoryTestCase(unitt
     stream.close()
     self.assertEqual(self.cancel_calls, 76)
     expected_list = [
-        ("magic-header", 2),
-        ('uuid', '92ea810a-adf3-0310-b540-bef912dcf5ba'),
-        ('new-revision', 0),
-        ('set-revision-prop', 0, 'svn:date', '2005-04-01T09:57:41.312767Z'),
-        ('close-revision', 0),
-        ('new-revision', 1),
-        ('set-revision-prop', 1, 'svn:log', 'Initial directory layout.'),
-        ('set-revision-prop', 1, 'svn:author', 'john'),
-        ('set-revision-prop', 1, 'svn:date', '2005-04-01T10:00:52.353248Z'),
-        ('new-node', 1, 'branches'),
-        ('remove-node-props', 1, 'branches'),
-        ('close-node', 1, 'branches'),
-        ('new-node', 1, 'tags'),
-        ('remove-node-props', 1, 'tags'),
-        ('close-node', 1, 'tags'),
-        ('new-node', 1, 'trunk'),
-        ('remove-node-props', 1, 'trunk'),
-        ('close-node', 1, 'trunk'),
-        ('close-revision', 1),
-        ('new-revision', 2),
-        ('set-revision-prop', 2, 'svn:log', 'Added README.'),
-        ('set-revision-prop', 2, 'svn:author', 'john'),
-        ('set-revision-prop', 2, 'svn:date', '2005-04-01T13:12:18.216267Z'),
-        ('new-node', 2, 'trunk/README.txt'),
-        ('remove-node-props', 2, 'trunk/README.txt'),
-        ('set-fulltext', 2, 'trunk/README.txt'),
-        ('close-node', 2, 'trunk/README.txt'),
-        ('close-revision', 2), ('new-revision', 3),
-        ('set-revision-prop', 3, 'svn:log', 'Fixed README.\n'),
-        ('set-revision-prop', 3, 'svn:author', 'kate'),
-        ('set-revision-prop', 3, 'svn:date', '2005-04-01T13:24:58.234643Z'),
-        ('new-node', 3, 'trunk/README.txt'),
-        ('remove-node-props', 3, 'trunk/README.txt'),
-        ('set-node-prop', 3, 'trunk/README.txt', 'svn:mime-type', 'text/plain'),
-        ('set-node-prop', 3, 'trunk/README.txt', 'svn:eol-style', 'native'),
-        ('set-fulltext', 3, 'trunk/README.txt'),
-        ('close-node', 3, 'trunk/README.txt'), ('close-revision', 3),
+        (b"magic-header", 2),
+        (b'uuid', b'92ea810a-adf3-0310-b540-bef912dcf5ba'),
+        (b'new-revision', 0),
+        (b'set-revision-prop', 0, b'svn:date', b'2005-04-01T09:57:41.312767Z'),
+        (b'close-revision', 0),
+        (b'new-revision', 1),
+        (b'set-revision-prop', 1, b'svn:log', b'Initial directory layout.'),
+        (b'set-revision-prop', 1, b'svn:author', b'john'),
+        (b'set-revision-prop', 1, b'svn:date', b'2005-04-01T10:00:52.353248Z'),
+        (b'new-node', 1, b'branches'),
+        (b'remove-node-props', 1, b'branches'),
+        (b'close-node', 1, b'branches'),
+        (b'new-node', 1, b'tags'),
+        (b'remove-node-props', 1, b'tags'),
+        (b'close-node', 1, b'tags'),
+        (b'new-node', 1, b'trunk'),
+        (b'remove-node-props', 1, b'trunk'),
+        (b'close-node', 1, b'trunk'),
+        (b'close-revision', 1),
+        (b'new-revision', 2),
+        (b'set-revision-prop', 2, b'svn:log', b'Added README.'),
+        (b'set-revision-prop', 2, b'svn:author', b'john'),
+        (b'set-revision-prop', 2, b'svn:date', b'2005-04-01T13:12:18.216267Z'),
+        (b'new-node', 2, b'trunk/README.txt'),
+        (b'remove-node-props', 2, b'trunk/README.txt'),
+        (b'set-fulltext', 2, b'trunk/README.txt'),
+        (b'close-node', 2, b'trunk/README.txt'),
+        (b'close-revision', 2), (b'new-revision', 3),
+        (b'set-revision-prop', 3, b'svn:log', b'Fixed README.\n'),
+        (b'set-revision-prop', 3, b'svn:author', b'kate'),
+        (b'set-revision-prop', 3, b'svn:date', b'2005-04-01T13:24:58.234643Z'),
+        (b'new-node', 3, b'trunk/README.txt'),
+        (b'remove-node-props', 3, b'trunk/README.txt'),
+        (b'set-node-prop', 3, b'trunk/README.txt', b'svn:mime-type', b'text/plain'),
+        (b'set-node-prop', 3, b'trunk/README.txt', b'svn:eol-style', b'native'),
+        (b'set-fulltext', 3, b'trunk/README.txt'),
+        (b'close-node', 3, b'trunk/README.txt'), (b'close-revision', 3),
         ]
     # Compare only the first X nodes described in the expected list - otherwise
     # the comparison list gets too long.
@@ -232,7 +232,7 @@ class SubversionRepositoryTestCase(unitt
         DumpStreamParser.set_fulltext(self, node_baton)
         return 42
     stream = open(os.path.join(os.path.dirname(sys.argv[0]),
-                               "trac/versioncontrol/tests/svnrepos.dump"))
+                               "trac/versioncontrol/tests/svnrepos.dump"), "rb")
     try:
       dsp = DumpStreamParserSubclass()
       ptr, baton = repos.make_parse_fns3(dsp)
@@ -249,7 +249,7 @@ class SubversionRepositoryTestCase(unitt
         logs.append(paths)
 
     # Run get_logs
-    repos.get_logs(self.repos, ['/'], self.rev, 0, True, 0, addLog)
+    repos.get_logs(self.repos, [b'/'], self.rev, 0, True, 0, addLog)
 
     # Count and verify changes
     change_count = 0
@@ -257,8 +257,8 @@ class SubversionRepositoryTestCase(unitt
       for path_changed in core._as_list(log.values()):
         change_count += 1
         path_changed.assert_valid()
-    self.assertEqual(logs[2]["/tags/v1.1"].action, "A")
-    self.assertEqual(logs[2]["/tags/v1.1"].copyfrom_path, "/branches/v1x")
+    self.assertEqual(logs[2][b"/tags/v1.1"].action, b"A")
+    self.assertEqual(logs[2][b"/tags/v1.1"].copyfrom_path, b"/branches/v1x")
     self.assertEqual(len(logs), 12)
     self.assertEqual(change_count, 19)
 
@@ -269,14 +269,14 @@ class SubversionRepositoryTestCase(unitt
     prev_root = fs.revision_root(self.fs, self.rev-1)
     editor = ChangeReceiver(this_root, prev_root)
     e_ptr, e_baton = delta.make_editor(editor)
-    repos.dir_delta(prev_root, '', '', this_root, '', e_ptr, e_baton,
+    repos.dir_delta(prev_root, b'', b'', this_root, b'', e_ptr, e_baton,
                     _authz_callback, 1, 1, 0, 0)
 
     # Check results.
     # Ignore the order in which the editor delivers the two sibling files.
     self.assertEqual(set([editor.textdeltas[0].new_data,
                           editor.textdeltas[1].new_data]),
-                     set(["This is a test.\n", "A test.\n"]))
+                     set([b"This is a test.\n", b"A test.\n"]))
     self.assertEqual(len(editor.textdeltas), 2)
 
   def test_unnamed_editor(self):
@@ -287,29 +287,29 @@ class SubversionRepositoryTestCase(unitt
       this_root = fs.revision_root(self.fs, self.rev)
       prev_root = fs.revision_root(self.fs, self.rev-1)
       e_ptr, e_baton = delta.make_editor(ChangeReceiver(this_root, prev_root))
-      repos.dir_delta(prev_root, '', '', this_root, '', e_ptr, e_baton,
+      repos.dir_delta(prev_root, b'', b'', this_root, b'', e_ptr, e_baton,
               _authz_callback, 1, 1, 0, 0)
 
   def test_retrieve_and_change_rev_prop(self):
     """Test playing with revprops"""
-    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
+    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, b"svn:log",
                                             _authz_callback),
-                     "''(a few years later)'' Argh... v1.1 was buggy, "
-                     "after all")
+                     b"''(a few years later)'' Argh... v1.1 was buggy, "
+                     b"after all")
 
     # We expect this to complain because we have no pre-revprop-change
     # hook script for the repository.
     self.assertRaises(SubversionException, repos.fs_change_rev_prop3,
-                      self.repos, self.rev, "jrandom", "svn:log",
-                      "Youngest revision", True, True, _authz_callback)
+                      self.repos, self.rev, b"jrandom", b"svn:log",
+                      b"Youngest revision", True, True, _authz_callback)
 
-    repos.fs_change_rev_prop3(self.repos, self.rev, "jrandom", "svn:log",
-                              "Youngest revision", False, False,
+    repos.fs_change_rev_prop3(self.repos, self.rev, b"jrandom", b"svn:log",
+                              b"Youngest revision", False, False,
                               _authz_callback)
 
-    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, "svn:log",
+    self.assertEqual(repos.fs_revision_prop(self.repos, self.rev, b"svn:log",
                                             _authz_callback),
-                     "Youngest revision")
+                     b"Youngest revision")
 
   def freeze_body(self, pool):
     self.freeze_invoked += 1
@@ -324,42 +324,42 @@ class SubversionRepositoryTestCase(unitt
   def test_lock_unlock(self):
     """Basic lock/unlock"""
 
-    access = fs.create_access('jrandom')
+    access = fs.create_access(b'jrandom')
     fs.set_access(self.fs, access)
-    fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, False)
+    fs.lock(self.fs, b'/trunk/README.txt', None, None, 0, 0, self.rev, False)
     try:
-      fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, False)
+      fs.lock(self.fs, b'/trunk/README.txt', None, None, 0, 0, self.rev, False)
     except core.SubversionException as exc:
       self.assertEqual(exc.apr_err, core.SVN_ERR_FS_PATH_ALREADY_LOCKED)
-    fs.lock(self.fs, '/trunk/README.txt', None, None, 0, 0, self.rev, True)
+    fs.lock(self.fs, b'/trunk/README.txt', None, None, 0, 0, self.rev, True)
 
     self.calls = 0
     self.errors = 0
     def unlock_callback(path, lock, err, pool):
-      self.assertEqual(path, '/trunk/README.txt')
+      self.assertEqual(path, b'/trunk/README.txt')
       self.assertEqual(lock, None)
       self.calls += 1
       if err != None:
         self.assertEqual(err.apr_err, core.SVN_ERR_FS_NO_SUCH_LOCK)
         self.errors += 1
 
-    the_lock = fs.get_lock(self.fs, '/trunk/README.txt')
-    fs.unlock_many(self.fs, {'/trunk/README.txt':the_lock.token}, False,
+    the_lock = fs.get_lock(self.fs, b'/trunk/README.txt')
+    fs.unlock_many(self.fs, {b'/trunk/README.txt':the_lock.token}, False,
                    unlock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.errors, 0)
 
     self.calls = 0
-    fs.unlock_many(self.fs, {'/trunk/README.txt':the_lock.token}, False,
+    fs.unlock_many(self.fs, {b'/trunk/README.txt':the_lock.token}, False,
                    unlock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.errors, 1)
 
     self.locks = 0
     def lock_callback(path, lock, err, pool):
-      self.assertEqual(path, '/trunk/README.txt')
+      self.assertEqual(path, b'/trunk/README.txt')
       if lock != None:
-        self.assertEqual(lock.owner, 'jrandom')
+        self.assertEqual(lock.owner, b'jrandom')
         self.locks += 1
       self.calls += 1
       if err != None:
@@ -369,7 +369,7 @@ class SubversionRepositoryTestCase(unitt
     self.calls = 0
     self.errors = 0
     target = fs.lock_target_create(None, self.rev)
-    fs.lock_many(self.fs, {'trunk/README.txt':target},
+    fs.lock_many(self.fs, {b'trunk/README.txt':target},
                  None, False, 0, False, lock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 1)
@@ -377,7 +377,7 @@ class SubversionRepositoryTestCase(unitt
 
     self.calls = 0
     self.locks = 0
-    fs.lock_many(self.fs, {'trunk/README.txt':target},
+    fs.lock_many(self.fs, {b'trunk/README.txt':target},
                  None, False, 0, False, lock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 0)
@@ -385,21 +385,21 @@ class SubversionRepositoryTestCase(unitt
 
     self.calls = 0
     self.errors = 0
-    the_lock = fs.get_lock(self.fs, '/trunk/README.txt')
-    repos.fs_unlock_many(self.repos, {'trunk/README.txt':the_lock.token},
+    the_lock = fs.get_lock(self.fs, b'/trunk/README.txt')
+    repos.fs_unlock_many(self.repos, {b'trunk/README.txt':the_lock.token},
                          False, unlock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.errors, 0)
 
     self.calls = 0
-    repos.fs_unlock_many(self.repos, {'trunk/README.txt':the_lock.token},
+    repos.fs_unlock_many(self.repos, {b'trunk/README.txt':the_lock.token},
                          False, unlock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.errors, 1)
 
     self.calls = 0
     self.errors = 0
-    repos.fs_lock_many(self.repos, {'trunk/README.txt':target},
+    repos.fs_lock_many(self.repos, {b'trunk/README.txt':target},
                        None, False, 0, False, lock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 1)
@@ -407,7 +407,7 @@ class SubversionRepositoryTestCase(unitt
 
     self.calls = 0
     self.locks = 0
-    repos.fs_lock_many(self.repos, {'trunk/README.txt':target},
+    repos.fs_lock_many(self.repos, {b'trunk/README.txt':target},
                        None, False, 0, False, lock_callback)
     self.assertEqual(self.calls, 1)
     self.assertEqual(self.locks, 0)

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/main.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/main.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/main.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/main.py Thu Dec 27 03:42:52 2018
@@ -154,12 +154,12 @@ class Node(object):
     Represents a directory or file in the repository.
     """
 
-    DIRECTORY = "dir"
-    FILE = "file"
+    DIRECTORY = b"dir"
+    FILE = b"file"
 
     def __init__(self, path, rev, kind):
         assert kind in (Node.DIRECTORY, Node.FILE), "Unknown node kind %s" % kind
-        self.path = str(path)
+        self.path = path
         self.rev = rev
         self.kind = kind
 
@@ -217,7 +217,7 @@ class Node(object):
     content_type = property(lambda x: x.get_content_type())
 
     def get_name(self):
-        return self.path.split('/')[-1]
+        return self.path.split(b'/')[-1]
     name = property(lambda x: x.get_name())
 
     def get_last_modified(self):
@@ -233,11 +233,11 @@ class Changeset(object):
     Represents a set of changes of a repository.
     """
 
-    ADD = 'add'
-    COPY = 'copy'
-    DELETE = 'delete'
-    EDIT = 'edit'
-    MOVE = 'move'
+    ADD = b'add'
+    COPY = b'copy'
+    DELETE = b'delete'
+    EDIT = b'edit'
+    MOVE = b'move'
 
     def __init__(self, rev, message, author, date):
         self.rev = rev

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/svn_fs.py Thu Dec 27 03:42:52 2018
@@ -55,9 +55,12 @@ import os.path
 import time
 import weakref
 import posixpath
+import sys
 
 from svn import fs, repos, core, delta
 
+IS_PY3 = sys.version_info[0] >= 3
+
 _kindmap = {core.svn_node_dir: Node.DIRECTORY,
             core.svn_node_file: Node.FILE}
 
@@ -107,17 +110,17 @@ class SubversionRepository(Repository):
             raise TracError("%s does not appear to be a Subversion repository." % (path, ))
         if self.path != path:
             self.scope = path[len(self.path):]
-            if not self.scope[-1] == '/':
-                self.scope += '/'
+            if not self.scope[-1:] == b'/':
+                self.scope += b'/'
         else:
-            self.scope = '/'
+            self.scope = b'/'
 
         self.repos = repos.svn_repos_open(self.path)
         self.fs_ptr = repos.svn_repos_fs(self.repos)
         self.rev = fs.youngest_rev(self.fs_ptr)
 
         self.history = None
-        if self.scope != '/':
+        if self.scope != b'/':
             self.history = []
             for path,rev in _get_history(self.scope[1:], self.authz,
                                          self.fs_ptr, 0, self.rev):
@@ -132,7 +135,7 @@ class SubversionRepository(Repository):
         return node_type in _kindmap
 
     def normalize_path(self, path):
-        return path == '/' and path or path and path.strip('/') or ''
+        return path == b'/' and path or path and path.strip(b'/') or b''
 
     def normalize_rev(self, rev):
         try:
@@ -157,7 +160,7 @@ class SubversionRepository(Repository):
 
     def get_node(self, path, rev=None):
         self.authz.assert_permission(self.scope + path)
-        if path and path[-1] == '/':
+        if path and path[-1] == b'/':
             path = path[:-1]
 
         rev = self.normalize_rev(rev)
@@ -166,13 +169,13 @@ class SubversionRepository(Repository):
 
     def get_oldest_rev(self):
         rev = 0
-        if self.scope == '/':
+        if self.scope == b'/':
             return rev
         return self.history[-1]
 
     def get_youngest_rev(self):
         rev = self.rev
-        if self.scope == '/':
+        if self.scope == b'/':
             return rev
         return self.history[0]
 
@@ -180,7 +183,7 @@ class SubversionRepository(Repository):
         rev = int(rev)
         if rev == 0:
             return None
-        if self.scope == '/':
+        if self.scope == b'/':
             return rev - 1
         idx = self.history.index(rev)
         if idx + 1 < len(self.history):
@@ -191,7 +194,7 @@ class SubversionRepository(Repository):
         rev = int(rev)
         if rev == self.rev:
             return None
-        if self.scope == '/':
+        if self.scope == b'/':
             return rev + 1
         if rev == 0:
             return self.oldest_rev
@@ -224,7 +227,7 @@ class SubversionRepository(Repository):
                         else: # the path changed: 'newer' was a copy
                             rev = self.previous_rev(newer[1]) # restart before the copy op
                             yield newer[0], newer[1], Changeset.COPY
-                            older = (older[0], older[1], 'unknown')
+                            older = (older[0], older[1], b'unknown')
                             break
                     newer = older
                 if older: # either a real ADD or the source of a COPY
@@ -262,7 +265,7 @@ class SubversionRepository(Repository):
             def authz_cb(root, path, pool): return 1
             text_deltas = 0 # as this is anyway re-done in Diff.py...
             entry_props = 0 # ("... typically used only for working copy updates")
-            repos.svn_repos_dir_delta(old_root, old_path, '',
+            repos.svn_repos_dir_delta(old_root, old_path, b'',
                                       new_root, new_path,
                                       e_ptr, e_baton, authz_cb,
                                       text_deltas,
@@ -290,7 +293,7 @@ class SubversionNode(Node):
     def __init__(self, path, rev, authz, scope, fs_ptr):
         self.authz = authz
         self.scope = scope
-        if scope != '/':
+        if scope != b'/':
             self.scoped_path = scope + path
         else:
             self.scoped_path = path
@@ -300,7 +303,11 @@ class SubversionNode(Node):
         self.root = fs.revision_root(fs_ptr, rev)
         node_type = fs.check_path(self.root, self.scoped_path)
         if not node_type in _kindmap:
-            raise TracError("No node at %s in revision %s" % (path, rev))
+            if IS_PY3:
+                raise TracError("No node at %s in revision %s"
+                                % (path.decode('UTF-8'), rev))
+            else:
+                raise TracError("No node at %s in revision %s" % (path, rev))
         self.created_rev = fs.node_created_rev(self.root, self.scoped_path)
         self.created_path = fs.node_created_path(self.root, self.scoped_path)
         # Note: 'created_path' differs from 'path' if the last change was a copy,
@@ -323,7 +330,7 @@ class SubversionNode(Node):
             return
         entries = fs.dir_entries(self.root, self.scoped_path)
         for item in entries:
-            path = '/'.join((self.path, item))
+            path = b'/'.join((self.path, item))
             if not self.authz.has_permission(path):
                 continue
             yield SubversionNode(path, self._requested_rev, self.authz,
@@ -350,7 +357,7 @@ class SubversionNode(Node):
     def get_properties(self):
         props = fs.node_proplist(self.root, self.scoped_path)
         for name,value in core._as_list(props.items()):
-            props[name] = str(value) # Make sure the value is a proper string
+            props[name] = value
         return props
 
     def get_content_length(self):
@@ -461,7 +468,7 @@ class DiffChangeEditor(delta.Editor):
     # -- svn.delta.Editor callbacks
 
     def open_root(self, base_revision, dir_pool):
-        return ('/', Changeset.EDIT)
+        return (b'/', Changeset.EDIT)
 
     def add_directory(self, path, dir_baton, copyfrom_path, copyfrom_rev, dir_pool):
         self.deltas.append((path, Node.DIRECTORY, Changeset.ADD))

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py Thu Dec 27 03:42:52 2018
@@ -68,19 +68,19 @@ from trac.test import TestSetup
 from trac.versioncontrol import Changeset, Node
 from trac.versioncontrol.svn_fs import SubversionRepository
 
-temp_path = tempfile.mktemp("-trac-svnrepos")
+temp_path = tempfile.mktemp("-trac-svnrepos").encode('UTF-8')
 REPOS_PATH = core.svn_dirent_internal_style(temp_path)
-REPOS_URL = pathname2url(temp_path)
+REPOS_URL = pathname2url(temp_path).encode('UTF-8')
 del temp_path
 
-if REPOS_URL.startswith("///"):
+if REPOS_URL.startswith(b"///"):
   # Don't add extra slashes if they're already present.
   # (This is important for Windows compatibility).
-  REPOS_URL = "file:" + REPOS_URL
+  REPOS_URL = b"file:" + REPOS_URL
 else:
   # If the URL simply starts with '/', we need to add two
   # extra slashes to make it a valid 'file://' URL
-  REPOS_URL = "file://" + REPOS_URL
+  REPOS_URL = b"file://" + REPOS_URL
 
 REPOS_URL = core.svn_uri_canonicalize(REPOS_URL)
 
@@ -93,9 +93,9 @@ class SubversionRepositoryTestSetup(Test
             # ensure a fresh start.
             self.tearDown()
 
-            r = repos.svn_repos_create(REPOS_PATH, '', '', None, None)
+            r = repos.svn_repos_create(REPOS_PATH, b'', b'', None, None)
             repos.svn_repos_load_fs2(r, dumpfile, BytesIO(),
-                                    repos.svn_repos_load_uuid_ignore, '',
+                                    repos.svn_repos_load_uuid_ignore, b'',
                                     0, 0, None)
 
     def tearDown(self):
@@ -122,111 +122,111 @@ class SubversionRepositoryTestCase(unitt
         self.assertEqual(None, self.repos.next_rev(12))
 
     def test_get_node(self):
-        node = self.repos.get_node('/trunk')
-        self.assertEqual('trunk', node.name)
-        self.assertEqual('/trunk', node.path)
+        node = self.repos.get_node(b'/trunk')
+        self.assertEqual(b'trunk', node.name)
+        self.assertEqual(b'/trunk', node.path)
         self.assertEqual(Node.DIRECTORY, node.kind)
         self.assertEqual(6, node.rev)
         self.assertEqual(1112381806, node.last_modified)
-        node = self.repos.get_node('/trunk/README.txt')
-        self.assertEqual('README.txt', node.name)
-        self.assertEqual('/trunk/README.txt', node.path)
+        node = self.repos.get_node(b'/trunk/README.txt')
+        self.assertEqual(b'README.txt', node.name)
+        self.assertEqual(b'/trunk/README.txt', node.path)
         self.assertEqual(Node.FILE, node.kind)
         self.assertEqual(3, node.rev)
         self.assertEqual(1112361898, node.last_modified)
 
     def test_get_node_specific_rev(self):
-        node = self.repos.get_node('/trunk', 1)
-        self.assertEqual('trunk', node.name)
-        self.assertEqual('/trunk', node.path)
+        node = self.repos.get_node(b'/trunk', 1)
+        self.assertEqual(b'trunk', node.name)
+        self.assertEqual(b'/trunk', node.path)
         self.assertEqual(Node.DIRECTORY, node.kind)
         self.assertEqual(1, node.rev)
         self.assertEqual(1112349652, node.last_modified)
-        node = self.repos.get_node('/trunk/README.txt', 2)
-        self.assertEqual('README.txt', node.name)
-        self.assertEqual('/trunk/README.txt', node.path)
+        node = self.repos.get_node(b'/trunk/README.txt', 2)
+        self.assertEqual(b'README.txt', node.name)
+        self.assertEqual(b'/trunk/README.txt', node.path)
         self.assertEqual(Node.FILE, node.kind)
         self.assertEqual(2, node.rev)
         self.assertEqual(1112361138, node.last_modified)
 
     def test_get_dir_entries(self):
-        node = self.repos.get_node('/trunk')
+        node = self.repos.get_node(b'/trunk')
         entries = node.get_entries()
         self.assertSequenceEqual(sorted([entry.name for entry in entries]),
-                                 sorted(['README2.txt',
-                                  'dir1',
-                                  'README.txt']))
+                                 sorted([b'README2.txt',
+                                  b'dir1',
+                                  b'README.txt']))
 
     def test_get_file_entries(self):
-        node = self.repos.get_node('/trunk/README.txt')
+        node = self.repos.get_node(b'/trunk/README.txt')
         entries = node.get_entries()
         self.assertSequenceEqual([entry.name for entry in entries],
                                  [])
 
     def test_get_dir_content(self):
-        node = self.repos.get_node('/trunk')
+        node = self.repos.get_node(b'/trunk')
         self.assertEqual(None, node.content_length)
         self.assertEqual(None, node.content_type)
         self.assertEqual(None, node.get_content())
 
     def test_get_file_content(self):
-        node = self.repos.get_node('/trunk/README.txt')
+        node = self.repos.get_node(b'/trunk/README.txt')
         self.assertEqual(8, node.content_length)
-        self.assertEqual('text/plain', node.content_type)
-        self.assertEqual('A test.\n', node.get_content().read())
+        self.assertEqual(b'text/plain', node.content_type)
+        self.assertEqual(b'A test.\n', node.get_content().read())
 
     def test_get_dir_properties(self):
-        f = self.repos.get_node('/trunk')
+        f = self.repos.get_node(b'/trunk')
         props = f.get_properties()
         self.assertEqual(0, len(props))
 
     def test_get_file_properties(self):
-        f = self.repos.get_node('/trunk/README.txt')
+        f = self.repos.get_node(b'/trunk/README.txt')
         props = f.get_properties()
-        self.assertEqual('native', props['svn:eol-style'])
-        self.assertEqual('text/plain', props['svn:mime-type'])
+        self.assertEqual(b'native', props[b'svn:eol-style'])
+        self.assertEqual(b'text/plain', props[b'svn:mime-type'])
 
     # Revision Log / node history
 
     def test_get_node_history(self):
-        node = self.repos.get_node('/trunk/README2.txt')
+        node = self.repos.get_node(b'/trunk/README2.txt')
         history = node.get_history()
         self.assertSequenceEqual([x for x in history],
-                                 [('trunk/README2.txt', 6, 'copy'),
-                                  ('trunk/README.txt', 3, 'edit'),
-                                  ('trunk/README.txt', 2, 'add')])
+                                 [(b'trunk/README2.txt', 6, b'copy'),
+                                  (b'trunk/README.txt', 3, b'edit'),
+                                  (b'trunk/README.txt', 2, b'add')])
 
     def test_get_node_history_follow_copy(self):
-        node = self.repos.get_node('/tags/v1/README.txt')
+        node = self.repos.get_node(b'/tags/v1/README.txt')
         history = node.get_history()
         self.assertSequenceEqual([x for x in history],
-                                 [('tags/v1/README.txt', 7, 'copy'),
-                                  ('trunk/README.txt', 3, 'edit'),
-                                  ('trunk/README.txt', 2, 'add')])
+                                 [(b'tags/v1/README.txt', 7, b'copy'),
+                                  (b'trunk/README.txt', 3, b'edit'),
+                                  (b'trunk/README.txt', 2, b'add')])
 
     # Revision Log / path history
 
     def test_get_path_history(self):
-        history = self.repos.get_path_history('/trunk/README2.txt', None)
+        history = self.repos.get_path_history(b'/trunk/README2.txt', None)
         self.assertSequenceEqual([x for x in history],
-                                 [('trunk/README2.txt', 6, 'copy'),
-                                  ('trunk/README.txt', 3, 'unknown')])
+                                 [(b'trunk/README2.txt', 6, b'copy'),
+                                  (b'trunk/README.txt', 3, b'unknown')])
 
     def test_get_path_history_copied_file(self):
-        history = self.repos.get_path_history('/tags/v1/README.txt', None)
+        history = self.repos.get_path_history(b'/tags/v1/README.txt', None)
         self.assertSequenceEqual([x for x in history],
-                                 [('tags/v1/README.txt', 7, 'copy'),
-                                  ('trunk/README.txt', 3, 'unknown')])
+                                 [(b'tags/v1/README.txt', 7, b'copy'),
+                                  (b'trunk/README.txt', 3, b'unknown')])
 
     def test_get_path_history_copied_dir(self):
-        history = self.repos.get_path_history('/branches/v1x', None)
+        history = self.repos.get_path_history(b'/branches/v1x', None)
         self.assertSequenceEqual([x for x in history],
-                                 [('branches/v1x', 12, 'copy'),
-                                  ('tags/v1.1', 10, 'unknown'),
-                                  ('branches/v1x', 11, 'delete'),
-                                  ('branches/v1x', 9, 'edit'),
-                                  ('branches/v1x', 8, 'copy'),
-                                  ('tags/v1', 7, 'unknown')])
+                                 [(b'branches/v1x', 12, b'copy'),
+                                  (b'tags/v1.1', 10, b'unknown'),
+                                  (b'branches/v1x', 11, b'delete'),
+                                  (b'branches/v1x', 9, b'edit'),
+                                  (b'branches/v1x', 8, b'copy'),
+                                  (b'tags/v1', 7, b'unknown')])
 
     # Diffs
 
@@ -240,37 +240,37 @@ class SubversionRepositoryTestCase(unitt
         self.assertEqual(expected[2], (got[2], got[3]))
 
     def test_diff_file_different_revs(self):
-        diffs = self.repos.get_deltas('trunk/README.txt', 2, 'trunk/README.txt', 3)
-        self._cmp_diff((('trunk/README.txt', 2),
-                        ('trunk/README.txt', 3),
+        diffs = self.repos.get_deltas(b'trunk/README.txt', 2, b'trunk/README.txt', 3)
+        self._cmp_diff(((b'trunk/README.txt', 2),
+                        (b'trunk/README.txt', 3),
                         (Node.FILE, Changeset.EDIT)), next(diffs))
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     def test_diff_file_different_files(self):
-        diffs = self.repos.get_deltas('branches/v1x/README.txt', 12,
-                                      'branches/v1x/README2.txt', 12)
-        self._cmp_diff((('branches/v1x/README.txt', 12),
-                        ('branches/v1x/README2.txt', 12),
+        diffs = self.repos.get_deltas(b'branches/v1x/README.txt', 12,
+                                      b'branches/v1x/README2.txt', 12)
+        self._cmp_diff(((b'branches/v1x/README.txt', 12),
+                        (b'branches/v1x/README2.txt', 12),
                         (Node.FILE, Changeset.EDIT)), next(diffs))
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     def test_diff_file_no_change(self):
-        diffs = self.repos.get_deltas('trunk/README.txt', 7,
-                                      'tags/v1/README.txt', 7)
+        diffs = self.repos.get_deltas(b'trunk/README.txt', 7,
+                                      b'tags/v1/README.txt', 7)
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     def test_diff_dir_different_revs(self):
-        diffs = self.repos.get_deltas('trunk', 4, 'trunk', 8)
+        diffs = self.repos.get_deltas(b'trunk', 4, b'trunk', 8)
         expected = [
-          (None, ('trunk/README2.txt', 6),
+          (None, (b'trunk/README2.txt', 6),
            (Node.FILE, Changeset.ADD)),
-          (None, ('trunk/dir1/dir2', 8),
+          (None, (b'trunk/dir1/dir2', 8),
            (Node.DIRECTORY, Changeset.ADD)),
-          (None, ('trunk/dir1/dir3', 8),
+          (None, (b'trunk/dir1/dir3', 8),
            (Node.DIRECTORY, Changeset.ADD)),
-          (('trunk/dir2', 4), None,
+          ((b'trunk/dir2', 4), None,
            (Node.DIRECTORY, Changeset.DELETE)),
-          (('trunk/dir3', 4), None,
+          ((b'trunk/dir3', 4), None,
            (Node.DIRECTORY, Changeset.DELETE)),
         ]
         actual = [next(diffs) for i in range(5)]
@@ -283,17 +283,17 @@ class SubversionRepositoryTestCase(unitt
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     def test_diff_dir_different_dirs(self):
-        diffs = self.repos.get_deltas('trunk', 1, 'branches/v1x', 12)
+        diffs = self.repos.get_deltas(b'trunk', 1, b'branches/v1x', 12)
         expected = [
-          (None, ('branches/v1x/README.txt', 12),
+          (None, (b'branches/v1x/README.txt', 12),
            (Node.FILE, Changeset.ADD)),
-          (None, ('branches/v1x/README2.txt', 12),
+          (None, (b'branches/v1x/README2.txt', 12),
            (Node.FILE, Changeset.ADD)),
-          (None, ('branches/v1x/dir1', 12),
+          (None, (b'branches/v1x/dir1', 12),
            (Node.DIRECTORY, Changeset.ADD)),
-          (None, ('branches/v1x/dir1/dir2', 12),
+          (None, (b'branches/v1x/dir1/dir2', 12),
            (Node.DIRECTORY, Changeset.ADD)),
-          (None, ('branches/v1x/dir1/dir3', 12),
+          (None, (b'branches/v1x/dir1/dir3', 12),
            (Node.DIRECTORY, Changeset.ADD)),
         ]
         actual = [next(diffs) for i in range(5)]
@@ -308,8 +308,8 @@ class SubversionRepositoryTestCase(unitt
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     def test_diff_dir_no_change(self):
-        diffs = self.repos.get_deltas('trunk', 7,
-                                      'tags/v1', 7)
+        diffs = self.repos.get_deltas(b'trunk', 7,
+                                      b'tags/v1', 7)
         self.assertRaises(StopIteration, lambda: next(diffs))
 
     # Changesets
@@ -325,52 +325,52 @@ class SubversionRepositoryTestCase(unitt
     def test_changeset_added_dirs(self):
         chgset = self.repos.get_changeset(1)
         self.assertEqual(1, chgset.rev)
-        self.assertEqual('Initial directory layout.', chgset.message)
-        self.assertEqual('john', chgset.author)
+        self.assertEqual(b'Initial directory layout.', chgset.message)
+        self.assertEqual(b'john', chgset.author)
         self.assertEqual(1112349652, chgset.date)
 
         changes = chgset.get_changes()
         self.assertSequenceEqual(sorted([x for x in changes]),
-          sorted([('trunk', Node.DIRECTORY, Changeset.ADD, None, -1),
-                  ('branches', Node.DIRECTORY, Changeset.ADD, None, -1),
-                  ('tags', Node.DIRECTORY, Changeset.ADD, None, -1)]))
+          sorted([(b'trunk', Node.DIRECTORY, Changeset.ADD, None, -1),
+                  (b'branches', Node.DIRECTORY, Changeset.ADD, None, -1),
+                  (b'tags', Node.DIRECTORY, Changeset.ADD, None, -1)]))
 
     def test_changeset_file_edit(self):
         chgset = self.repos.get_changeset(3)
         self.assertEqual(3, chgset.rev)
-        self.assertEqual('Fixed README.\n', chgset.message)
-        self.assertEqual('kate', chgset.author)
+        self.assertEqual(b'Fixed README.\n', chgset.message)
+        self.assertEqual(b'kate', chgset.author)
         self.assertEqual(1112361898, chgset.date)
 
         changes = chgset.get_changes()
         self.assertSequenceEqual(sorted([x for x in changes]),
-                                 sorted([('trunk/README.txt', Node.FILE, Changeset.EDIT,
-                                   'trunk/README.txt', 2)]))
+                                 sorted([(b'trunk/README.txt', Node.FILE, Changeset.EDIT,
+                                   b'trunk/README.txt', 2)]))
 
     def test_changeset_dir_moves(self):
         chgset = self.repos.get_changeset(5)
         self.assertEqual(5, chgset.rev)
-        self.assertEqual('Moved directories.', chgset.message)
-        self.assertEqual('kate', chgset.author)
+        self.assertEqual(b'Moved directories.', chgset.message)
+        self.assertEqual(b'kate', chgset.author)
         self.assertEqual(1112372739, chgset.date)
 
         changes = chgset.get_changes()
         self.assertSequenceEqual(sorted([x for x in changes]),
           sorted([
-            ('trunk/dir1/dir2', Node.DIRECTORY, Changeset.MOVE, 'trunk/dir2', 4),
-            ('trunk/dir1/dir3', Node.DIRECTORY, Changeset.MOVE, 'trunk/dir3', 4)]))
+            (b'trunk/dir1/dir2', Node.DIRECTORY, Changeset.MOVE, b'trunk/dir2', 4),
+            (b'trunk/dir1/dir3', Node.DIRECTORY, Changeset.MOVE, b'trunk/dir3', 4)]))
 
     def test_changeset_file_copy(self):
         chgset = self.repos.get_changeset(6)
         self.assertEqual(6, chgset.rev)
-        self.assertEqual('More things to read', chgset.message)
-        self.assertEqual('john', chgset.author)
+        self.assertEqual(b'More things to read', chgset.message)
+        self.assertEqual(b'john', chgset.author)
         self.assertEqual(1112381806, chgset.date)
 
         changes = chgset.get_changes()
         self.assertSequenceEqual(sorted([x for x in changes]),
-          sorted([('trunk/README2.txt', Node.FILE, Changeset.COPY,
-                   'trunk/README.txt', 3)]))
+          sorted([(b'trunk/README2.txt', Node.FILE, Changeset.COPY,
+                   b'trunk/README.txt', 3)]))
 
 
 def suite():

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/utils.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/utils.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/utils.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/utils.py Thu Dec 27 03:42:52 2018
@@ -47,14 +47,14 @@ class Temper(object):
   def alloc_empty_dir(self, suffix = ""):
     """Create an empty temporary directory. Returns its full path
        in canonical internal form."""
-    temp_dir_name = core.svn_dirent_internal_style(tempfile.mkdtemp(suffix))
+    temp_dir_name = core.svn_dirent_internal_style(tempfile.mkdtemp(suffix).encode('UTF-8'))
     self._cleanup_list.append((temp_dir_name, core.svn_io_remove_dir))
     return temp_dir_name
 
   def alloc_empty_repo(self, suffix = ""):
     """Create an empty repository. Returns a tuple of its handle, path and
        file: URI in canonical internal form."""
-    temp_path = tempfile.mkdtemp(suffix)
+    temp_path = tempfile.mkdtemp(suffix).encode('UTF-8')
     repo_path = core.svn_dirent_internal_style(temp_path)
     repo_uri = core.svn_uri_canonicalize(file_uri_for_path(temp_path))
     handle = repos.create(repo_path, None, None, None, None)
@@ -74,9 +74,9 @@ class Temper(object):
 
 def file_uri_for_path(path):
   """Return the file: URI corresponding to the given path."""
-  uri_path = pathname2url(path)
+  uri_path = pathname2url(path).encode('UTF-8')
 
   # pathname2url claims to return the path part of the URI, but on Windows
   # it returns both the authority and path parts for no reason, which
   # means we have to trim the leading slashes to "normalize" the result.
-  return 'file:///' + uri_path.lstrip('/')
+  return b'file:///' + uri_path.lstrip(b'/')

Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py Thu Dec 27 03:42:52 2018
@@ -56,10 +56,10 @@ class SubversionWorkingCopyTestCase(unit
       wc.entry(self.path, self.wc, True)
 
   def test_lock(self):
-      readme_path = '%s/trunk/README.txt' % self.path
+      readme_path = b'%s/trunk/README.txt' % self.path
 
       lock = core.svn_lock_create(core.Pool())
-      lock.token = 'http://svnbook.org/nightly/en/svn.advanced.locking.html'
+      lock.token = b'http://svnbook.org/nightly/en/svn.advanced.locking.html'
 
       wc.add_lock(readme_path, lock, self.wc)
       self.assertEqual(True, wc.adm_locked(self.wc))
@@ -73,23 +73,23 @@ class SubversionWorkingCopyTestCase(unit
       self.assertEqual(self.path, wc.adm_access_path(self.wc))
 
   def test_is_adm_dir(self):
-      self.assertTrue(wc.is_adm_dir(".svn"))
-      self.assertFalse(wc.is_adm_dir(".foosvn"))
+      self.assertTrue(wc.is_adm_dir(b".svn"))
+      self.assertFalse(wc.is_adm_dir(b".foosvn"))
 
   def test_get_adm_dir(self):
-      self.assertTrue(isinstance(wc.get_adm_dir(), str))
+      self.assertTrue(isinstance(wc.get_adm_dir(), bytes))
 
   def test_set_adm_dir(self):
-      self.assertRaises(SubversionException, wc.set_adm_dir, ".foobar")
-      self.assertTrue(wc.is_adm_dir(".svn"))
-      self.assertFalse(wc.is_adm_dir("_svn"))
-      self.assertFalse(wc.is_adm_dir(".foobar"))
-      wc.set_adm_dir("_svn")
-      self.assertTrue(wc.is_adm_dir("_svn"))
-      self.assertEqual("_svn", wc.get_adm_dir())
-      wc.set_adm_dir(".svn")
-      self.assertFalse(wc.is_adm_dir("_svn"))
-      self.assertEqual(".svn", wc.get_adm_dir())
+      self.assertRaises(SubversionException, wc.set_adm_dir, b".foobar")
+      self.assertTrue(wc.is_adm_dir(b".svn"))
+      self.assertFalse(wc.is_adm_dir(b"_svn"))
+      self.assertFalse(wc.is_adm_dir(b".foobar"))
+      wc.set_adm_dir(b"_svn")
+      self.assertTrue(wc.is_adm_dir(b"_svn"))
+      self.assertEqual(b"_svn", wc.get_adm_dir())
+      wc.set_adm_dir(b".svn")
+      self.assertFalse(wc.is_adm_dir(b"_svn"))
+      self.assertEqual(b".svn", wc.get_adm_dir())
 
   def test_init_traversal_info(self):
       wc.init_traversal_info()
@@ -122,7 +122,7 @@ class SubversionWorkingCopyTestCase(unit
               pass
 
       # Remove trunk/README.txt
-      readme_path = '%s/trunk/README.txt' % self.path
+      readme_path = b'%s/trunk/README.txt' % self.path
       self.assertTrue(os.path.exists(readme_path))
       os.remove(readme_path)
 
@@ -134,7 +134,7 @@ class SubversionWorkingCopyTestCase(unit
 
       # Check that the report finished
       self.assertTrue(reporter.finished_report)
-      self.assertEqual([''], set_paths)
+      self.assertEqual([b''], set_paths)
       self.assertEqual(1, len(infos))
 
       # Check content of infos object
@@ -179,42 +179,42 @@ class SubversionWorkingCopyTestCase(unit
       self.assertTrue(len(paths) > 0)
 
   def test_is_normal_prop(self):
-      self.assertFalse(wc.is_normal_prop('svn:wc:foo:bar'))
-      self.assertFalse(wc.is_normal_prop('svn:entry:foo:bar'))
-      self.assertTrue(wc.is_normal_prop('svn:foo:bar'))
-      self.assertTrue(wc.is_normal_prop('foreign:foo:bar'))
+      self.assertFalse(wc.is_normal_prop(b'svn:wc:foo:bar'))
+      self.assertFalse(wc.is_normal_prop(b'svn:entry:foo:bar'))
+      self.assertTrue(wc.is_normal_prop(b'svn:foo:bar'))
+      self.assertTrue(wc.is_normal_prop(b'foreign:foo:bar'))
 
   def test_is_wc_prop(self):
-      self.assertTrue(wc.is_wc_prop('svn:wc:foo:bar'))
-      self.assertFalse(wc.is_wc_prop('svn:entry:foo:bar'))
-      self.assertFalse(wc.is_wc_prop('svn:foo:bar'))
-      self.assertFalse(wc.is_wc_prop('foreign:foo:bar'))
+      self.assertTrue(wc.is_wc_prop(b'svn:wc:foo:bar'))
+      self.assertFalse(wc.is_wc_prop(b'svn:entry:foo:bar'))
+      self.assertFalse(wc.is_wc_prop(b'svn:foo:bar'))
+      self.assertFalse(wc.is_wc_prop(b'foreign:foo:bar'))
 
   def test_is_entry_prop(self):
-      self.assertTrue(wc.is_entry_prop('svn:entry:foo:bar'))
-      self.assertFalse(wc.is_entry_prop('svn:wc:foo:bar'))
-      self.assertFalse(wc.is_entry_prop('svn:foo:bar'))
-      self.assertFalse(wc.is_entry_prop('foreign:foo:bar'))
+      self.assertTrue(wc.is_entry_prop(b'svn:entry:foo:bar'))
+      self.assertFalse(wc.is_entry_prop(b'svn:wc:foo:bar'))
+      self.assertFalse(wc.is_entry_prop(b'svn:foo:bar'))
+      self.assertFalse(wc.is_entry_prop(b'foreign:foo:bar'))
 
   def test_get_prop_diffs(self):
-      wc.prop_set("foreign:foo", "bla", self.path, self.wc)
-      self.assertEqual([{"foreign:foo": "bla"}, {}],
+      wc.prop_set(b"foreign:foo", b"bla", self.path, self.wc)
+      self.assertEqual([{b"foreign:foo": b"bla"}, {}],
               wc.get_prop_diffs(self.path, self.wc))
 
   def test_get_pristine_copy_path(self):
-      path_to_file = '%s/trunk/README.txt' % self.path
+      path_to_file = b'%s/trunk/README.txt' % self.path
       path_to_text_base = wc.get_pristine_copy_path(path_to_file)
-      with open(path_to_text_base) as fp:
+      with open(path_to_text_base, 'rb') as fp:
           text_base = fp.read()
       # TODO: This test should modify the working file first, to ensure the
       # path isn't just the path to the working file.
-      self.assertEqual(text_base, 'A test.\n')
+      self.assertEqual(text_base, b'A test.\n')
 
   def test_entries_read(self):
       entries = wc.entries_read(self.wc, True)
       keys = core._as_list(entries.keys())
       keys.sort()
-      self.assertEqual(['', 'branches', 'tags', 'trunk'], keys)
+      self.assertEqual([b'', b'branches', b'tags', b'trunk'], keys)
 
   def test_get_ignores(self):
       self.assertTrue(isinstance(wc.get_ignores(None, self.wc), list))
@@ -222,9 +222,9 @@ class SubversionWorkingCopyTestCase(unit
   def test_commit(self):
     # Replace README.txt's contents, using binary mode so we know the
     # exact contents even on Windows, and therefore the MD5 checksum.
-    readme_path = '%s/trunk/README.txt' % self.path
+    readme_path = b'%s/trunk/README.txt' % self.path
     fp = open(readme_path, 'wb')
-    fp.write('hello\n'.encode('UTF-8'))
+    fp.write(b'hello\n')
     fp.close()
 
     # Setup ra_ctx.
@@ -236,7 +236,7 @@ class SubversionWorkingCopyTestCase(unit
     commit_info = [None]
     def commit_cb(_commit_info, pool):
       commit_info[0] = _commit_info
-    (editor, edit_baton) = ra.get_commit_editor2(ra_ctx, 'log message',
+    (editor, edit_baton) = ra.get_commit_editor2(ra_ctx, b'log message',
                                                  commit_cb,
                                                  None,
                                                  False)
@@ -250,7 +250,7 @@ class SubversionWorkingCopyTestCase(unit
                                                   False, editor, baton, pool)
       return baton
     try:
-      delta.path_driver(editor, edit_baton, -1, ['trunk/README.txt'],
+      delta.path_driver(editor, edit_baton, -1, [b'trunk/README.txt'],
                         driver_cb)
       editor.close_edit(edit_baton)
     except:
@@ -265,8 +265,8 @@ class SubversionWorkingCopyTestCase(unit
     (commit_info,) = commit_info
 
     # Assert the commit.
-    self.assertEqual(binascii.b2a_hex(checksum).decode('UTF-8'),
-                      'b1946ac92492d2347c6235b4d2611184')
+    self.assertEqual(binascii.b2a_hex(checksum),
+                      b'b1946ac92492d2347c6235b4d2611184')
     self.assertEqual(commit_info.revision, 13)
 
     # Bump working copy state.
@@ -290,14 +290,14 @@ class SubversionWorkingCopyTestCase(unit
     url = self.repos_uri
 
     # cause file_changed: Replace README.txt's contents.
-    readme_path = '%s/trunk/README.txt' % self.path
-    fp = open(readme_path, 'w')
-    fp.write('hello\n')
+    readme_path = b'%s/trunk/README.txt' % self.path
+    fp = open(readme_path, 'wb')
+    fp.write(b'hello\n')
     fp.close()
     # cause file_added: Create readme3.
-    readme3_path = '%s/trunk/readme3' % self.path
-    fp = open(readme3_path, 'w')
-    fp.write('hello\n')
+    readme3_path = b'%s/trunk/readme3' % self.path
+    fp = open(readme3_path, 'wb')
+    fp.write(b'hello\n')
     fp.close()
     wc.add2(readme3_path,
             wc.adm_probe_retrieve(self.wc,
@@ -307,7 +307,7 @@ class SubversionWorkingCopyTestCase(unit
             None,                     # notify_func
             pool)
     # cause file_deleted: Delete README2.txt.
-    readme2_path = '%s/trunk/README2.txt' % self.path
+    readme2_path = b'%s/trunk/README2.txt' % self.path
     wc.delete3(readme2_path,
                wc.adm_probe_retrieve(self.wc,
                                      os.path.dirname(readme2_path), pool),
@@ -316,8 +316,8 @@ class SubversionWorkingCopyTestCase(unit
                False,                 # keep_local
                pool)
     # cause dir_props_changed: ps testprop testval dir1/dir2
-    dir2_path = '%s/trunk/dir1/dir2' % self.path
-    wc.prop_set2('testprop', 'testval', dir2_path,
+    dir2_path = b'%s/trunk/dir1/dir2' % self.path
+    wc.prop_set2(b'testprop', b'testval', dir2_path,
                  wc.adm_probe_retrieve(self.wc,
                                        os.path.dirname(dir2_path), pool),
                  False,               # skip_checks
@@ -338,8 +338,8 @@ class SubversionWorkingCopyTestCase(unit
     def write_diff(path, left, right):
       options = svn.diff.file_options_create()
       diff = svn.diff.file_diff_2(left, right, options, pool)
-      original_header = modified_header = ''
-      encoding = 'utf8'
+      original_header = modified_header = b''
+      encoding = b'utf8'
       relative_to_dir = None
       bio = BytesIO()
       svn.diff.file_output_unified3(bio, diff,
@@ -347,7 +347,7 @@ class SubversionWorkingCopyTestCase(unit
                                     original_header, modified_header,
                                     encoding, relative_to_dir,
                                     options.show_c_function, pool)
-      got_diffs[path[len(self.path) + 1:]] = bio.getvalue().decode('UTF-8').splitlines()
+      got_diffs[path[len(self.path) + 1:]] = bio.getvalue().splitlines()
 
     # Diff callbacks that call props_changed and write_diff.
     contentstate = propstate = state = wc.notify_state_unknown
@@ -379,7 +379,7 @@ class SubversionWorkingCopyTestCase(unit
 
     # Setup wc diff editor.
     (editor, edit_baton) = wc.get_diff_editor4(
-      self.wc, '', diff_callbacks, depth,
+      self.wc, b'', diff_callbacks, depth,
       False,                    # ignore_ancestry
       False,                    # use_text_base
       False,                    # reverse_order
@@ -396,39 +396,39 @@ class SubversionWorkingCopyTestCase(unit
     (reporter, report_baton) = ra.do_diff3(
       ra_ctx,
       head,                     # versus_url revision
-      '',                       # diff_target
+      b'',                       # diff_target
       depth,
       False,                    # ignore_ancestry
       True,                     # text_deltas
       url,                      # versus_url
       editor, edit_baton, pool)
     # Report wc state (pretty plain).
-    reporter.set_path(report_baton, '', head, depth,
+    reporter.set_path(report_baton, b'', head, depth,
                       False,    # start_empty
                       None,     # lock_token
                       pool)
     reporter.finish_report(report_baton, pool)
 
     # Assert we got the right diff.
-    expected_prop_changes = [('trunk/dir1/dir2',
-                              'testprop', 'testval')]
+    expected_prop_changes = [(b'trunk/dir1/dir2',
+                              b'testprop', b'testval')]
     expected_diffs = {
-      'trunk/readme3':
-        ['--- ',
-         '+++ ',
-         '@@ -0,0 +1 @@',
-         '+hello'],
-      'trunk/README.txt':
-        ['--- ',
-         '+++ ',
-         '@@ -1 +1 @@',
-         '-A test.',
-         '+hello'],
-      'trunk/README2.txt':
-        ['--- ',
-         '+++ ',
-         '@@ -1 +0,0 @@',
-         '-A test.'],
+      b'trunk/readme3':
+        [b'--- ',
+         b'+++ ',
+         b'@@ -0,0 +1 @@',
+         b'+hello'],
+      b'trunk/README.txt':
+        [b'--- ',
+         b'+++ ',
+         b'@@ -1 +1 @@',
+         b'-A test.',
+         b'+hello'],
+      b'trunk/README2.txt':
+        [b'--- ',
+         b'+++ ',
+         b'@@ -1 +0,0 @@',
+         b'-A test.'],
       }
     self.assertEqual(got_prop_changes, expected_prop_changes)
     self.assertEqual(got_diffs, expected_diffs)

Modified: subversion/branches/swig-py3/subversion/bindings/swig/svn_client.i
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/svn_client.i?rev=1849784&r1=1849783&r2=1849784&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/svn_client.i (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/svn_client.i Thu Dec 27 03:42:52 2018
@@ -119,7 +119,7 @@
     ppitem = (svn_client_proplist_item_t **)(*$1)->elts;
     for (i = 0; i < nelts; ++i, ++ppitem) {
         PyObject *item = PyTuple_New(2);
-        PyObject *name = PyStr_FromStringAndSize((*ppitem)->node_name->data,
+        PyObject *name = PyBytes_FromStringAndSize((*ppitem)->node_name->data,
                                                     (*ppitem)->node_name->len);
         PyObject *hash = svn_swig_py_prophash_to_dict((*ppitem)->prop_hash);