Thank you to respond to me.
It seems svn_stream_readline() works as I expected, eol argment accept
bytes, and returns bytes. (the patch below contains fix for
svn_stream_write() which is incomplete in my previous patch)
On 11/22/18 9:57 AM, Daniel Shahaf wrote:
Yasuhito FUTATSUKI wrote on Thu, 22 Nov 2018 08:05 +0900:
Even with this patch, svn_stream_readline() doesn't work well.
It claims 2nd argment is not bytes object, and returns str object.
I think it is better that svn_stream_readlin() returns bytes too.
+1. That function should return bytes, and as no swig-py consumers are
written in py3 there are no compatibility concerns preventing us from
making it so.
Now ViewVC (un-official branch) works with swig-py on py3 :-)
(https://github.com/futatuki/viewvc/tree/python3_support_with_altsvn)
By the way, while I've read headers, I found some other APIs handle
'eol' argment, in svn_subst.h and svn_diff.h. I think some of them
might need to handle some argment as bytes, because str on py3 normalize
eol style.
diff --git a/subversion/bindings/swig/core.i b/subversion/bindings/swig/core.i
index be5434dc20..0af5faa4ee 100644
--- a/subversion/bindings/swig/core.i
+++ b/subversion/bindings/swig/core.i
@@ -444,9 +444,9 @@
*/
#ifdef SWIGPYTHON
%typemap(in) (const char *data, apr_size_t *len) ($*2_type temp) {
- if (!PyStr_Check($input)) {
+ if (!PyBytes_Check($input)) {
PyErr_SetString(PyExc_TypeError,
- "expecting a string for the buffer");
+ "expecting a bytes for the buffer");
SWIG_fail;
}
if (PyBytes_AsStringAndSize($input, &$1, &temp) == -1) {
@@ -488,6 +488,39 @@
}
#endif
+/* -----------------------------------------------------------------------
+ fix up the svn_stream_readline() eol argument
+*/
+#ifdef SWIGPYTHON
+%typemap(in) (const char *eol) {
+ if (!PyBytes_Check($input)) {
+ PyErr_SetString(PyExc_TypeError,
+ "expecting a bytes for the eol");
+ SWIG_fail;
+ }
+ $1 = PyBytes_AsString($input);
+}
+#endif
+
+/* -----------------------------------------------------------------------
+ fix up the svn_stream_readline() return value
+*/
+#ifdef SWIGPYTHON
+%typemap(argout) (svn_stringbuf_t **stringbuf, const char *eol) {
+ PyObject *s;
+ if (*$1 == NULL) {
+ Py_INCREF(Py_None);
+ s = Py_None;
+ }
+ else {
+ s = PyBytes_FromStringAndSize((*$1)->data, (*$1)->len);
+ if (s == NULL)
+ SWIG_fail;
+ }
+ %append_output(s);
+}
+#endif
+
/* -----------------------------------------------------------------------
auth parameter set/get
*/
--
Yasuhito FUTATSUKI