diff options
author | Jelmer Vernooij <jelmer@jelmer.uk> | 2017-07-19 23:45:34 +0000 |
---|---|---|
committer | Jelmer Vernooij <jelmer@jelmer.uk> | 2017-07-19 23:45:34 +0000 |
commit | 6b99d9ba1393b52f107eb6b20b5d4a113e23c0d9 (patch) | |
tree | 978d9f16590bcd046b08bffb858f9ba3fa3ec1b0 | |
parent | 22244ef78079b0756211dcb3c7574e11e0ee69ca (diff) | |
parent | a06e905cf3c29650eb14ee65ad68e98013318d13 (diff) |
New upstream version 0.10.1
-rw-r--r-- | MANIFEST.in | 4 | ||||
-rw-r--r-- | Makefile | 38 | ||||
-rw-r--r-- | NEWS | 10 | ||||
-rw-r--r-- | PKG-INFO | 4 | ||||
-rw-r--r-- | README.md | 65 | ||||
-rwxr-xr-x | bin/subvertpy-fast-export | 52 | ||||
-rw-r--r-- | man/subvertpy-fast-export.1 | 39 | ||||
-rwxr-xr-x | setup.py | 2 | ||||
-rw-r--r-- | subvertpy.cfg | 5 | ||||
-rw-r--r-- | subvertpy/__init__.py | 2 | ||||
-rw-r--r-- | subvertpy/_ra.c | 38 | ||||
-rw-r--r-- | subvertpy/client.c | 639 | ||||
-rw-r--r-- | subvertpy/editor.h | 12 | ||||
-rw-r--r-- | subvertpy/ra.h | 2 | ||||
-rw-r--r-- | subvertpy/repos.c | 11 | ||||
-rw-r--r-- | subvertpy/util.c | 6 | ||||
-rw-r--r-- | subvertpy/util.h | 84 | ||||
-rw-r--r-- | subvertpy/wc.c | 64 |
18 files changed, 628 insertions, 449 deletions
diff --git a/MANIFEST.in b/MANIFEST.in index 2a90e9c4..d7fcd217 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,7 @@ include subvertpy/*.c include subvertpy/*.h include AUTHORS COPYING INSTALL NEWS TODO include examples/*.py +include README.md +include Makefile +include subvertpy.cfg +include man/*.1 diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..bad12947 --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +PYTHON = python +FLAKE8 ?= flake8 +PYDOCTOR = pydoctor +PYDOCTOR_OPTIONS ?= +SETUP = $(PYTHON) setup.py +TESTRUNNER = unittest +DEBUGGER ?= +RUNTEST = PYTHONPATH=.:$(PYTHONPATH) $(DEBUGGER) $(PYTHON) -m $(TESTRUNNER) -v + +all: build build-inplace + +build:: + $(SETUP) build + +build-inplace:: + $(SETUP) build_ext --inplace + +install:: + $(SETUP) install + +check:: build-inplace + $(RUNTEST) $(TEST_OPTIONS) subvertpy.tests.test_suite + +gdb-check:: + $(MAKE) check DEBUGGER="gdb --args" + +check-one:: + $(MAKE) check TEST_OPTIONS=-f + +clean:: + $(SETUP) clean + rm -f subvertpy/*.so subvertpy/*.o subvertpy/*.pyc + +pydoctor: + $(PYDOCTOR) $(PYDOCTOR_OPTIONS) --introspect-c-modules -c subvertpy.cfg --make-html + +style: + $(FLAKE8) --exclude=build,.git,build-pypy,.tox @@ -1,4 +1,12 @@ -0.10.0 UNRELEASED +0.10.1 2017-07-19 + + BUG FIXES + + * Bundle Makefile and subvertpy.cfg. (Jelmer Vernooij) + + * Fix some endianness issues. (Jelmer Vernooij) + +0.10.0 2017-07-17 CHANGES @@ -1,12 +1,12 @@ Metadata-Version: 1.1 Name: subvertpy -Version: 0.10.0 +Version: 0.10.1 Summary: Alternative Python bindings for Subversion Home-page: https://jelmer.uk/subvertpy Author: Jelmer Vernooij Author-email: jelmer@jelmer.uk License: LGPLv2.1 or later -Download-URL: https://jelmer.uk/subvertpy/subvertpy-0.10.0.tar.gz +Download-URL: https://jelmer.uk/subvertpy/subvertpy-0.10.1.tar.gz Description: Alternative Python bindings for Subversion. The goal is to have complete, portable and "Pythonic" Python bindings. diff --git a/README.md b/README.md new file mode 100644 index 00000000..8ba3da59 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +[![Build Status](https://travis-ci.org/jelmer/subvertpy.png?branch=master)](https://travis-ci.org/jelmer/subvertpy) + +Subvertpy +========= + +Homepage: https://jelmer.uk/subvertpy/ + +Python bindings for the Subversion version control system that are aimed to be +complete, fast and feel native to Python programmers. + +Bindings are provided for the working copy, client, delta, remote access and +repository APIs. A hookable server side implementation of the custom Subversion +protocol (svn_ra) is also provided. + +Differences with similar packages +--------------------------------- +subvertpy covers more of the APIs than python-svn. It provides a more +"Pythonic" API than python-subversion, which wraps the Subversion C API pretty +much directly. Neither provide a hookable server-side. + +Dependencies +------------ +Subvertpy depends on Python 2.7 or 3.5, and Subversion 1.4 or later. It should +work on Windows as well as most POSIX-based platforms (including Linux, BSDs +and Mac OS X). + +Installation +------------ +Standard distutils are used - use "setup.py build" to build and "setup.install" +to install. On most platforms, setup will find the Python and Subversion +development libraries by itself. On Windows you may have to set various +environment variables, see the next section for details. + +Build instructions for Windows +============================== + +* Install the SVN dev kit ZIP for Windows from + http://sourceforge.net/projects/win32svn/files/ + E.g. svn-win32-1.4.6_dev.zip +* Find the SVN binary ZIP file with the binaries for your dev kit. + E.g. svn-win32-1.4.6.zip + Unzip this in the *same directory* as the dev kit - README.txt will be + overwritten, but that is all. This is the default location the .ZIP file + will suggest (ie, the directory embedded in both .zip files are the same) +* Set SVN_DEV to point at this directory. +* Install BDB. + For Subversion 1.7.0 and later: + http://www.oracle.com/technetwork/database/berkeleydb/downloads/index-082944.html + download Berkeley DB 4.8.30.msi Windows installer and install it. + For Subversion 1.6.17 and earlier: + http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=688 + download "db-4.4.20-win32.zip" or earlier version of BDB and extract it. +* Set SVN_BDB to the installed directory or extracted directory. +* Install SVN libintl. + http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=2627 + Download svn-win32-libintl.zip. + extract it to the directory that you want. +* Set SVN_LIBINTL to the extract dir. + +Development +----------- +If using GCC it might be useful to disable the deprecation warnings when +compiling to see if there are any more serious warnings: + +make CFLAGS="-Wno-deprecated-declarations" diff --git a/bin/subvertpy-fast-export b/bin/subvertpy-fast-export index 913168cf..374c59fe 100755 --- a/bin/subvertpy-fast-export +++ b/bin/subvertpy-fast-export @@ -10,22 +10,24 @@ # # Adapted for subvertpy by Jelmer Vernooij <jelmer@samba.org> -trunk_path = '/trunk/' -branches_path = '/branches/' -tags_path = '/tags/' -address = 'localhost' - from io import BytesIO -import sys, os.path +import sys +import os.path from optparse import OptionParser import stat from time import mktime, strptime from subvertpy.repos import PATH_CHANGE_DELETE, Repository +trunk_path = '/trunk/' +branches_path = '/branches/' +tags_path = '/tags/' +address = 'localhost' + ct_short = ['M', 'A', 'D', 'R', 'X'] stdout = getattr(sys.stdout, 'buffer', sys.stdout) + def dump_file_blob(root, stream, stream_length): stdout.write(("data %s\n" % stream_length).encode("ascii")) stdout.flush() @@ -189,28 +191,38 @@ if __name__ == '__main__': dest='final_rev', metavar='FINAL_REV', type='int') parser.add_option('-r', '--first-rev', help='First revision to import', dest='first_rev', metavar='FIRST_REV', type='int') - parser.add_option('-t', '--trunk-path', help="Path in repo to /trunk, may be `regex:/cvs/(trunk)/proj1/(.*)`\nFirst group is used as branchname, second to match files", - dest='trunk_path', metavar='TRUNK_PATH') - parser.add_option('-b', '--branches-path', help='Path in repo to /branches', - dest='branches_path', metavar='BRANCHES_PATH') - parser.add_option('-T', '--tags-path', help='Path in repo to /tags', - dest='tags_path', metavar='TAGS_PATH') - parser.add_option('-a', '--address', help='Domain to put on users for their mail address', - dest='address', metavar='hostname', type='string') - parser.add_option("--version", help="Print version and exit", action="store_true") + parser.add_option( + '-t', '--trunk-path', + help=( + "Path in repo to /trunk, may be `regex:/cvs/(trunk)/proj1/(.*)`\n" + "First group is used as branchname, second to match files"), + dest='trunk_path', metavar='TRUNK_PATH') + parser.add_option( + '-b', '--branches-path', help='Path in repo to /branches', + dest='branches_path', metavar='BRANCHES_PATH') + parser.add_option( + '-T', '--tags-path', help='Path in repo to /tags', + dest='tags_path', metavar='TAGS_PATH') + parser.add_option( + '-a', '--address', + help='Domain to put on users for their mail address', + dest='address', metavar='hostname', type='string') + parser.add_option( + "--version", help="Print version and exit", + action="store_true") (options, args) = parser.parse_args() if options.version: import subvertpy - print ".".join(str(x) for x in subvertpy.__version__) + print(".".join(str(x) for x in subvertpy.__version__)) sys.exit(0) - if options.trunk_path != None: + if options.trunk_path is not None: trunk_path = options.trunk_path - if options.branches_path != None: + if options.branches_path is not None: branches_path = options.branches_path - if options.tags_path != None: + if options.tags_path is not None: tags_path = options.tags_path - if options.address != None: + if options.address is not None: address = options.address MATCHER = Matcher.getMatcher(trunk_path) diff --git a/man/subvertpy-fast-export.1 b/man/subvertpy-fast-export.1 new file mode 100644 index 00000000..8a4308bd --- /dev/null +++ b/man/subvertpy-fast-export.1 @@ -0,0 +1,39 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.38.2. +.TH SUBVERTPY-FAST-EXPORT "1" "October 2010" "subvertpy-fast-export" "subvertpy" +.SH NAME +subvertpy-fast-export \- generate fastexport stream from a Subversion repository +.SH DESCRIPTION +Generate fastexport stream from a Subversion repository. +.SH SYNOPSIS +.B subvertpy-fast-export +[\fIoptions\fR] \fIREPOS_PATH\fR +.SH OPTIONS +.TP +\fB\-h\fR, \fB\-\-help\fR +show a help message and exit +.TP +\fB\-f\fR FINAL_REV, \fB\-\-final\-rev\fR=\fIFINAL_REV\fR +Final revision to import +.TP +\fB\-r\fR FIRST_REV, \fB\-\-first\-rev\fR=\fIFIRST_REV\fR +First revision to import +.TP +\fB\-t\fR TRUNK_PATH, \fB\-\-trunk\-path\fR=\fITRUNK_PATH\fR +Path in repo to /trunk, may be +`regex:/cvs/(trunk)/proj1/(.*)` First group is used as +branchname, second to match files +.TP +\fB\-b\fR BRANCHES_PATH, \fB\-\-branches\-path\fR=\fIBRANCHES_PATH\fR +Path in repo to /branches +.TP +\fB\-T\fR TAGS_PATH, \fB\-\-tags\-path\fR=\fITAGS_PATH\fR +Path in repo to /tags +.TP +\fB\-a\fR hostname, \fB\-\-address\fR=\fIhostname\fR +Domain to put on users for their mail address +.TP +\fB\-\-version\fR +Print version and exit +.SH "SEE ALSO" +.UR https://jelmer.uk/subvertpy/ +.BR https://jelmer.uk/subvertpy/ @@ -412,7 +412,7 @@ def subvertpy_modules(): ] -subvertpy_version = (0, 10, 0) +subvertpy_version = (0, 10, 1) subvertpy_version_string = ".".join(map(str, subvertpy_version)) diff --git a/subvertpy.cfg b/subvertpy.cfg new file mode 100644 index 00000000..7886c024 --- /dev/null +++ b/subvertpy.cfg @@ -0,0 +1,5 @@ +packages: subvertpy +docformat: restructuredtext +projectname: subvertpy +projecturl: https://jelmer.uk/subvertpy/ +htmloutput: apidocs diff --git a/subvertpy/__init__.py b/subvertpy/__init__.py index 592fb2e0..6b0762de 100644 --- a/subvertpy/__init__.py +++ b/subvertpy/__init__.py @@ -17,7 +17,7 @@ """Python bindings for Subversion.""" __author__ = "Jelmer Vernooij <jelmer@jelmer.uk>" -__version__ = (0, 10, 0) +__version__ = (0, 10, 1) NODE_DIR = 2 NODE_FILE = 1 diff --git a/subvertpy/_ra.c b/subvertpy/_ra.c index 37763b67..4c14131a 100644 --- a/subvertpy/_ra.c +++ b/subvertpy/_ra.c @@ -100,7 +100,7 @@ static svn_error_t *py_lock_func (void *baton, const char *path, int do_lock, Py_INCREF(py_ra_err); } py_lock = pyify_lock(lock); - ret = PyObject_CallFunction((PyObject *)baton, "zbOO", path, do_lock, + ret = PyObject_CallFunction((PyObject *)baton, "zbOO", path, do_lock?true:false, py_lock, py_ra_err); Py_DECREF(py_lock); Py_DECREF(py_ra_err); @@ -390,7 +390,7 @@ static svn_error_t *py_file_rev_handler(void *baton, const char *path, svn_revnu py_rev_props = prop_hash_to_dict(rev_props); CB_CHECK_PYRETVAL(py_rev_props); - ret = PyObject_CallFunction(fn, "slOb", path, rev, py_rev_props, result_of_merge); + ret = PyObject_CallFunction(fn, "slOi", path, rev, py_rev_props, result_of_merge); Py_DECREF(py_rev_props); CB_CHECK_PYRETVAL(ret); @@ -940,7 +940,7 @@ static PyObject *ra_do_update(PyObject *self, PyObject *args) apr_pool_t *temp_pool, *result_pool; ReporterObject *ret; RemoteAccessObject *ra = (RemoteAccessObject *)self; - svn_boolean_t send_copyfrom_args = FALSE; + bool send_copyfrom_args = false; if (!PyArg_ParseTuple(args, "lsbO|bb:do_update", &revision_to_update_to, &update_target, &recurse, &update_editor, &send_copyfrom_args, &ignore_ancestry)) @@ -1981,7 +1981,7 @@ fail_busy: #if ONLY_SINCE_SVN(1, 5) static PyObject *range_to_tuple(svn_merge_range_t *range) { - return Py_BuildValue("(llb)", range->start, range->end, range->inheritable); + return Py_BuildValue("(llb)", range->start, range->end, range->inheritable?true:false); } static PyObject *merge_rangelist_to_list(apr_array_header_t *rangelist) @@ -2059,7 +2059,7 @@ static PyObject *ra_mergeinfo(PyObject *self, PyObject *args) svn_revnum_t revision = -1; PyObject *paths; svn_mergeinfo_inheritance_t inherit = svn_mergeinfo_explicit; - svn_boolean_t include_descendants; + bool include_descendants; if (!PyArg_ParseTuple(args, "O|lib:mergeinfo", &paths, &revision, &inherit, &include_descendants)) return NULL; @@ -2175,7 +2175,7 @@ static PyObject *ra_get_file_revs(PyObject *self, PyObject *args) PyObject *file_rev_handler; apr_pool_t *temp_pool; RemoteAccessObject *ra = (RemoteAccessObject *)self; - svn_boolean_t include_merged_revisions = FALSE; + bool include_merged_revisions = false; if (!PyArg_ParseTuple(args, "sllO|b:get_file_revs", &path, &start, &end, &file_rev_handler, &include_merged_revisions)) @@ -2623,19 +2623,19 @@ static PyObject *credentials_iter_next(CredentialsIterObject *iterator) if (!strcmp(iterator->cred_kind, SVN_AUTH_CRED_SIMPLE)) { svn_auth_cred_simple_t *simple = iterator->credentials; - ret = Py_BuildValue("(zzb)", simple->username, simple->password, simple->may_save); + ret = Py_BuildValue("(zzb)", simple->username, simple->password, simple->may_save?true:false); } else if (!strcmp(iterator->cred_kind, SVN_AUTH_CRED_USERNAME)) { svn_auth_cred_username_t *uname = iterator->credentials; - ret = Py_BuildValue("(zb)", uname->username, uname->may_save); + ret = Py_BuildValue("(zb)", uname->username, uname->may_save?true:false); } else if (!strcmp(iterator->cred_kind, SVN_AUTH_CRED_SSL_CLIENT_CERT)) { svn_auth_cred_ssl_client_cert_t *ccert = iterator->credentials; - ret = Py_BuildValue("(zb)", ccert->cert_file, ccert->may_save); + ret = Py_BuildValue("(zb)", ccert->cert_file, ccert->may_save?true:false); } else if (!strcmp(iterator->cred_kind, SVN_AUTH_CRED_SSL_CLIENT_CERT_PW)) { svn_auth_cred_ssl_client_cert_pw_t *ccert = iterator->credentials; - ret = Py_BuildValue("(zb)", ccert->password, ccert->may_save); + ret = Py_BuildValue("(zb)", ccert->password, ccert->may_save?true:false); } else if (!strcmp(iterator->cred_kind, SVN_AUTH_CRED_SSL_SERVER_TRUST)) { svn_auth_cred_ssl_server_trust_t *ccert = iterator->credentials; - ret = Py_BuildValue("(ib)", ccert->accepted_failures, ccert->may_save); + ret = Py_BuildValue("(ib)", ccert->accepted_failures, ccert->may_save?true:false); } else { PyErr_Format(PyExc_RuntimeError, "Unknown cred kind %s", iterator->cred_kind); return NULL; @@ -2762,7 +2762,7 @@ static svn_error_t *py_username_prompt(svn_auth_cred_username_t **cred, void *ba PyObject *py_username, *py_may_save; char *username; PyGILState_STATE state = PyGILState_Ensure(); - ret = PyObject_CallFunction(fn, "sb", realm, may_save); + ret = PyObject_CallFunction(fn, "si", realm, may_save); CB_CHECK_PYRETVAL(ret); if (ret == Py_None) { @@ -2834,7 +2834,7 @@ static svn_error_t *py_simple_prompt(svn_auth_cred_simple_t **cred, void *baton, PyObject *py_may_save, *py_username, *py_password; char *ret_username, *password; PyGILState_STATE state = PyGILState_Ensure(); - ret = PyObject_CallFunction(fn, "ssb", realm, username, may_save); + ret = PyObject_CallFunction(fn, "ssi", realm, username, may_save); CB_CHECK_PYRETVAL(ret); if (!PyTuple_Check(ret)) { PyErr_SetString(PyExc_TypeError, "expected tuple with simple credentials"); @@ -2919,7 +2919,7 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t CB_CHECK_PYRETVAL(py_cert); - ret = PyObject_CallFunction(fn, "slOb", realm, failures, py_cert, may_save); + ret = PyObject_CallFunction(fn, "slOi", realm, failures, py_cert, may_save); Py_DECREF(py_cert); CB_CHECK_PYRETVAL(ret); @@ -2929,7 +2929,7 @@ static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t return NULL; } - if (!PyArg_ParseTuple(ret, "ib", &accepted_failures, &may_save)) { + if (!PyArg_ParseTuple(ret, "ii", &accepted_failures, &may_save)) { Py_DECREF(ret); PyGILState_Release(state); return py_svn_error(); @@ -2968,9 +2968,9 @@ static svn_error_t *py_ssl_client_cert_pw_prompt(svn_auth_cred_ssl_client_cert_p { PyObject *fn = (PyObject *)baton, *ret, *py_password; PyGILState_STATE state = PyGILState_Ensure(); - ret = PyObject_CallFunction(fn, "sb", realm, may_save); + ret = PyObject_CallFunction(fn, "si", realm, may_save); CB_CHECK_PYRETVAL(ret); - if (!PyArg_ParseTuple(ret, "Ob", &py_password, &may_save)) { + if (!PyArg_ParseTuple(ret, "Oi", &py_password, &may_save)) { goto fail; } @@ -2995,7 +2995,7 @@ static svn_error_t *py_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t ** PyObject *fn = (PyObject *)baton, *ret, *py_may_save, *py_cert_file; PyGILState_STATE state = PyGILState_Ensure(); char *cert_file; - ret = PyObject_CallFunction(fn, "sb", realm, may_save); + ret = PyObject_CallFunction(fn, "si", realm, may_save); CB_CHECK_PYRETVAL(ret); if (!PyTuple_Check(ret)) { @@ -3108,7 +3108,7 @@ static svn_error_t *py_cb_get_simple_provider_prompt(svn_boolean_t *may_save_pla PyGILState_Release(state); return py_svn_error(); } - *may_save_plaintext = PyObject_IsTrue(ret); + *may_save_plaintext = PyObject_IsTrue(ret)?TRUE:FALSE; Py_DECREF(ret); PyGILState_Release(state); } diff --git a/subvertpy/client.c b/subvertpy/client.c index cbc5b580..04b9ae57 100644 --- a/subvertpy/client.c +++ b/subvertpy/client.c @@ -75,96 +75,96 @@ static int client_set_config(PyObject *self, PyObject *auth, void *closure); static bool client_check_path(const char *path, apr_pool_t *scratch_pool) { - return svn_path_is_canonical(path, scratch_pool); + return svn_path_is_canonical(path, scratch_pool); } static bool client_path_list_to_apr_array(apr_pool_t *pool, PyObject *l, apr_array_header_t **ret) { - int i; - const char *path; - if (l == Py_None) { - *ret = NULL; - return true; - } - if (PyUnicode_Check(l) || PyBytes_Check(l)) { - *ret = apr_array_make(pool, 1, sizeof(char *)); - path = py_object_to_svn_string(l, pool); - if (path == NULL) { - return false; - } - if (!client_check_path(path, pool)) { - PyErr_SetString(PyExc_ValueError, "Expected canonical path or URL"); - return false; - } - APR_ARRAY_PUSH(*ret, const char *) = path; - } else if (PyList_Check(l)) { - *ret = apr_array_make(pool, PyList_Size(l), sizeof(char *)); - for (i = 0; i < PyList_GET_SIZE(l); i++) { - PyObject *item = PyList_GET_ITEM(l, i); - path = py_object_to_svn_string(item, pool); - if (!client_check_path(path, pool)) { - PyErr_SetString(PyExc_ValueError, "Expected canonical path or URL"); - return false; - } - APR_ARRAY_PUSH(*ret, const char *) = path; - } - } else { - PyErr_Format(PyExc_TypeError, "Expected list of strings, got: %s", - l->ob_type->tp_name); - return false; - } + int i; + const char *path; + if (l == Py_None) { + *ret = NULL; + return true; + } + if (PyUnicode_Check(l) || PyBytes_Check(l)) { + *ret = apr_array_make(pool, 1, sizeof(char *)); + path = py_object_to_svn_string(l, pool); + if (path == NULL) { + return false; + } + if (!client_check_path(path, pool)) { + PyErr_SetString(PyExc_ValueError, "Expected canonical path or URL"); + return false; + } + APR_ARRAY_PUSH(*ret, const char *) = path; + } else if (PyList_Check(l)) { + *ret = apr_array_make(pool, PyList_Size(l), sizeof(char *)); + for (i = 0; i < PyList_GET_SIZE(l); i++) { + PyObject *item = PyList_GET_ITEM(l, i); + path = py_object_to_svn_string(item, pool); + if (!client_check_path(path, pool)) { + PyErr_SetString(PyExc_ValueError, "Expected canonical path or URL"); + return false; + } + APR_ARRAY_PUSH(*ret, const char *) = path; + } + } else { + PyErr_Format(PyExc_TypeError, "Expected list of strings, got: %s", + l->ob_type->tp_name); + return false; + } - return true; + return true; } static bool to_opt_revision(PyObject *arg, svn_opt_revision_t *ret) { - if (PyLong_Check(arg)) { - ret->kind = svn_opt_revision_number; - ret->value.number = PyLong_AsLong(arg); - if (ret->value.number == -1 && PyErr_Occurred()) { - return false; - } - return true; + if (PyLong_Check(arg)) { + ret->kind = svn_opt_revision_number; + ret->value.number = PyLong_AsLong(arg); + if (ret->value.number == -1 && PyErr_Occurred()) { + return false; + } + return true; #if PY_MAJOR_VERSION < 3 - } else if (PyInt_Check(arg)) { - ret->kind = svn_opt_revision_number; - ret->value.number = PyInt_AsLong(arg); - if (ret->value.number == -1 && PyErr_Occurred()) { - return false; - } - return true; + } else if (PyInt_Check(arg)) { + ret->kind = svn_opt_revision_number; + ret->value.number = PyInt_AsLong(arg); + if (ret->value.number == -1 && PyErr_Occurred()) { + return false; + } + return true; #endif - } else if (arg == Py_None) { - ret->kind = svn_opt_revision_unspecified; - return true; - } else if (PyUnicode_Check(arg) || PyBytes_Check(arg)) { - char *text; - if (PyUnicode_Check(arg)) { - arg = PyUnicode_AsUTF8String(arg); - } else { - Py_INCREF(arg); - } + } else if (arg == Py_None) { + ret->kind = svn_opt_revision_unspecified; + return true; + } else if (PyUnicode_Check(arg) || PyBytes_Check(arg)) { + char *text; + if (PyUnicode_Check(arg)) { + arg = PyUnicode_AsUTF8String(arg); + } else { + Py_INCREF(arg); + } - text = PyBytes_AsString(arg); - if (!strcmp(text, "HEAD")) { - ret->kind = svn_opt_revision_head; - Py_DECREF(arg); - return true; - } else if (!strcmp(text, "WORKING")) { - ret->kind = svn_opt_revision_working; - Py_DECREF(arg); - return true; - } else if (!strcmp(text, "BASE")) { - ret->kind = svn_opt_revision_base; - Py_DECREF(arg); - return true; - } - Py_DECREF(arg); - } + text = PyBytes_AsString(arg); + if (!strcmp(text, "HEAD")) { + ret->kind = svn_opt_revision_head; + Py_DECREF(arg); + return true; + } else if (!strcmp(text, "WORKING")) { + ret->kind = svn_opt_revision_working; + Py_DECREF(arg); + return true; + } else if (!strcmp(text, "BASE")) { + ret->kind = svn_opt_revision_base; + Py_DECREF(arg); + return true; + } + Py_DECREF(arg); + } - PyErr_SetString(PyExc_ValueError, "Unable to parse revision"); - return false; + PyErr_SetString(PyExc_ValueError, "Unable to parse revision"); + return false; } static PyObject *wrap_py_commit_items(const apr_array_header_t *commit_items) @@ -215,68 +215,67 @@ static PyObject *wrap_py_commit_items(const apr_array_header_t *commit_items) } #if ONLY_SINCE_SVN(1, 8) -static svn_error_t *proplist_receiver2(void *prop_list, const char *path, - apr_hash_t *prop_hash, - apr_array_header_t *inherited_props, - apr_pool_t *scratch_pool) +static svn_error_t *proplist_receiver2( + void *prop_list, const char *path, apr_hash_t *prop_hash, + apr_array_header_t *inherited_props, apr_pool_t *scratch_pool) { - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *prop_dict; - PyObject *value; + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *prop_dict; + PyObject *value; - prop_dict = prop_hash_to_dict(prop_hash); + prop_dict = prop_hash_to_dict(prop_hash); - if (prop_dict == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + if (prop_dict == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - value = Py_BuildValue("(sO)", path, prop_dict); - if (value == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + value = Py_BuildValue("(sO)", path, prop_dict); + if (value == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - /* TODO(jelmer): Convert inherited_props */ + /* TODO(jelmer): Convert inherited_props */ - if (PyList_Append(prop_list, value) != 0) { - PyGILState_Release(state); - return py_svn_error(); - } + if (PyList_Append(prop_list, value) != 0) { + PyGILState_Release(state); + return py_svn_error(); + } - PyGILState_Release(state); + PyGILState_Release(state); - return NULL; + return NULL; } #elif ONLY_SINCE_SVN(1, 5) static svn_error_t *proplist_receiver(void *prop_list, const char *path, apr_hash_t *prop_hash, apr_pool_t *pool) { - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *prop_dict; - PyObject *value; + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *prop_dict; + PyObject *value; - prop_dict = prop_hash_to_dict(prop_hash); + prop_dict = prop_hash_to_dict(prop_hash); - if (prop_dict == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + if (prop_dict == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - value = Py_BuildValue("(sO)", path, prop_dict); - if (value == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + value = Py_BuildValue("(sO)", path, prop_dict); + if (value == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - if (PyList_Append(prop_list, value) != 0) { - PyGILState_Release(state); - return py_svn_error(); - } + if (PyList_Append(prop_list, value) != 0) { + PyGILState_Release(state); + return py_svn_error(); + } - PyGILState_Release(state); + PyGILState_Release(state); - return NULL; + return NULL; } #endif @@ -288,30 +287,30 @@ static svn_error_t *list_receiver2(void *dict, const char *path, const char *external_target, apr_pool_t *pool) { - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *value; + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *value; - value = py_dirent(dirent, SVN_DIRENT_ALL); - if (value == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + value = py_dirent(dirent, SVN_DIRENT_ALL); + if (value == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - if (external_parent_url != NULL || external_target != NULL) { - value = Py_BuildValue("(Nzz)", value, external_parent_url, external_target); - } + if (external_parent_url != NULL || external_target != NULL) { + value = Py_BuildValue("(Nzz)", value, external_parent_url, external_target); + } - if (PyDict_SetItemString(dict, path, value) != 0) { - Py_DECREF(value); - PyGILState_Release(state); - return py_svn_error(); - } + if (PyDict_SetItemString(dict, path, value) != 0) { + Py_DECREF(value); + PyGILState_Release(state); + return py_svn_error(); + } - Py_DECREF(value); + Py_DECREF(value); - PyGILState_Release(state); + PyGILState_Release(state); - return NULL; + return NULL; } #else static svn_error_t *list_receiver(void *dict, const char *path, @@ -319,26 +318,26 @@ static svn_error_t *list_receiver(void *dict, const char *path, const svn_lock_t *lock, const char *abs_path, apr_pool_t *pool) { - PyGILState_STATE state = PyGILState_Ensure(); - PyObject *value; + PyGILState_STATE state = PyGILState_Ensure(); + PyObject *value; - value = py_dirent(dirent, SVN_DIRENT_ALL); - if (value == NULL) { - PyGILState_Release(state); - return py_svn_error(); - } + value = py_dirent(dirent, SVN_DIRENT_ALL); + if (value == NULL) { + PyGILState_Release(state); + return py_svn_error(); + } - if (PyDict_SetItemString(dict, path, value) != 0) { - Py_DECREF(value); - PyGILState_Release(state); - return py_svn_error(); - } + if (PyDict_SetItemString(dict, path, value) != 0) { + Py_DECREF(value); + PyGILState_Release(state); + return py_svn_error(); + } - Py_DECREF(value); + Py_DECREF(value); - PyGILState_Release(state); + PyGILState_Release(state); - return NULL; + return NULL; } #endif @@ -448,63 +447,63 @@ static PyObject *py_commit_info_tuple(svn_commit_info_t *ci) } typedef struct { - PyObject_VAR_HEAD - svn_client_ctx_t *client; - apr_pool_t *pool; - PyObject *callbacks; - PyObject *py_auth; - PyObject *py_config; + PyObject_VAR_HEAD + svn_client_ctx_t *client; + apr_pool_t *pool; + PyObject *callbacks; + PyObject *py_auth; + PyObject *py_config; } ClientObject; static PyObject *client_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) { - ClientObject *ret; - PyObject *config = Py_None, *auth = Py_None, *log_msg_func = Py_None; - char *kwnames[] = { "config", "auth", "log_msg_func", NULL }; - svn_error_t *err; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOO", kwnames, - &config, &auth, &log_msg_func)) - return NULL; + ClientObject *ret; + PyObject *config = Py_None, *auth = Py_None, *log_msg_func = Py_None; + char *kwnames[] = { "config", "auth", "log_msg_func", NULL }; + svn_error_t *err; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOO", kwnames, + &config, &auth, &log_msg_func)) + return NULL; - ret = PyObject_New(ClientObject, &Client_Type); - if (ret == NULL) - return NULL; + ret = PyObject_New(ClientObject, &Client_Type); + if (ret == NULL) + return NULL; - ret->pool = Pool(NULL); - if (ret->pool == NULL) { - Py_DECREF(ret); - return NULL; - } + ret->pool = Pool(NULL); + if (ret->pool == NULL) { + Py_DECREF(ret); + return NULL; + } #if ONLY_SINCE_SVN(1, 8) - err = svn_client_create_context2(&ret->client, NULL, ret->pool); + err = svn_client_create_context2(&ret->client, NULL, ret->pool); #else - err = svn_client_create_context(&ret->client, ret->pool); + err = svn_client_create_context(&ret->client, ret->pool); #endif - if (err != NULL) { - handle_svn_error(err); - svn_error_clear(err); - apr_pool_destroy(ret->pool); - PyObject_Del(ret); - return NULL; - } + if (err != NULL) { + handle_svn_error(err); + svn_error_clear(err); + apr_pool_destroy(ret->pool); + PyObject_Del(ret); + return NULL; + } - ret->py_auth = NULL; - ret->py_config = NULL; - ret->client->notify_func2 = NULL; - ret->client->notify_baton2 = NULL; - ret->client->cancel_func = py_cancel_check; - ret->client->cancel_baton = NULL; - if (log_msg_func != Py_None) { - ret->client->log_msg_func2 = py_log_msg_func2; - } else { - ret->client->log_msg_func2 = NULL; - } - Py_INCREF(log_msg_func); - ret->client->log_msg_baton2 = (void *)log_msg_func; - client_set_config((PyObject *)ret, config, NULL); - client_set_auth((PyObject *)ret, auth, NULL); - return (PyObject *)ret; + ret->py_auth = NULL; + ret->py_config = NULL; + ret->client->notify_func2 = NULL; + ret->client->notify_baton2 = NULL; + ret->client->cancel_func = py_cancel_check; + ret->client->cancel_baton = NULL; + if (log_msg_func != Py_None) { + ret->client->log_msg_func2 = py_log_msg_func2; + } else { + ret->client->log_msg_func2 = NULL; + } + Py_INCREF(log_msg_func); + ret->client->log_msg_baton2 = (void *)log_msg_func; + client_set_config((PyObject *)ret, config, NULL); + client_set_auth((PyObject *)ret, auth, NULL); + return (PyObject *)ret; } static void client_dealloc(PyObject *self) @@ -556,20 +555,20 @@ static PyObject *client_get_notify_func(PyObject *self, void *closure) static int client_set_notify_func(PyObject *self, PyObject *func, void *closure) { - ClientObject *client = (ClientObject *)self; + ClientObject *client = (ClientObject *)self; - if (client->client->notify_baton2 != NULL) { - Py_DECREF((PyObject *)client->client->notify_baton2); - } - if (func == Py_None) { - client->client->notify_func2 = NULL; - client->client->notify_baton2 = Py_None; - } else { - client->client->notify_func2 = py_wc_notify_func; - client->client->notify_baton2 = (void *)func; - } - Py_INCREF(func); - return 0; + if (client->client->notify_baton2 != NULL) { + Py_DECREF((PyObject *)client->client->notify_baton2); + } + if (func == Py_None) { + client->client->notify_func2 = NULL; + client->client->notify_baton2 = Py_None; + } else { + client->client->notify_func2 = py_wc_notify_func; + client->client->notify_baton2 = (void *)func; + } + Py_INCREF(func); + return 0; } static int client_set_auth(PyObject *self, PyObject *auth, void *closure) @@ -601,31 +600,30 @@ static int client_set_auth(PyObject *self, PyObject *auth, void *closure) static int client_set_config(PyObject *self, PyObject *config, void *closure) { - ClientObject *client = (ClientObject *)self; + ClientObject *client = (ClientObject *)self; - Py_XDECREF(client->py_config); + Py_XDECREF(client->py_config); - client->client->config = config_hash_from_object(config, client->pool); + client->client->config = config_hash_from_object(config, client->pool); - if (client->client->config == NULL) { - client->py_config = NULL; - return -1; - } + if (client->client->config == NULL) { + client->py_config = NULL; + return -1; + } - client->py_config = config; - Py_INCREF(config); + client->py_config = config; + Py_INCREF(config); - return 0; + return 0; } - static PyObject *client_add(PyObject *self, PyObject *args, PyObject *kwargs) { char *path; ClientObject *client = (ClientObject *)self; bool recursive=true, force=false, no_ignore=false; bool add_parents = false; - bool no_autoprops = false; + bool no_autoprops = false; apr_pool_t *temp_pool; char *kwnames[] = { "path", "recursive", "force", "no_ignore", "add_parents", "no_autoprops", NULL }; @@ -643,11 +641,11 @@ static PyObject *client_add(PyObject *self, PyObject *args, PyObject *kwargs) #endif #if ONLY_BEFORE_SVN(1, 8) - if (no_autoprops) { - PyErr_SetString(PyExc_NotImplementedError, - "Subversion < 1.8 does not support no_autoprops"); - return NULL; - } + if (no_autoprops) { + PyErr_SetString(PyExc_NotImplementedError, + "Subversion < 1.8 does not support no_autoprops"); + return NULL; + } #endif temp_pool = Pool(NULL); @@ -682,37 +680,44 @@ static PyObject *client_checkout(PyObject *self, PyObject *args, PyObject *kwarg char *kwnames[] = { "url", "path", "rev", "peg_rev", "recurse", "ignore_externals", "allow_unver_obstructions", NULL }; svn_revnum_t result_rev; svn_opt_revision_t c_peg_rev, c_rev; - const char *path; - const char *url; - PyObject *py_url = NULL, *py_path; - apr_pool_t *temp_pool; - PyObject *peg_rev=Py_None, *rev=Py_None; - bool recurse=true, ignore_externals=false, allow_unver_obstructions=false; + const char *path; + const char *url; + PyObject *py_url = NULL, *py_path; + apr_pool_t *temp_pool; + PyObject *peg_rev=Py_None, *rev=Py_None; + bool recurse=true, ignore_externals=false, allow_unver_obstructions=false; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|OObbb", kwnames, &py_url, &py_path, &rev, &peg_rev, &recurse, &ignore_externals, &allow_unver_obstructions)) - return NULL; + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OO|OObbb", kwnames, + &py_url, &py_path, &rev, &peg_rev, + &recurse, &ignore_externals, + &allow_unver_obstructions)) { + return NULL; + } - if (!to_opt_revision(peg_rev, &c_peg_rev)) - return NULL; - if (!to_opt_revision(rev, &c_rev)) - return NULL; + if (!to_opt_revision(peg_rev, &c_peg_rev)) { + return NULL; + } - temp_pool = Pool(NULL); - if (temp_pool == NULL) { - return NULL; - } + if (!to_opt_revision(rev, &c_rev)) { + return NULL; + } - url = py_object_to_svn_uri(py_url, temp_pool); - if (url == NULL) { - apr_pool_destroy(temp_pool); - return NULL; - } + temp_pool = Pool(NULL); + if (temp_pool == NULL) { + return NULL; + } - path = py_object_to_svn_dirent(py_path, temp_pool); - if (path == NULL) { - apr_pool_destroy(temp_pool); - return NULL; - } + url = py_object_to_svn_uri(py_url, temp_pool); + if (url == NULL) { + apr_pool_destroy(temp_pool); + return NULL; + } + + path = py_object_to_svn_dirent(py_path, temp_pool); + if (path == NULL) { + apr_pool_destroy(temp_pool); + return NULL; + } #if ONLY_SINCE_SVN(1, 5) RUN_SVN_WITH_POOL(temp_pool, svn_client_checkout3(&result_rev, url, @@ -720,14 +725,14 @@ static PyObject *client_checkout(PyObject *self, PyObject *args, PyObject *kwarg &c_peg_rev, &c_rev, recurse?svn_depth_infinity:svn_depth_files, ignore_externals, allow_unver_obstructions, client->client, temp_pool)); #else - if (allow_unver_obstructions) { - PyErr_SetString(PyExc_NotImplementedError, + if (allow_unver_obstructions) { + PyErr_SetString(PyExc_NotImplementedError, "allow_unver_obstructions not supported when built against svn<1.5"); - apr_pool_destroy(temp_pool); - return NULL; - } + apr_pool_destroy(temp_pool); + return NULL; + } - RUN_SVN_WITH_POOL(temp_pool, svn_client_checkout2(&result_rev, url, + RUN_SVN_WITH_POOL(temp_pool, svn_client_checkout2(&result_rev, url, path, &c_peg_rev, &c_rev, recurse, ignore_externals, client->client, temp_pool)); @@ -738,52 +743,52 @@ static PyObject *client_checkout(PyObject *self, PyObject *args, PyObject *kwarg static PyObject *client_commit(PyObject *self, PyObject *args, PyObject *kwargs) { - PyObject *targets; - ClientObject *client = (ClientObject *)self; - bool recurse=true, keep_locks=true; - apr_pool_t *temp_pool; - svn_commit_info_t *commit_info = NULL; - PyObject *ret; - apr_array_header_t *apr_targets; - PyObject *revprops = Py_None; - char *kwnames[] = { "targets", "recurse", "keep_locks", "revprops", NULL }; + PyObject *targets; + ClientObject *client = (ClientObject *)self; + bool recurse=true, keep_locks=true; + apr_pool_t *temp_pool; + svn_commit_info_t *commit_info = NULL; + PyObject *ret; + apr_array_header_t *apr_targets; + PyObject *revprops = Py_None; + char *kwnames[] = { "targets", "recurse", "keep_locks", "revprops", NULL }; #if ONLY_SINCE_SVN(1, 5) - apr_hash_t *hash_revprops; + apr_hash_t *hash_revprops; #endif - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|bbO", kwnames, &targets, &recurse, &keep_locks, &revprops)) - return NULL; - temp_pool = Pool(NULL); - if (temp_pool == NULL) { - return NULL; - } - if (!client_path_list_to_apr_array(temp_pool, targets, &apr_targets)) { - apr_pool_destroy(temp_pool); - return NULL; - } + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|bbO", kwnames, &targets, &recurse, &keep_locks, &revprops)) + return NULL; + temp_pool = Pool(NULL); + if (temp_pool == NULL) { + return NULL; + } + if (!client_path_list_to_apr_array(temp_pool, targets, &apr_targets)) { + apr_pool_destroy(temp_pool); + return NULL; + } - if (revprops != Py_None && !PyDict_Check(revprops)) { - apr_pool_destroy(temp_pool); - PyErr_SetString(PyExc_TypeError, "Expected dictionary with revision properties"); - return NULL; - } + if (revprops != Py_None && !PyDict_Check(revprops)) { + apr_pool_destroy(temp_pool); + PyErr_SetString(PyExc_TypeError, "Expected dictionary with revision properties"); + return NULL; + } #if ONLY_SINCE_SVN(1, 5) - if (revprops != Py_None) { - hash_revprops = prop_dict_to_hash(temp_pool, revprops); - if (hash_revprops == NULL) { - apr_pool_destroy(temp_pool); - return NULL; - } - } else { - hash_revprops = NULL; - } + if (revprops != Py_None) { + hash_revprops = prop_dict_to_hash(temp_pool, revprops); + if (hash_revprops == NULL) { + apr_pool_destroy(temp_pool); + return NULL; + } + } else { + hash_revprops = NULL; + } - /* FIXME: Support keep_changelist and changelists */ - RUN_SVN_WITH_POOL(temp_pool, svn_client_commit4(&commit_info, - apr_targets, recurse?svn_depth_infinity:svn_depth_files, - keep_locks, false, NULL, hash_revprops, - client->client, temp_pool)); + /* FIXME: Support keep_changelist and changelists */ + RUN_SVN_WITH_POOL(temp_pool, svn_client_commit4(&commit_info, + apr_targets, recurse?svn_depth_infinity:svn_depth_files, + keep_locks, false, NULL, hash_revprops, + client->client, temp_pool)); #else if (revprops != Py_None && PyDict_Size(revprops) > 0) { PyErr_SetString(PyExc_NotImplementedError, @@ -986,7 +991,7 @@ static PyObject *client_delete(PyObject *self, PyObject *args) static PyObject *client_mkdir(PyObject *self, PyObject *args) { PyObject *paths, *revprops = NULL; - svn_boolean_t make_parents=FALSE; + bool make_parents = false; apr_pool_t *temp_pool; svn_commit_info_t *commit_info = NULL; PyObject *ret; @@ -1024,7 +1029,7 @@ static PyObject *client_mkdir(PyObject *self, PyObject *args) RUN_SVN_WITH_POOL(temp_pool, svn_client_mkdir3(&commit_info, apr_paths, - make_parents, hash_revprops, client->client, temp_pool)); + make_parents?TRUE:FALSE, hash_revprops, client->client, temp_pool)); #else if (make_parents) { PyErr_SetString(PyExc_ValueError, @@ -1410,8 +1415,8 @@ static PyObject *client_update(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *ret; int i = 0; ClientObject *client = (ClientObject *)self; - svn_boolean_t allow_unver_obstructions = FALSE, - depth_is_sticky = FALSE; + bool allow_unver_obstructions = false, + depth_is_sticky = false; char *kwnames[] = { "path", "revision", "recurse", "ignore_externals", "depth_is_sticky", "allow_unver_obstructions", NULL }; @@ -1433,7 +1438,7 @@ static PyObject *client_update(PyObject *self, PyObject *args, PyObject *kwargs) #if ONLY_SINCE_SVN(1, 5) RUN_SVN_WITH_POOL(temp_pool, svn_client_update3(&result_revs, apr_paths, &c_rev, recurse?svn_depth_infinity:svn_depth_files, - depth_is_sticky, ignore_externals, allow_unver_obstructions, + depth_is_sticky?TRUE:FALSE, ignore_externals, allow_unver_obstructions?TRUE:FALSE, client->client, temp_pool)); #else RUN_SVN_WITH_POOL(temp_pool, svn_client_update2(&result_revs, @@ -1653,8 +1658,8 @@ static PyObject *client_log(PyObject *self, PyObject *args, PyObject *kwargs) PyObject *callback, *paths, *start_rev = Py_None, *end_rev = Py_None, *peg_revision = Py_None, *revprops = NULL; int limit = 0; - svn_boolean_t discover_changed_paths = FALSE, strict_node_history = FALSE, - include_merged_revisions = FALSE; + bool discover_changed_paths = false, strict_node_history = false, + include_merged_revisions = false; apr_array_header_t *apr_paths, *apr_revprops = NULL; svn_opt_revision_t c_peg_rev, c_start_rev, c_end_rev; #if ONLY_SINCE_SVN(1, 6) @@ -1719,24 +1724,24 @@ static PyObject *client_log(PyObject *self, PyObject *args, PyObject *kwargs) APR_ARRAY_PUSH(revision_ranges, svn_opt_revision_range_t *) = &revision_range; RUN_SVN_WITH_POOL(temp_pool, svn_client_log5(apr_paths, &c_peg_rev, - revision_ranges, limit, discover_changed_paths, - strict_node_history, include_merged_revisions, apr_revprops, + revision_ranges, limit, discover_changed_paths?TRUE:FALSE, + strict_node_history?TRUE:FALSE, include_merged_revisions?TRUE:FALSE, apr_revprops, py_svn_log_entry_receiver, (void*)callback, client->client, temp_pool)); #elif ONLY_SINCE_SVN(1, 5) RUN_SVN_WITH_POOL(temp_pool, svn_client_log4(apr_paths, &c_peg_rev, - &c_start_rev, &c_end_rev, limit, discover_changed_paths, - strict_node_history, include_merged_revisions, apr_revprops, + &c_start_rev, &c_end_rev, limit, discover_changed_paths?TRUE:FALSE, + strict_node_history?TRUE:FALSE, include_merged_revisions?TRUE:FALSE, apr_revprops, py_svn_log_entry_receiver, (void*)callback, client->client, temp_pool)); #elif ONLY_SINCE_SVN(1, 4) RUN_SVN_WITH_POOL(temp_pool, svn_client_log3(apr_paths, &c_peg_rev, - &c_start_rev, &c_end_rev, limit, discover_changed_paths, - strict_node_history, py_svn_log_wrapper, + &c_start_rev, &c_end_rev, limit, discover_changed_paths?TRUE:FALSE, + strict_node_history?TRUE:FALSE, py_svn_log_wrapper, (void*)callback, client->client, temp_pool)); #else RUN_SVN_WITH_POOL(temp_pool, svn_client_log2(apr_paths, &c_start_rev, - &c_end_rev, limit, discover_changed_paths, strict_node_history, + &c_end_rev, limit, discover_changed_paths?TRUE:FALSE, strict_node_history?TRUE:FALSE, py_svn_log_wrapper, (void*)callback, client->client, temp_pool)); #endif @@ -1757,7 +1762,7 @@ static PyObject *client_info(PyObject *self, PyObject *args, PyObject *kwargs) const char *path; int depth = svn_depth_empty; - svn_boolean_t fetch_excluded = FALSE, fetch_actual_only = FALSE; + bool fetch_excluded = false, fetch_actual_only = false; PyObject *revision = Py_None, *peg_revision = Py_None; svn_opt_revision_t c_peg_rev, c_rev; PyObject *entry_dict; @@ -1798,8 +1803,8 @@ static PyObject *client_info(PyObject *self, PyObject *args, PyObject *kwargs) Py_BEGIN_ALLOW_THREADS; #if ONLY_SINCE_SVN(1, 7) /* FIXME: Support changelists */ - err = svn_client_info3(path, &c_peg_rev, &c_rev, depth, fetch_excluded, - fetch_actual_only, NULL, + err = svn_client_info3(path, &c_peg_rev, &c_rev, depth, fetch_excluded?TRUE:FALSE, + fetch_actual_only?TRUE:FALSE, NULL, info_receiver, entry_dict, client->client, temp_pool); diff --git a/subvertpy/editor.h b/subvertpy/editor.h index 88f72dd1..a6407910 100644 --- a/subvertpy/editor.h +++ b/subvertpy/editor.h @@ -29,7 +29,11 @@ extern PyTypeObject FileEditor_Type; extern PyTypeObject Editor_Type; extern PyTypeObject TxDeltaWindowHandler_Type; struct EditorObject; -PyObject *new_editor_object(struct EditorObject *parent, const svn_delta_editor_t *editor, void *baton, apr_pool_t *pool, PyTypeObject *type, void (*done_cb) (void *baton), void *done_baton, PyObject *commit_callback); +PyObject *new_editor_object( + struct EditorObject *parent, const + svn_delta_editor_t *editor, void *baton, apr_pool_t + *pool, PyTypeObject *type, void (*done_cb) (void *baton), + void *done_baton, PyObject *commit_callback); #define DirectoryEditor_Check(op) PyObject_TypeCheck(op, &DirectoryEditor_Type) #define FileEditor_Check(op) PyObject_TypeCheck(op, &FileEditor_Type) @@ -37,9 +41,9 @@ PyObject *new_editor_object(struct EditorObject *parent, const svn_delta_editor_ #define TxDeltaWindowHandler_Check(op) PyObject_TypeCheck(op, &TxDeltaWindowHandler_Type) typedef struct { - PyObject_HEAD - svn_txdelta_window_handler_t txdelta_handler; - void *txdelta_baton; + PyObject_HEAD + svn_txdelta_window_handler_t txdelta_handler; + void *txdelta_baton; } TxDeltaWindowHandlerObject; svn_error_t *py_txdelta_window_handler(svn_txdelta_window_t *window, void *baton); diff --git a/subvertpy/ra.h b/subvertpy/ra.h index 4a148c67..9919459b 100644 --- a/subvertpy/ra.h +++ b/subvertpy/ra.h @@ -21,7 +21,7 @@ #define _BZR_SVN_RA_H_ typedef struct { - PyObject_HEAD + PyObject_HEAD svn_auth_baton_t *auth_baton; apr_pool_t *pool; PyObject *providers; diff --git a/subvertpy/repos.c b/subvertpy/repos.c index e54cbfbf..e6a41c15 100644 --- a/subvertpy/repos.c +++ b/subvertpy/repos.c @@ -386,7 +386,7 @@ static PyObject *repos_delete(PyObject *self, PyObject *args) static PyObject *repos_hotcopy(RepositoryObject *self, PyObject *args) { char *src_path, *dest_path; - svn_boolean_t clean_logs = FALSE; + bool clean_logs = false; apr_pool_t *temp_pool; if (!PyArg_ParseTuple(args, "ss|b", &src_path, &dest_path, &clean_logs)) @@ -397,7 +397,7 @@ static PyObject *repos_hotcopy(RepositoryObject *self, PyObject *args) return NULL; RUN_SVN_WITH_POOL(temp_pool, - svn_repos_hotcopy(src_path, dest_path, clean_logs, temp_pool)); + svn_repos_hotcopy(src_path, dest_path, clean_logs?TRUE:FALSE, temp_pool)); apr_pool_destroy(temp_pool); @@ -807,7 +807,7 @@ static PyObject *fs_node_file_proplist(FileSystemRootObject *self, PyObject *arg static PyObject *fs_root_file_checksum(FileSystemRootObject *self, PyObject *args) { apr_pool_t *temp_pool; - svn_boolean_t force = FALSE; + bool force = false; char *path; #if ONLY_SINCE_SVN(1, 6) svn_checksum_kind_t kind; @@ -826,9 +826,8 @@ static PyObject *fs_root_file_checksum(FileSystemRootObject *self, PyObject *arg if (temp_pool == NULL) return NULL; #if ONLY_SINCE_SVN(1, 6) - RUN_SVN_WITH_POOL(temp_pool, svn_fs_file_checksum(&checksum, kind, - self->root, - path, force, temp_pool)); + RUN_SVN_WITH_POOL(temp_pool, svn_fs_file_checksum( + &checksum, kind, self->root, path, force?TRUE:FALSE, temp_pool)); cstr = svn_checksum_to_cstring(checksum, temp_pool); if (cstr == NULL) { ret = Py_None; diff --git a/subvertpy/util.c b/subvertpy/util.c index 4e9a1ea4..49c68899 100644 --- a/subvertpy/util.c +++ b/subvertpy/util.c @@ -958,7 +958,7 @@ static PyObject *stream_init(PyTypeObject *type, PyObject *args, PyObject *kwarg if (ret->pool == NULL) return NULL; ret->stream = svn_stream_empty(ret->pool); - ret->closed = FALSE; + ret->closed = false; return (PyObject *)ret; } @@ -967,7 +967,7 @@ static PyObject *stream_close(StreamObject *self) { if (!self->closed) { svn_stream_close(self->stream); - self->closed = TRUE; + self->closed = true; } Py_RETURN_NONE; } @@ -1032,7 +1032,7 @@ static PyObject *stream_read_full(StreamObject *self, PyObject *args) self->stream, temp_pool, temp_pool)); - self->closed = TRUE; + self->closed = true; ret = PyBytes_FromStringAndSize(result->data, result->len); apr_pool_destroy(temp_pool); return ret; diff --git a/subvertpy/util.h b/subvertpy/util.h index cf4a42f0..bbbcf9b3 100644 --- a/subvertpy/util.h +++ b/subvertpy/util.h @@ -45,39 +45,38 @@ bool string_list_to_apr_array(apr_pool_t *pool, PyObject *l, apr_array_header_t bool relpath_list_to_apr_array(apr_pool_t *pool, PyObject *l, apr_array_header_t **); PyObject *prop_hash_to_dict(apr_hash_t *props); apr_hash_t *prop_dict_to_hash(apr_pool_t *pool, PyObject *py_props); -svn_error_t *py_svn_log_wrapper(void *baton, apr_hash_t *changed_paths, - long revision, const char *author, - const char *date, const char *message, - apr_pool_t *pool); +svn_error_t *py_svn_log_wrapper( + void *baton, apr_hash_t *changed_paths, long revision, const char *author, + const char *date, const char *message, apr_pool_t *pool); svn_error_t *py_svn_error(void); void PyErr_SetSubversionException(svn_error_t *error); PyTypeObject *PyErr_GetSubversionExceptionTypeObject(void); #define RUN_SVN(cmd) { \ - svn_error_t *err; \ - PyThreadState *_save; \ - _save = PyEval_SaveThread(); \ - err = (cmd); \ - PyEval_RestoreThread(_save); \ - if (err != NULL) { \ - handle_svn_error(err); \ - svn_error_clear(err); \ - return NULL; \ - } \ + svn_error_t *err; \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); \ + err = (cmd); \ + PyEval_RestoreThread(_save); \ + if (err != NULL) { \ + handle_svn_error(err); \ + svn_error_clear(err); \ + return NULL; \ + } \ } #define RUN_SVN_WITH_POOL(pool, cmd) { \ - svn_error_t *err; \ - PyThreadState *_save; \ - _save = PyEval_SaveThread(); \ - err = (cmd); \ - PyEval_RestoreThread(_save); \ - if (err != NULL) { \ - handle_svn_error(err); \ - svn_error_clear(err); \ - apr_pool_destroy(pool); \ - return NULL; \ - } \ + svn_error_t *err; \ + PyThreadState *_save; \ + _save = PyEval_SaveThread(); \ + err = (cmd); \ + PyEval_RestoreThread(_save); \ + if (err != NULL) { \ + handle_svn_error(err); \ + svn_error_clear(err); \ + apr_pool_destroy(pool); \ + return NULL; \ + } \ } PyObject *wrap_lock(svn_lock_t *lock); @@ -89,9 +88,10 @@ void PyErr_SetAprStatus(apr_status_t status); PyObject *py_dirent(const svn_dirent_t *dirent, int dirent_fields); PyObject *PyOS_tmpfile(void); PyObject *pyify_changed_paths(apr_hash_t *changed_paths, bool node_kind, apr_pool_t *pool); -bool pyify_log_message(apr_hash_t *changed_paths, const char *author, - const char *date, const char *message, bool node_kind, - apr_pool_t *pool, PyObject **py_changed_paths, PyObject **revprops); +bool pyify_log_message( + apr_hash_t *changed_paths, const char *author, + const char *date, const char *message, bool node_kind, + apr_pool_t *pool, PyObject **py_changed_paths, PyObject **revprops); #if ONLY_SINCE_SVN(1, 6) PyObject *pyify_changed_paths2(apr_hash_t *changed_paths2, apr_pool_t *pool); #endif @@ -106,19 +106,19 @@ svn_error_t *py_svn_log_entry_receiver(void *baton, svn_log_entry_t *log_entry, #endif #define CB_CHECK_PYRETVAL(ret) \ - if (ret == NULL) { \ - PyGILState_Release(state); \ - return py_svn_error(); \ - } + if (ret == NULL) { \ + PyGILState_Release(state); \ + return py_svn_error(); \ + } #if SVN_VER_MINOR < 5 typedef enum svn_depth_t { - svn_depth_unknown = -2, - svn_depth_exclude = -1, - svn_depth_empty = 0, - svn_depth_files = 1, - svn_depth_immediates = 2, - svn_depth_infinity = 3 + svn_depth_unknown = -2, + svn_depth_exclude = -1, + svn_depth_empty = 0, + svn_depth_files = 1, + svn_depth_immediates = 2, + svn_depth_infinity = 3 } svn_depth_t; #endif @@ -129,10 +129,10 @@ typedef struct { } ConfigObject; typedef struct { - PyObject_HEAD - svn_stream_t *stream; - apr_pool_t *pool; - svn_boolean_t closed; + PyObject_HEAD + svn_stream_t *stream; + apr_pool_t *pool; + bool closed; } StreamObject; extern PyTypeObject Stream_Type; diff --git a/subvertpy/wc.c b/subvertpy/wc.c index 704ff28c..7a635b25 100644 --- a/subvertpy/wc.c +++ b/subvertpy/wc.c @@ -1074,8 +1074,8 @@ static PyObject *adm_crawl_revisions(PyObject *self, PyObject *args, PyObject *k apr_pool_t *temp_pool; AdmObject *admobj = (AdmObject *)self; svn_wc_traversal_info_t *traversal_info; - svn_boolean_t depth_compatibility_trick = FALSE; - svn_boolean_t honor_depth_exclude = FALSE; + bool depth_compatibility_trick = false; + bool honor_depth_exclude = false; char *kwnames[] = { "path", "reporter", "restore_files", "recurse", "use_commit_times", "notify_func", "depth_compatibility_trick", "honor_depth_exclude,", NULL }; PyObject *py_path; @@ -1101,8 +1101,8 @@ static PyObject *adm_crawl_revisions(PyObject *self, PyObject *args, PyObject *k RUN_SVN_WITH_POOL(temp_pool, svn_wc_crawl_revisions4(path, admobj->adm, &py_ra_reporter, (void *)reporter, restore_files, recurse?svn_depth_infinity:svn_depth_files, - honor_depth_exclude, - depth_compatibility_trick, use_commit_times, + honor_depth_exclude?TRUE:FALSE, + depth_compatibility_trick?TRUE:FALSE, use_commit_times, py_wc_notify_func, (void *)notify_func, traversal_info, temp_pool)); #elif ONLY_SINCE_SVN(1, 5) @@ -1143,8 +1143,8 @@ static PyObject *adm_get_update_editor(PyObject *self, PyObject *args) apr_pool_t *pool; svn_revnum_t *latest_revnum; svn_error_t *err; - svn_boolean_t allow_unver_obstructions = FALSE; - svn_boolean_t depth_is_sticky = FALSE; + bool allow_unver_obstructions = false; + bool depth_is_sticky = false; if (!PyArg_ParseTuple(args, "s|bbOzbb", &target, &use_commit_times, &recurse, ¬ify_func, &diff3_cmd, &depth_is_sticky, @@ -1164,7 +1164,7 @@ static PyObject *adm_get_update_editor(PyObject *self, PyObject *args) /* FIXME: Support conflict func */ err = svn_wc_get_update_editor3(latest_revnum, admobj->adm, target, use_commit_times, recurse?svn_depth_infinity:svn_depth_files, - depth_is_sticky, allow_unver_obstructions, + depth_is_sticky?TRUE:FALSE, allow_unver_obstructions?TRUE:FALSE, py_wc_notify_func, (void *)notify_func, py_cancel_check, NULL, NULL, NULL, NULL, NULL, @@ -1283,7 +1283,7 @@ static PyObject *adm_process_committed(PyObject *self, PyObject *args, PyObject AdmObject *admobj = (AdmObject *)self; apr_pool_t *temp_pool; int digest_len; - svn_boolean_t remove_changelist = FALSE; + bool remove_changelist = false; char *kwnames[] = { "path", "recurse", "new_revnum", "rev_date", "rev_author", "wcprop_changes", "remove_lock", "digest", "remove_changelist", NULL }; @@ -1317,7 +1317,7 @@ static PyObject *adm_process_committed(PyObject *self, PyObject *args, PyObject RUN_SVN_WITH_POOL(temp_pool, svn_wc_process_committed4( path, admobj->adm, recurse, new_revnum, rev_date, rev_author, wcprop_changes, - remove_lock, remove_changelist, digest, temp_pool)); + remove_lock, remove_changelist?TRUE:FALSE, digest, temp_pool)); #else if (remove_changelist) { PyErr_SetString(PyExc_NotImplementedError, "remove_changelist only supported in svn < 1.6"); @@ -1540,7 +1540,7 @@ static PyObject *mark_missing_deleted(PyObject *self, PyObject *args) static PyObject *remove_from_revision_control(PyObject *self, PyObject *args) { char *name; - svn_boolean_t destroy_wf = FALSE, instant_error = FALSE; + bool destroy_wf = false, instant_error = false; AdmObject *admobj = (AdmObject *)self; apr_pool_t *temp_pool; @@ -1555,7 +1555,7 @@ static PyObject *remove_from_revision_control(PyObject *self, PyObject *args) RUN_SVN_WITH_POOL(temp_pool, svn_wc_remove_from_revision_control(admobj->adm, name, - destroy_wf, instant_error, py_cancel_check, NULL, temp_pool)); + destroy_wf?TRUE:FALSE, instant_error?TRUE:FALSE, py_cancel_check, NULL, temp_pool)); apr_pool_destroy(temp_pool); @@ -1609,7 +1609,7 @@ static PyObject *relocate(PyObject *self, PyObject *args) char *from, *to; AdmObject *admobj = (AdmObject *)self; apr_pool_t *temp_pool; - svn_boolean_t recurse = TRUE; + bool recurse = true; PyObject *py_validator = Py_None, *py_path; if (!PyArg_ParseTuple(args, "Oss|bO:relocate", &py_path, &from, &to, &recurse, @@ -1630,9 +1630,9 @@ static PyObject *relocate(PyObject *self, PyObject *args) } #if ONLY_SINCE_SVN(1, 6) - RUN_SVN_WITH_POOL(temp_pool, svn_wc_relocate3(path, admobj->adm, from, to, recurse, wc_validator3, py_validator, temp_pool)); + RUN_SVN_WITH_POOL(temp_pool, svn_wc_relocate3(path, admobj->adm, from, to, recurse?TRUE:FALSE, wc_validator3, py_validator, temp_pool)); #else - RUN_SVN_WITH_POOL(temp_pool, svn_wc_relocate2(path, admobj->adm, from, to, recurse, wc_validator2, py_validator, temp_pool)); + RUN_SVN_WITH_POOL(temp_pool, svn_wc_relocate2(path, admobj->adm, from, to, recurse?TRUE:FALSE, wc_validator2, py_validator, temp_pool)); #endif apr_pool_destroy(temp_pool); @@ -1714,7 +1714,7 @@ static PyObject *translated_stream(PyObject *self, PyObject *args) static PyObject *adm_text_modified(PyObject *self, PyObject *args) { const char *path; - svn_boolean_t force_comparison = FALSE; + bool force_comparison = false; apr_pool_t *temp_pool; svn_boolean_t ret; AdmObject *admobj = (AdmObject *)self; @@ -1737,7 +1737,7 @@ static PyObject *adm_text_modified(PyObject *self, PyObject *args) } RUN_SVN_WITH_POOL(temp_pool, - svn_wc_text_modified_p(&ret, path, force_comparison, admobj->adm, + svn_wc_text_modified_p(&ret, path, force_comparison?TRUE:FALSE, admobj->adm, temp_pool)); apr_pool_destroy(temp_pool); @@ -1883,7 +1883,7 @@ static PyObject *transmit_text_deltas(PyObject *self, PyObject *args) { const char *path; const char *tempfile; - svn_boolean_t fulltext; + bool fulltext; PyObject *editor_obj, *py_digest, *py_path; unsigned char digest[APR_MD5_DIGESTSIZE]; apr_pool_t *temp_pool; @@ -1910,7 +1910,7 @@ static PyObject *transmit_text_deltas(PyObject *self, PyObject *args) RUN_SVN_WITH_POOL(temp_pool, svn_wc_transmit_text_deltas2(&tempfile, digest, - path, admobj->adm, fulltext, + path, admobj->adm, fulltext?TRUE:FALSE, &py_editor, editor_obj, temp_pool)); py_digest = PyBytes_FromStringAndSize((char *)digest, APR_MD5_DIGESTSIZE); @@ -2046,7 +2046,7 @@ static PyObject *probe_try(PyObject *self, PyObject *args) AdmObject *admobj = (AdmObject *)self, *ret; apr_pool_t *pool; int levels_to_lock = -1; - svn_boolean_t writelock = FALSE; + bool writelock = false; PyObject *py_path; if (!PyArg_ParseTuple(args, "O|bi", &py_path, &writelock, &levels_to_lock)) @@ -2088,7 +2088,7 @@ static PyObject *resolved_conflict(PyObject *self, PyObject *args) { AdmObject *admobj = (AdmObject *)self; apr_pool_t *temp_pool; - svn_boolean_t resolve_props, resolve_tree, resolve_text; + bool resolve_props, resolve_tree, resolve_text; int depth; #if ONLY_SINCE_SVN(1, 5) svn_wc_conflict_choice_t conflict_choice; @@ -2119,8 +2119,8 @@ static PyObject *resolved_conflict(PyObject *self, PyObject *args) #if ONLY_SINCE_SVN(1, 6) RUN_SVN_WITH_POOL(temp_pool, - svn_wc_resolved_conflict4(path, admobj->adm, resolve_text, - resolve_props, resolve_tree, depth, + svn_wc_resolved_conflict4(path, admobj->adm, resolve_text?TRUE:FALSE, + resolve_props?TRUE:FALSE, resolve_tree?TRUE:FALSE, depth, conflict_choice, py_wc_notify_func, (void *)notify_func, py_cancel_check, NULL, temp_pool)); @@ -2132,8 +2132,8 @@ static PyObject *resolved_conflict(PyObject *self, PyObject *args) return NULL; } else { RUN_SVN_WITH_POOL(temp_pool, - svn_wc_resolved_conflict3(path, admobj->adm, resolve_text, - resolve_props, depth, + svn_wc_resolved_conflict3(path, admobj->adm, resolve_text?TRUE:FALSE, + resolve_props?TRUE:FALSE, depth, conflict_choice, py_wc_notify_func, (void *)notify_func, py_cancel_check, NULL, temp_pool)); @@ -2156,8 +2156,8 @@ static PyObject *resolved_conflict(PyObject *self, PyObject *args) return NULL; } else { RUN_SVN_WITH_POOL(temp_pool, - svn_wc_resolved_conflict2(path, admobj->adm, resolve_text, - resolve_props, + svn_wc_resolved_conflict2(path, admobj->adm, resolve_text?TRUE:FALSE, + resolve_props?TRUE:FALSE, (depth == svn_depth_infinity), py_wc_notify_func, (void *)notify_func, py_cancel_check, @@ -2431,9 +2431,9 @@ static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *arg char *path; AdmObject *admobj; PyObject *py_wcprop_changes = Py_None; - svn_boolean_t remove_lock = FALSE, remove_changelist = FALSE; + bool remove_lock = false, remove_changelist = false; char *md5_digest = NULL, *sha1_digest = NULL; - svn_boolean_t recurse = FALSE; + bool recurse = false; apr_pool_t *temp_pool; apr_array_header_t *wcprop_changes; int md5_digest_len, sha1_digest_len; @@ -2501,14 +2501,14 @@ static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *arg svn_checksum_p = NULL; } RUN_SVN_WITH_POOL(temp_pool, - svn_wc_queue_committed2(self->queue, path, admobj->adm, recurse, - wcprop_changes, remove_lock, remove_changelist, + svn_wc_queue_committed2(self->queue, path, admobj->adm, recurse?TRUE:FALSE, + wcprop_changes, remove_lock?TRUE:FALSE, remove_changelist?TRUE:FALSE, svn_checksum_p, temp_pool)); } #else RUN_SVN_WITH_POOL(temp_pool, - svn_wc_queue_committed(&self->queue, path, admobj->adm, recurse, - wcprop_changes, remove_lock, remove_changelist, + svn_wc_queue_committed(&self->queue, path, admobj->adm, recurse?TRUE:FALSE, + wcprop_changes, remove_lock?TRUE:FALSE, remove_changelist?TRUE:FALSE, (unsigned char *)md5_digest, temp_pool)); #endif |