Rev 1082: Several more minor fixes. in file:///data/jelmer/bzr-svn/cext/
Jelmer Vernooij
jelmer at samba.org
Thu Jun 5 15:48:24 BST 2008
At file:///data/jelmer/bzr-svn/cext/
------------------------------------------------------------
revno: 1082
revision-id: jelmer at samba.org-20080605144823-yk82b00wxz0mc4tc
parent: jelmer at samba.org-20080605111713-6f2d16i82vyn15zu
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Thu 2008-06-05 16:48:23 +0200
message:
Several more minor fixes.
modified:
commit.py commit.py-20060607190346-qvq128wgfubhhgm2-1
logwalker.py logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
ra.c ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
tests/__init__.py __init__.py-20060508151940-e9f4d914801a2535
tests/test_commit.py test_commit.py-20060624213521-l5kcufywkh9mnilk-1
tests/test_fetch.py test_fetch.py-20070624210302-luvgwjmlfysk5qeq-1
tests/test_logwalker.py test_logwalker.py-20060622141944-pkocc3rj8g62ukbi-1
util.c util.c-20080531154025-s8ef6ej9tytsnkkw-1
wc.c wc.pyx-20080313142018-10l8l23vha2j9e6b-1
workingtree.py workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'commit.py'
--- a/commit.py 2008-06-04 23:03:52 +0000
+++ b/commit.py 2008-06-05 14:48:23 +0000
@@ -401,11 +401,12 @@
"""Callback that is called by the Subversion commit editor
once the commit finishes.
"""
-
- self.revision_metadata = object()
- self.revision_metadata.revision = revision
- self.revision_metadata.author = author
- self.revision_metadata.date = date
+ class CommitResult:
+ def __init__(self, revision, author, date):
+ self.revision = revision
+ self.author = author
+ self.date = date
+ self.revision_metadata = CommitResult(revision, author, date)
bp_parts = self.branch.get_branch_path().split("/")
repository_latest_revnum = self.repository.get_latest_revnum()
@@ -525,7 +526,7 @@
if constants.PROP_REVISION_AUTHOR in override_svn_revprops:
new_revprops[constants.PROP_REVISION_AUTHOR] = self._committer.encode("utf-8")
if constants.PROP_REVISION_DATE in override_svn_revprops:
- new_revprops[constants.PROP_REVISION_DATE] = svn_time_to_cstring(1000000*self._timestamp)
+ new_revprops[constants.PROP_REVISION_DATE] = time_to_cstring(1000000*self._timestamp)
set_svn_revprops(self.repository.transport, self.revision_metadata.revision, new_revprops)
try:
=== modified file 'logwalker.py'
--- a/logwalker.py 2008-06-04 18:56:53 +0000
+++ b/logwalker.py 2008-06-05 14:48:23 +0000
@@ -20,13 +20,13 @@
from bzrlib.trace import mutter
import bzrlib.ui as ui
-from core import SubversionException
-from transport import SvnRaTransport
-import core
-import constants
+from bzrlib.plugins.svn.core import SubversionException
+from bzrlib.plugins.svn.transport import SvnRaTransport
+from bzrlib.plugins.svn import core, constants
from bzrlib.plugins.svn.cache import CacheTable
from bzrlib.plugins.svn import changes
+from bzrlib.plugins.svn.ra import DIRENT_KIND
class lazy_dict(object):
def __init__(self, initial, create_fn, *args):
@@ -333,10 +333,10 @@
try:
return self._transport.iter_log([path], revnum, 0, 2, True, False, []).next()[1]
except SubversionException, (_, num):
- if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
+ if num == constants.ERR_FS_NO_SUCH_REVISION:
raise NoSuchRevision(branch=self,
revision="Revision number %d" % revnum)
- if num == svn.core.SVN_ERR_FS_NOT_FOUND:
+ if num == constants.ERR_FS_NOT_FOUND:
return None
raise
@@ -383,7 +383,7 @@
return struct_revpaths_to_tuples(
self._transport.iter_log(None, revnum, revnum, 1, True, True, []).next()[0])
except SubversionException, (_, num):
- if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
+ if num == constants.ERR_FS_NO_SUCH_REVISION:
raise NoSuchRevision(branch=self,
revision="Revision number %d" % revnum)
raise
@@ -397,66 +397,20 @@
assert isinstance(path, str), "invalid path"
path = path.strip("/")
conn = self._transport.connections.get(self._transport.get_svn_repos_root())
- try:
- ft = conn.check_path(path, revnum)
- if ft == core.NODE_FILE:
- return []
- assert ft == core.NODE_DIR
- finally:
- self._transport.connections.add(conn)
-
- class TreeLister(svn.delta.Editor):
- def __init__(self, base):
- self.files = []
- self.base = base
-
- def set_target_revision(self, revnum):
- """See Editor.set_target_revision()."""
- pass
-
- def open_root(self, revnum):
- """See Editor.open_root()."""
- return path
-
- def add_directory(self, path, parent_baton, copyfrom_path, copyfrom_revnum, pool):
- """See Editor.add_directory()."""
- self.files.append(urlutils.join(self.base, path))
- return path
-
- def change_dir_prop(self, id, name, value, pool):
- pass
-
- def change_file_prop(self, id, name, value, pool):
- pass
-
- def add_file(self, path, parent_id, copyfrom_path, copyfrom_revnum, baton):
- self.files.append(urlutils.join(self.base, path))
- return path
-
- def close_dir(self, id):
- pass
-
- def close_file(self, path, checksum):
- pass
-
- def close_edit(self):
- pass
-
- def abort_edit(self):
- pass
-
- def apply_textdelta(self, file_id, base_checksum):
- pass
-
- editor = TreeLister(path)
- try:
- conn = self._transport.connections.get(urlutils.join(self._transport.get_svn_repos_root(), path))
- reporter = conn.do_update(revnum, True, editor, pool)
- reporter.set_path("", revnum, True, None, pool)
- reporter.finish_report(pool)
- finally:
- self._transport.connections.add(conn)
- return editor.files
+ results = []
+ unchecked_dirs = set([path])
+ try:
+ while len(unchecked_dirs) > 0:
+ nextp = unchecked_dirs.pop()
+ (dirents, fetch_rev, props) = conn.get_dir(nextp, revnum, DIRENT_KIND)
+ for k,v in dirents.items():
+ childp = urlutils.join(nextp, k)
+ if v['kind'] == core.NODE_DIR:
+ unchecked_dirs.add(childp)
+ results.append(childp)
+ finally:
+ self._transport.connections.add(conn)
+ return results
def get_previous(self, path, revnum):
"""Return path,revnum pair specified pair was derived from.
=== modified file 'ra.c'
--- a/ra.c 2008-06-05 11:17:13 +0000
+++ b/ra.c 2008-06-05 14:48:23 +0000
@@ -677,7 +677,7 @@
/* FIXME: The subversion libraries don't behave as expected,
* so tweak our own parameters a bit. */
apr_paths = apr_array_make(temp_pool, 1, sizeof(char *));
- APR_ARRAY_PUSH(apr_paths, char *) = apr_pstrdup(temp_pool, "/");
+ APR_ARRAY_PUSH(apr_paths, char *) = apr_pstrdup(temp_pool, "");
} else if (!string_list_to_apr_array(temp_pool, paths, &apr_paths)) {
apr_pool_destroy(temp_pool);
return NULL;
@@ -1658,4 +1658,12 @@
busy_exc = PyErr_NewException("ra.BusyException", NULL, NULL);
PyModule_AddObject(mod, "BusyException", busy_exc);
+
+ PyModule_AddIntConstant(mod, "DIRENT_KIND", SVN_DIRENT_KIND);
+ PyModule_AddIntConstant(mod, "DIRENT_SIZE", SVN_DIRENT_SIZE);
+ PyModule_AddIntConstant(mod, "DIRENT_HAS_PROPS", SVN_DIRENT_HAS_PROPS);
+ PyModule_AddIntConstant(mod, "DIRENT_CREATED_REV", SVN_DIRENT_CREATED_REV);
+ PyModule_AddIntConstant(mod, "DIRENT_TIME", SVN_DIRENT_TIME);
+ PyModule_AddIntConstant(mod, "DIRENT_LAST_AUTHOR", SVN_DIRENT_LAST_AUTHOR);
+ PyModule_AddIntConstant(mod, "DIRENT_ALL", SVN_DIRENT_ALL);
}
=== modified file 'tests/__init__.py'
--- a/tests/__init__.py 2008-06-05 11:17:13 +0000
+++ b/tests/__init__.py 2008-06-05 14:48:23 +0000
@@ -124,7 +124,7 @@
return self.client_ctx.revprop_get(name, url, revnum)[0]
def client_set_revprop(self, url, revnum, name, value):
- return self.client_ctx.revprop_set(name, url, renum, value)
+ return self.client_ctx.revprop_set(name, value, url, revnum)
def client_commit(self, dir, message=None, recursive=True):
"""Commit current changes in specified working copy.
@@ -144,16 +144,17 @@
"""
self.client_ctx.add(relpath, recursive, False, False)
- def client_log(self, path, start_revnum=0, stop_revnum="HEAD"):
- assert isinstance(path, str)
+ def client_log(self, url, start_revnum=0, stop_revnum=-1):
+ ra = RemoteAccess(url.encode("utf-8"))
ret = {}
def rcvr(orig_paths, rev, revprops):
ret[rev] = (orig_paths,
revprops.get(constants.PROP_REVISION_AUTHOR),
revprops.get(constants.PROP_REVISION_DATE),
revprops.get(constants.PROP_REVISION_LOG))
- self.client_ctx.log([path], rcvr, None, start_revnum, stop_revnum,
- True, True)
+ if stop_revnum == -1:
+ stop_revnum = ra.get_latest_revnum()
+ ra.get_log(rcvr, None, start_revnum, stop_revnum, 0, True, True)
return ret
def client_delete(self, relpath):
=== modified file 'tests/test_commit.py'
--- a/tests/test_commit.py 2008-06-05 10:23:08 +0000
+++ b/tests/test_commit.py 2008-06-05 14:48:23 +0000
@@ -577,7 +577,7 @@
class RevpropTests(TestCaseWithSubversionRepository):
def test_change_revprops(self):
- repos_url = self.make_repository("d")
+ repos_url = self.make_repository("d", allow_revprop_changes=True)
dc = self.commit_editor(repos_url, message="My commit")
dc.add_file("foo.txt")
@@ -587,8 +587,10 @@
set_svn_revprops(transport, 1, {"svn:author": "Somebody",
"svn:date": time_to_cstring(1000000*473385600)})
+ self.assertEquals(1, transport.get_latest_revnum())
+
self.assertEquals(("Somebody", "1985-01-01T00:00:00.000000Z", "My commit"),
- self.client_log(repos_url)[1][1:])
+ self.client_log(repos_url)[1][1:])
def test_change_revprops_disallowed(self):
repos_url = self.make_repository("d", allow_revprop_changes=False)
=== modified file 'tests/test_fetch.py'
--- a/tests/test_fetch.py 2008-06-05 10:21:04 +0000
+++ b/tests/test_fetch.py 2008-06-05 14:48:23 +0000
@@ -1317,9 +1317,7 @@
self.client_add("dc/old-trunk")
self.client_commit("dc", "trunk data")
- self.build_tree({'dc/trunk': None})
- self.client_add("dc/trunk")
- self.client_copy("dc/old-trunk/lib", "dc/trunk")
+ self.client_copy("dc/old-trunk", "dc/trunk")
self.client_commit("dc", "revive old trunk")
oldrepos = Repository.open(repos_url)
=== modified file 'tests/test_logwalker.py'
--- a/tests/test_logwalker.py 2008-06-05 02:09:24 +0000
+++ b/tests/test_logwalker.py 2008-06-05 14:48:23 +0000
@@ -16,11 +16,11 @@
"""Log walker tests."""
+from bzrlib import debug
from bzrlib.errors import NoSuchRevision
import os
from bzrlib.plugins.svn import logwalker
-from bzrlib import debug
from bzrlib.plugins.svn.tests import TestCaseWithSubversionRepository
from bzrlib.plugins.svn.transport import SvnRaTransport
=== modified file 'util.c'
--- a/util.c 2008-06-04 21:20:42 +0000
+++ b/util.c 2008-06-05 14:48:23 +0000
@@ -52,10 +52,9 @@
void PyErr_SetSubversionException(svn_error_t *error)
{
- PyObject *coremod = PyImport_ImportModule("core"), *excobj;
+ PyObject *coremod = PyImport_ImportModule("bzrlib.plugins.svn.core"), *excobj;
if (coremod == NULL) {
- PyErr_BadInternalCall();
return;
}
@@ -89,13 +88,18 @@
return true;
}
if (!PyList_Check(l)) {
- PyErr_Format(PyExc_TypeError, "Expected list of paths, got: %s",
+ PyErr_Format(PyExc_TypeError, "Expected list of strings, got: %s",
l->ob_type->tp_name);
return false;
}
*ret = apr_array_make(pool, PyList_Size(l), sizeof(char *));
for (i = 0; i < PyList_GET_SIZE(l); i++) {
- APR_ARRAY_PUSH(*ret, char *) = apr_pstrdup(pool, PyString_AsString(PyList_GET_ITEM(l, i)));
+ PyObject *item = PyList_GET_ITEM(l, i);
+ if (!PyString_Check(item)) {
+ PyErr_SetString(PyExc_TypeError, "Expected list of strings");
+ return false;
+ }
+ APR_ARRAY_PUSH(*ret, char *) = apr_pstrdup(pool, PyString_AsString(item));
}
return true;
}
=== modified file 'wc.c'
--- a/wc.c 2008-06-04 22:09:09 +0000
+++ b/wc.c 2008-06-05 14:48:23 +0000
@@ -500,6 +500,74 @@
return new_editor_object(editor, edit_baton, pool, &Editor_Type, NULL, NULL);
}
+static bool py_dict_to_wcprop_changes(PyObject *dict, apr_pool_t *pool, apr_array_header_t **ret)
+{
+ PyObject *key, *val;
+ Py_ssize_t idx;
+
+ if (dict == Py_None) {
+ *ret = NULL;
+ return true;
+ }
+
+ if (!PyDict_Check(dict)) {
+ PyErr_SetString(PyExc_TypeError, "Expected dictionary with property changes");
+ return false;
+ }
+
+ *ret = apr_array_make(pool, PyDict_Size(dict), sizeof(char *));
+
+ while (PyDict_Next(dict, &idx, &key, &val)) {
+ svn_prop_t *prop = apr_palloc(pool, sizeof(svn_prop_t));
+ prop->name = PyString_AsString(key);
+ if (val == Py_None) {
+ prop->value = NULL;
+ } else {
+ prop->value = svn_string_ncreate(PyString_AsString(val), PyString_Size(val), pool);
+ }
+ APR_ARRAY_PUSH(*ret, svn_prop_t *) = prop;
+ }
+
+ return true;
+}
+
+static PyObject *adm_process_committed(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ char *path, *rev_date, *rev_author;
+ bool recurse, remove_lock = false;
+ unsigned char *digest = NULL;
+ svn_revnum_t new_revnum;
+ PyObject *py_wcprop_changes = Py_None;
+ apr_array_header_t *wcprop_changes;
+ AdmObject *admobj = (AdmObject *)self;
+ apr_pool_t *temp_pool;
+ char *kwnames[] = { "path", "recurse", "new_revnum", "rev_date", "rev_author",
+ "wcprop_changes", "remove_lock", "digest", NULL };
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sblss|Obs", kwnames,
+ &path, &recurse, &new_revnum, &rev_date,
+ &rev_author, &py_wcprop_changes,
+ &remove_lock, &digest))
+ return NULL;
+
+ temp_pool = Pool();
+ if (temp_pool == NULL)
+ return NULL;
+
+ if (!py_dict_to_wcprop_changes(py_wcprop_changes, temp_pool, &wcprop_changes)) {
+ apr_pool_destroy(temp_pool);
+ return NULL;
+ }
+
+ RUN_SVN_WITH_POOL(temp_pool, svn_wc_process_committed3(path, admobj->adm, recurse, new_revnum,
+ rev_date, rev_author, wcprop_changes,
+ remove_lock, digest, temp_pool));
+
+ apr_pool_destroy(temp_pool);
+
+ return Py_None;
+}
+
static PyObject *adm_close(PyObject *self)
{
AdmObject *admobj = (AdmObject *)self;
@@ -532,6 +600,7 @@
{ "get_update_editor", adm_get_update_editor, METH_VARARGS, NULL },
{ "close", (PyCFunction)adm_close, METH_NOARGS, NULL },
{ "entry", (PyCFunction)adm_entry, METH_VARARGS, NULL },
+ { "process_committed", (PyCFunction)adm_process_committed, METH_VARARGS|METH_KEYWORDS, NULL },
{ NULL, }
};
=== modified file 'workingtree.py'
--- a/workingtree.py 2008-06-04 23:03:52 +0000
+++ b/workingtree.py 2008-06-05 14:48:23 +0000
@@ -118,8 +118,7 @@
subprefix = os.path.join(prefix, entry)
- subwc = wc.WorkingCopy(adm, self.abspath(subprefix), False,
- 0, None)
+ subwc = wc.WorkingCopy(adm, self.abspath(subprefix))
try:
dir_add(subwc, subprefix, urlutils.joinpath(patprefix, entry))
finally:
@@ -186,8 +185,7 @@
self.read_working_inventory()
def _get_wc(self, relpath="", write_lock=False):
- return wc.WorkingCopy(None, self.abspath(relpath).rstrip("/"),
- write_lock, 0, None)
+ return wc.WorkingCopy(None, self.abspath(relpath).rstrip("/"), write_lock)
def _get_rel_wc(self, relpath, write_lock=False):
dir = os.path.dirname(relpath)
@@ -348,8 +346,7 @@
assert entry
if entry.kind == core.NODE_DIR:
- subwc = wc.WorkingCopy(adm, self.abspath(subrelpath),
- False, 0, None)
+ subwc = wc.WorkingCopy(adm, self.abspath(subrelpath))
try:
add_dir_to_inv(subrelpath, subwc, id)
finally:
@@ -395,8 +392,8 @@
adm.process_committed(self.abspath(path).rstrip("/"),
False, revnum,
- svn_time_to_cstring(newrev.timestamp),
- newrev.committer, None, False)
+ time_to_cstring(newrev.timestamp),
+ newrev.committer)
if newrevtree.inventory[id].kind != 'directory':
return
@@ -406,7 +403,7 @@
if entry == "":
continue
- subwc = wc.WorkingCopy(adm, os.path.join(self.basedir, path, entry), False, 0, None)
+ subwc = wc.WorkingCopy(adm, os.path.join(self.basedir, path, entry), write_lock=True)
try:
update_settings(subwc, os.path.join(path, entry))
finally:
@@ -699,7 +696,7 @@
# Open related remote repository + branch
try:
- adm = wc.WorkingCopy(None, self.local_path, False, 0, None)
+ adm = wc.WorkingCopy(None, self.local_path)
except SubversionException, (msg, constants.ERR_WC_UNSUPPORTED_FORMAT):
raise UnsupportedFormatError(msg, kind='workingtree')
try:
More information about the bazaar-commits
mailing list