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 2017/12/24 04:47:31 UTC
svn commit: r1819202 - in
/subversion/branches/swig-py3/subversion/bindings/swig: include/
python/libsvn_swig_py/ python/tests/ python/tests/trac/versioncontrol/tests/
Author: troycurtisjr
Date: Sun Dec 24 04:47:31 2017
New Revision: 1819202
URL: http://svn.apache.org/viewvc?rev=1819202&view=rev
Log:
On branch swig-py3: Fix additional Bytes versus String inconsistencies.
Be explicit about UTF-8 conversions between bytes and strings. All
swig unit tests now pass under both Python 2 and 3.
* subversion/bindings/swig/include/svn_types.swg
(typemap(argout) unsigned char digest[ANY], unsigned char *digest):
Treat checksum digest data correctly as bytes, not a string.
* subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
(write_handler_pyio): Create a compatibility definition, SVN_SWIG_BYTES_FMT, to
ensure raw file data is treated as bytes in Python 3 and string in Python2.
* subversion/bindings/swig/python/tests/delta.py,
subversion/bindings/swig/python/tests/ra.py,
subversion/bindings/swig/python/tests/repository.py,
subversion/bindings/swig/python/tests/utils.py,
subversion/bindings/swig/python/tests/wc.py,
subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py
(DeltaTestCase.testTxWindowHandler,
DeltaTestCase.testTxdeltaWindowT,
SubversionRepositoryAccessTestCase.test_get_file,
SubversionRepositoryTestCase.test_dump_fs2,
Temper.alloc_known_repo,
SubversionWorkingCopyTestCase.test_diff_editor4.write_diff,
SubversionRepositoryTestSetup.setUp):
Use BytesIO instead of StringIO to servce as a source of raw binary data.
(SubversionRepositoryTestCase.test_parse_fns3):
Open raw data file in binary mode.
(SubversionWorkingCopyTestCase.test_commit):
Explicity encode data being written to a file opened in binary mode and
decode binary data in the result from binascii.b2a_hex().
Modified:
subversion/branches/swig-py3/subversion/bindings/swig/include/svn_types.swg
subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/delta.py
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/ra.py
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/repository.py
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/trac/versioncontrol/tests/svn_fs.py
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/utils.py
subversion/branches/swig-py3/subversion/bindings/swig/python/tests/wc.py
Modified: subversion/branches/swig-py3/subversion/bindings/swig/include/svn_types.swg
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/include/svn_types.swg?rev=1819202&r1=1819201&r2=1819202&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/include/svn_types.swg (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/include/svn_types.swg Sun Dec 24 04:47:31 2017
@@ -1098,7 +1098,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se
#ifdef SWIGPYTHON
%typemap(argout) unsigned char digest[ANY]
{
- %append_output(PyStr_FromStringAndSize((const char *)$1, APR_MD5_DIGESTSIZE));
+ %append_output(PyBytes_FromStringAndSize((const char *)$1, APR_MD5_DIGESTSIZE));
}
#endif
@@ -1171,7 +1171,7 @@ svn_ ## TYPE ## _swig_rb_closed(VALUE se
if ($input == Py_None) {
$1 = NULL;
} else {
- $1 = (unsigned char *) PyStr_AsString($input);
+ $1 = (unsigned char *) PyBytes_AsString($input);
if ($1 == NULL) SWIG_fail;
}
}
Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c?rev=1819202&r1=1819201&r2=1819202&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/libsvn_swig_py/swigutil_py.c Sun Dec 24 04:47:31 2017
@@ -59,6 +59,15 @@
#undef PyLong_FromSize_t
#undef PyLong_AsLong
#undef PyInt_Check
+
+/* In Python 3 use the bytes format character for raw data */
+#define SVN_SWIG_BYTES_FMT "y"
+
+#else
+
+/* In Python 2 use the string format character for raw data */
+#define SVN_SWIG_BYTES_FMT "s"
+
#endif
#include <py3c.h>
@@ -2579,7 +2588,8 @@ write_handler_pyio(void *baton, const ch
{
svn_swig_py_acquire_py_lock();
if ((result = PyObject_CallMethod(py_io, (char *)"write",
- (char *)"s#", data, *len)) == NULL)
+ (char *) SVN_SWIG_BYTES_FMT "#",
+ data, *len)) == NULL)
{
err = callback_exception_error();
}
Modified: subversion/branches/swig-py3/subversion/bindings/swig/python/tests/delta.py
URL: http://svn.apache.org/viewvc/subversion/branches/swig-py3/subversion/bindings/swig/python/tests/delta.py?rev=1819202&r1=1819201&r2=1819202&view=diff
==============================================================================
--- subversion/branches/swig-py3/subversion/bindings/swig/python/tests/delta.py (original)
+++ subversion/branches/swig-py3/subversion/bindings/swig/python/tests/delta.py Sun Dec 24 04:47:31 2017
@@ -22,20 +22,15 @@ import unittest, setup_path
import svn.delta
import svn.core
from sys import version_info # For Python version check
-if version_info[0] >= 3:
- # Python >=3.0
- from io import StringIO
-else:
- # Python <3.0
- from cStringIO import StringIO
+from io import BytesIO
# Test case for svn.delta
class DeltaTestCase(unittest.TestCase):
def testTxWindowHandler(self):
"""Test tx_invoke_window_handler"""
- src_stream = StringIO("hello world")
- target_stream = StringIO("bye world")
+ src_stream = BytesIO("hello world".encode('UTF-8'))
+ target_stream = BytesIO("bye world".encode('UTF-8'))
# Invoke the window_handler using a helper function
window_handler, baton = \
@@ -49,8 +44,8 @@ class DeltaTestCase(unittest.TestCase):
def testTxdeltaWindowT(self):
"""Test the svn_txdelta_window_t wrapper."""
- a = StringIO("abc\ndef\n")
- b = StringIO("def\nghi\n")
+ a = BytesIO("abc\ndef\n".encode('UTF-8'))
+ b = BytesIO("def\nghi\n".encode('UTF-8'))
delta_stream = svn.delta.svn_txdelta(a, b)
window = svn.delta.svn_txdelta_next_window(delta_stream)
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=1819202&r1=1819201&r2=1819202&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 Sun Dec 24 04:47:31 2017
@@ -22,12 +22,7 @@ import unittest, setup_path
from svn import core, repos, fs, delta, ra
from sys import version_info # For Python version check
-if version_info[0] >= 3:
- # Python >=3.0
- from io import StringIO
-else:
- # Python <3.0
- from StringIO import StringIO
+from io import BytesIO
import utils
@@ -64,10 +59,10 @@ class SubversionRepositoryAccessTestCase
self.assertEqual(properties["svn:mime-type"], "text/plain")
# Test getting the contents of a file
- filestream = StringIO()
+ filestream = BytesIO()
rev, properties = ra.get_file(self.ra_ctx, "trunk/README2.txt",
fs_revnum, filestream)
- self.assertEqual("A test.\n", filestream.getvalue())
+ self.assertEqual("A test.\n", filestream.getvalue().decode('UTF-8'))
def test_get_repos_root(self):
root = ra.get_repos_root(self.ra_ctx)
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=1819202&r1=1819201&r2=1819202&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 Sun Dec 24 04:47:31 2017
@@ -20,12 +20,7 @@
#
import unittest, setup_path, os, sys
from sys import version_info # For Python version check
-if version_info[0] >= 3:
- # Python >=3.0
- from io import StringIO
-else:
- # Python <3.0
- from StringIO import StringIO
+from io import BytesIO
from svn import core, repos, fs, delta
from svn.core import SubversionException
import utils
@@ -130,14 +125,14 @@ class SubversionRepositoryTestCase(unitt
self.callback_calls += 1
return None
- dumpstream = StringIO()
- feedbackstream = StringIO()
+ dumpstream = BytesIO()
+ feedbackstream = BytesIO()
repos.dump_fs2(self.repos, dumpstream, feedbackstream, 0, self.rev, 0, 0,
is_cancelled)
# Check that we can dump stuff
- dump = dumpstream.getvalue()
- feedback = feedbackstream.getvalue()
+ 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)
self.assertEqual(feedback.count(expected_feedback), 1)
@@ -154,17 +149,17 @@ class SubversionRepositoryTestCase(unitt
self.assertRaises(ValueError, repos.dump_fs2,
self.repos, dumpstream, feedbackstream, 0, self.rev, 0, 0, None)
- dumpstream = StringIO()
- feedbackstream = StringIO()
+ dumpstream = BytesIO()
+ feedbackstream = BytesIO()
# 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()
+ feedback = feedbackstream.getvalue().decode('UTF-8')
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()
+ dump = dumpstream.getvalue().decode('UTF-8')
self.assertEqual(dump.count("Node-path: trunk/README.txt"), 2)
# Check that we can ignore both the dumpstream and the feedbackstream
@@ -182,7 +177,7 @@ class SubversionRepositoryTestCase(unitt
return None
dump_path = os.path.join(os.path.dirname(sys.argv[0]),
"trac/versioncontrol/tests/svnrepos.dump")
- stream = open(dump_path)
+ stream = open(dump_path, 'rb')
dsp = DumpStreamParser()
ptr, baton = repos.make_parse_fns3(dsp)
repos.parse_dumpstream3(stream, ptr, baton, False, is_cancelled)
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=1819202&r1=1819201&r2=1819202&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 Sun Dec 24 04:47:31 2017
@@ -53,7 +53,7 @@ import shutil
import sys
import tempfile
import unittest
-from io import StringIO
+from io import BytesIO
if sys.version_info[0] >= 3:
# Python >=3.0
@@ -94,7 +94,7 @@ class SubversionRepositoryTestSetup(Test
self.tearDown()
r = repos.svn_repos_create(REPOS_PATH, '', '', None, None)
- repos.svn_repos_load_fs2(r, dumpfile, StringIO(),
+ repos.svn_repos_load_fs2(r, dumpfile, BytesIO(),
repos.svn_repos_load_uuid_ignore, '',
0, 0, None)
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=1819202&r1=1819201&r2=1819202&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 Sun Dec 24 04:47:31 2017
@@ -20,13 +20,12 @@
#
import os.path, sys, tempfile
from svn import core, repos
+from io import BytesIO
try:
# Python >=3.0
- from io import StringIO
from urllib.request import pathname2url
except ImportError:
# Python <3.0
- from cStringIO import StringIO
from urllib import pathname2url
class Temper(object):
@@ -69,7 +68,7 @@ class Temper(object):
dump_path = os.path.join(os.path.dirname(sys.argv[0]), repo_id)
(handle, repo_path, repo_uri) = self.alloc_empty_repo(suffix=suffix)
with open(dump_path, 'rb') as dump_fp:
- repos.svn_repos_load_fs2(handle, dump_fp, StringIO(),
+ repos.svn_repos_load_fs2(handle, dump_fp, BytesIO(),
repos.load_uuid_default, None, False, False, None)
return (handle, repo_path, repo_uri)
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=1819202&r1=1819201&r2=1819202&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 Sun Dec 24 04:47:31 2017
@@ -19,12 +19,7 @@
#
#
from sys import version_info # For Python version check
-if version_info[0] >= 3:
- # Python >=3.0
- from io import StringIO
-else:
- # Python <3.0
- from cStringIO import StringIO
+from io import BytesIO
import unittest, os, tempfile, setup_path, binascii
import svn.diff
from svn import core, repos, wc, client
@@ -229,7 +224,7 @@ class SubversionWorkingCopyTestCase(unit
# exact contents even on Windows, and therefore the MD5 checksum.
readme_path = '%s/trunk/README.txt' % self.path
fp = open(readme_path, 'wb')
- fp.write('hello\n')
+ fp.write('hello\n'.encode('UTF-8'))
fp.close()
# Setup ra_ctx.
@@ -270,7 +265,7 @@ class SubversionWorkingCopyTestCase(unit
(commit_info,) = commit_info
# Assert the commit.
- self.assertEqual(binascii.b2a_hex(checksum),
+ self.assertEqual(binascii.b2a_hex(checksum).decode('UTF-8'),
'b1946ac92492d2347c6235b4d2611184')
self.assertEqual(commit_info.revision, 13)
@@ -346,13 +341,13 @@ class SubversionWorkingCopyTestCase(unit
original_header = modified_header = ''
encoding = 'utf8'
relative_to_dir = None
- sio = StringIO()
- svn.diff.file_output_unified3(sio, diff,
+ bio = BytesIO()
+ svn.diff.file_output_unified3(bio, diff,
left, right,
original_header, modified_header,
encoding, relative_to_dir,
options.show_c_function, pool)
- got_diffs[path[len(self.path) + 1:]] = sio.getvalue().splitlines()
+ got_diffs[path[len(self.path) + 1:]] = bio.getvalue().decode('UTF-8').splitlines()
# Diff callbacks that call props_changed and write_diff.
contentstate = propstate = state = wc.notify_state_unknown