Add subvertpy.client.export.
authorJelmer Vernooij <jelmer@samba.org>
Thu, 17 Feb 2011 18:09:25 +0000 (19:09 +0100)
committerJelmer Vernooij <jelmer@samba.org>
Thu, 17 Feb 2011 18:09:25 +0000 (19:09 +0100)
NEWS
subvertpy/client.c
subvertpy/tests/test_client.py

diff --git a/NEWS b/NEWS
index 5e1e74002477f63a185b93aec65f5f8e97642c5c..9fde82f4b7c6efd5a796a35b6bf1fed874e863ea 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -52,6 +52,8 @@
 
   * Add subvertpy.wc.WorkingCopy.probe_try. (Jelmer Vernooij)
 
+  * Add subvertpy.client.export. (Jelmer Vernooij)
+
  DEPRECATIONS
 
   * ERR_UNKNOWN_HOSTNAME and ERR_EAI_NONAME are deprecated
index 009c577009fd366f5e7dc426f58c2309322c929d..89822c8dd793e43a2bc403002c72fd2ac8ce9bcd 100644 (file)
@@ -508,6 +508,47 @@ static PyObject *client_commit(PyObject *self, PyObject *args, PyObject *kwargs)
     return ret;
 }
 
+static PyObject *client_export(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+    ClientObject *client = (ClientObject *)self;
+    char *kwnames[] = { "from", "to", "rev", "peg_rev", "recurse", "ignore_externals", "overwrite", "native_eol", NULL };
+    svn_revnum_t result_rev;
+    svn_opt_revision_t c_peg_rev, c_rev;
+    char *from, *to;
+    apr_pool_t *temp_pool;
+       char *native_eol = NULL;
+    PyObject *peg_rev=Py_None, *rev=Py_None;
+    bool recurse=true, ignore_externals=false, overwrite=false;
+
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ss|OObbb", kwnames, &from, &to, &rev, &peg_rev, &recurse, &ignore_externals, &overwrite, &native_eol))
+        return NULL;
+
+    if (!to_opt_revision(peg_rev, &c_peg_rev))
+        return NULL;
+    if (!to_opt_revision(rev, &c_rev))
+        return NULL;
+
+    temp_pool = Pool(NULL);
+    if (temp_pool == NULL)
+        return NULL;
+#if SVN_VER_MAJOR >= 1 && SVN_VER_MINOR >= 5
+    RUN_SVN_WITH_POOL(temp_pool, svn_client_export4(&result_rev, from, 
+        svn_path_canonicalize(to, temp_pool),
+        &c_peg_rev, &c_rev, overwrite, ignore_externals,
+               recurse?svn_depth_infinity:svn_depth_files, 
+        native_eol, client->client, temp_pool));
+#else
+    RUN_SVN_WITH_POOL(temp_pool, svn_client_export3(&result_rev, from,
+        svn_path_canonicalize(to, temp_pool),
+        &c_peg_rev, &c_rev, overwrite, ignore_externals, recurse, 
+        native_eol, client->client, temp_pool));
+#endif
+    apr_pool_destroy(temp_pool);
+    return PyLong_FromLong(result_rev);
+}
+
+
+
 static PyObject *client_delete(PyObject *self, PyObject *args)
 {
     PyObject *paths; 
@@ -1088,6 +1129,8 @@ static PyMethodDef client_methods[] = {
         "S.add(path, recursive=True, force=False, no_ignore=False)" },
     { "checkout", (PyCFunction)client_checkout, METH_VARARGS|METH_KEYWORDS, 
         "S.checkout(url, path, rev=None, peg_rev=None, recurse=True, ignore_externals=False, allow_unver_obstructions=False)" },
+       { "export", (PyCFunction)client_export, METH_VARARGS|METH_KEYWORDS,
+               "S.export(from, to, rev=None, peg_rev=None, recurse=True, ignore_externals=False, overwrite=False, native_eol=None)" },
     { "commit", (PyCFunction)client_commit, METH_VARARGS|METH_KEYWORDS, "S.commit(targets, recurse=True, keep_locks=True, revprops=None) -> (revnum, date, author)" },
     { "delete", client_delete, METH_VARARGS, "S.delete(paths, force=False)" },
     { "copy", (PyCFunction)client_copy, METH_VARARGS|METH_KEYWORDS, "S.copy(src_path, dest_path, srv_rev=None)" },
index 839c206f39a01ff780045651fa3736fd86d86f8d..0c83f8516220576f6722eef0fbb903df73105e60 100644 (file)
@@ -53,6 +53,13 @@ class TestClient(SubversionTestCase):
         self.build_tree({"dc/foo": None})
         self.client.add("dc/foo")
 
+    def test_export(self):
+        self.build_tree({"dc/foo": "bla"})
+        self.client.add("dc/foo")
+        self.client.commit(["dc"])
+        self.client.export(self.repos_url, "de")
+        self.assertEquals(["foo"], os.listdir("de"))
+
     def test_add_recursive(self):
         self.build_tree({"dc/trunk/foo": 'bla', "dc/trunk": None})
         self.client.add("dc/trunk")