summaryrefslogtreecommitdiff
path: root/subvertpy
diff options
context:
space:
mode:
authorJelmer Vernooij <jelmer@jelmer.uk>2016-07-24 20:41:30 +0000
committerJelmer Vernooij <jelmer@jelmer.uk>2016-07-24 20:41:30 +0000
commit765e36aec9b42c33cd11df646d5cba83264bb34f (patch)
tree675e8d506c4cbe33a6a4c87fcc1878a43ce268df /subvertpy
parentdce2e39ad1d9d98122060b984a70ddf045e7b293 (diff)
Allow SHA1 checksums.
Diffstat (limited to 'subvertpy')
-rw-r--r--subvertpy/wc.c61
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 }
};