diff options
author | Jelmer Vernooij <jelmer@jelmer.uk> | 2016-07-24 20:41:30 +0000 |
---|---|---|
committer | Jelmer Vernooij <jelmer@jelmer.uk> | 2016-07-24 20:41:30 +0000 |
commit | 765e36aec9b42c33cd11df646d5cba83264bb34f (patch) | |
tree | 675e8d506c4cbe33a6a4c87fcc1878a43ce268df /subvertpy | |
parent | dce2e39ad1d9d98122060b984a70ddf045e7b293 (diff) |
Allow SHA1 checksums.
Diffstat (limited to 'subvertpy')
-rw-r--r-- | subvertpy/wc.c | 61 |
1 files changed, 49 insertions, 12 deletions
diff --git a/subvertpy/wc.c b/subvertpy/wc.c index 62783347..704ff28c 100644 --- a/subvertpy/wc.c +++ b/subvertpy/wc.c @@ -24,6 +24,7 @@ #include <structmember.h> #include <stdbool.h> #include <apr_md5.h> +#include <apr_sha1.h> #include "util.h" #include "editor.h" @@ -2425,21 +2426,24 @@ static PyObject *committed_queue_init(PyTypeObject *self, PyObject *args, PyObje return (PyObject *)ret; } -static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *args) +static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *args, PyObject *kwargs) { char *path; AdmObject *admobj; PyObject *py_wcprop_changes = Py_None; svn_boolean_t remove_lock = FALSE, remove_changelist = FALSE; - char *digest = NULL; + char *md5_digest = NULL, *sha1_digest = NULL; svn_boolean_t recurse = FALSE; apr_pool_t *temp_pool; apr_array_header_t *wcprop_changes; - int digest_len; + int md5_digest_len, sha1_digest_len; + char *kwnames[] = { "path", "adm", "recurse", "wcprop_changes", "remove_lock", "remove_changelist", "md5_digest", "sha1_digest", NULL }; - if (!PyArg_ParseTuple(args, "sO!|bObbz#", &path, &Adm_Type, &admobj, + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sO!|bObbz#z#", kwnames, + &path, &Adm_Type, &admobj, &recurse, &py_wcprop_changes, &remove_lock, - &remove_changelist, &digest, &digest_len)) + &remove_changelist, &md5_digest, &md5_digest_len, + &sha1_digest, &sha1_digest_len)) return NULL; temp_pool = Pool(NULL); @@ -2457,23 +2461,56 @@ static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *arg return NULL; } - if (digest != NULL) { - if (digest_len != APR_MD5_DIGESTSIZE) { + if (md5_digest != NULL) { + if (md5_digest_len != APR_MD5_DIGESTSIZE) { PyErr_SetString(PyExc_ValueError, "Invalid size for md5 digest"); apr_pool_destroy(temp_pool); return NULL; } - digest = apr_pstrdup(self->pool, digest); - if (digest == NULL) { + md5_digest = apr_pstrdup(temp_pool, md5_digest); + if (md5_digest == NULL) { + PyErr_NoMemory(); + return NULL; + } + } + + if (sha1_digest != NULL) { + if (sha1_digest_len != APR_SHA1_DIGESTSIZE) { + PyErr_SetString(PyExc_ValueError, "Invalid size for sha1 digest"); + apr_pool_destroy(temp_pool); + return NULL; + } + sha1_digest = apr_pstrdup(temp_pool, sha1_digest); + if (sha1_digest == NULL) { PyErr_NoMemory(); return NULL; } } +#if ONLY_SINCE_SVN(1, 6) + { + svn_checksum_t svn_checksum, *svn_checksum_p = &svn_checksum; + + if (sha1_digest != NULL) { + svn_checksum.digest = (unsigned char *)sha1_digest; + svn_checksum.kind = svn_checksum_sha1; + } else if (md5_digest != NULL) { + svn_checksum.digest = (unsigned char *)md5_digest; + svn_checksum.kind = svn_checksum_md5; + } else { + 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_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, - (unsigned char *)digest, temp_pool)); + (unsigned char *)md5_digest, temp_pool)); +#endif apr_pool_destroy(temp_pool); @@ -2481,8 +2518,8 @@ static PyObject *committed_queue_queue(CommittedQueueObject *self, PyObject *arg } static PyMethodDef committed_queue_methods[] = { - { "queue", (PyCFunction)committed_queue_queue, METH_VARARGS, - "S.queue(path, adm, recurse, wcprop_changes, remove_lock, remove_changelist, digest)" }, + { "queue", (PyCFunction)committed_queue_queue, METH_VARARGS|METH_KEYWORDS, + "S.queue(path, adm, recurse=False, wcprop_changes=[], remove_lock=False, remove_changelist=False, digest=None)" }, { NULL } }; |