Rev 1523: Implement do_diff. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Sat Aug 2 17:56:02 BST 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/trunk

------------------------------------------------------------
revno: 1523
revision-id: jelmer at samba.org-20080802165559-z10yw204w3m5gz6c
parent: jelmer at samba.org-20080802152048-sjedpv3dlq5oz0zs
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Sat 2008-08-02 18:55:59 +0200
message:
  Implement do_diff.
modified:
  fileids.py                     fileids.py-20060714013623-u5iiyqqnko11grcf-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  tests/test_ra.py               test_ra.py-20080313141743-uzsm7ejitrlqone5-1
=== modified file 'fileids.py'
--- a/fileids.py	2008-07-23 20:45:18 +0000
+++ b/fileids.py	2008-08-02 16:55:59 +0000
@@ -279,9 +279,7 @@
             for i, revmeta in enumerate(reversed(todo)):
                 pb.update('generating file id map', i, len(todo))
                 revid = revmeta.get_revision_id(mapping)
-                expensive = False
                 def log_find_children(path, revnum):
-                    expensive = True
                     return self.repos._log.find_children(path, revnum)
 
                 (idmap, changes) = self.actual.apply_changes(
@@ -291,14 +289,9 @@
 
                 parent_revs = next_parent_revs
                        
-                saved = False
-                if i % 500 == 0 or expensive:
-                    self.save(revid, parent_revs, map)
-                    saved = True
+                self.save(revid, parent_revs, map)
                 next_parent_revs = [revid]
         finally:
             pb.finished()
-        if not saved:
-            self.save(revid, parent_revs, map)
         return map
 

=== modified file 'ra.c'
--- a/ra.c	2008-08-02 11:20:59 +0000
+++ b/ra.c	2008-08-02 16:55:59 +0000
@@ -1056,6 +1056,60 @@
 	return (PyObject *)ret;
 }
 
+static PyObject *ra_do_diff(PyObject *self, PyObject *args)
+{
+	svn_revnum_t revision_to_update_to;
+	char *diff_target, *versus_url; 
+	PyObject *diff_editor;
+	const svn_ra_reporter2_t *reporter;
+	void *report_baton;
+	svn_error_t *err;
+	apr_pool_t *temp_pool;
+	bool ignore_ancestry = false, text_deltas = false, recurse=true;
+	ReporterObject *ret;
+	RemoteAccessObject *ra = (RemoteAccessObject *)self;
+
+	if (!PyArg_ParseTuple(args, "lssO|bbb:do_diff", &revision_to_update_to, &diff_target, &versus_url, &diff_editor, &recurse, &ignore_ancestry, &text_deltas))
+		return NULL;
+
+	if (ra_check_busy(ra))
+		return NULL;
+
+	temp_pool = Pool(NULL);
+	if (temp_pool == NULL)
+		return NULL;
+
+	Py_INCREF(diff_editor);
+	Py_BEGIN_ALLOW_THREADS
+	err = svn_ra_do_diff2(ra->ra, &reporter, &report_baton, 
+												  revision_to_update_to, 
+												  diff_target, recurse,
+												  ignore_ancestry, 
+												  text_deltas,
+												  versus_url,
+												  &py_editor, diff_editor, 
+												  temp_pool);
+	Py_END_ALLOW_THREADS
+	if (!check_error(err)) {
+		apr_pool_destroy(temp_pool);
+		ra->busy = false;
+		
+		return NULL;
+	}
+
+	ret = PyObject_New(ReporterObject, &Reporter_Type);
+	if (ret == NULL)
+		return NULL;
+	ret->reporter = reporter;
+	ret->report_baton = report_baton;
+	ret->pool = temp_pool;
+	Py_INCREF(ra);
+	ret->ra = ra;
+	return (PyObject *)ret;
+}
+
+
+
 static PyObject *ra_replay(PyObject *self, PyObject *args)
 {
 	RemoteAccessObject *ra = (RemoteAccessObject *)self;
@@ -1823,6 +1877,7 @@
 	{ "replay_range", ra_replay_range, METH_VARARGS, NULL },
 	{ "do_switch", ra_do_switch, METH_VARARGS, NULL },
 	{ "do_update", ra_do_update, METH_VARARGS, NULL },
+	{ "do_diff", ra_do_diff, METH_VARARGS, NULL },
 	{ "get_repos_root", (PyCFunction)ra_get_repos_root, METH_VARARGS|METH_NOARGS, NULL },
 	{ "get_log", (PyCFunction)ra_get_log, METH_VARARGS|METH_KEYWORDS, NULL },
 	{ "get_latest_revnum", (PyCFunction)ra_get_latest_revnum, METH_NOARGS, NULL },

=== modified file 'tests/test_ra.py'
--- a/tests/test_ra.py	2008-06-26 19:34:03 +0000
+++ b/tests/test_ra.py	2008-08-02 16:55:59 +0000
@@ -76,6 +76,28 @@
     def test_rev_proplist(self):
         self.assertIsInstance(self.ra.rev_proplist(0), dict)
 
+    def test_do_diff(self):
+        self.do_commit()
+
+        class MyFileEditor:
+            def change_prop(self, name, val): pass 
+            def close(self, checksum=None): pass
+
+        class MyDirEditor:
+            def change_prop(self, name, val): pass 
+            def add_directory(self, *args): return MyDirEditor()
+            def add_file(self, *args): return MyFileEditor()
+            def close(self): pass
+
+        class MyEditor:
+            def set_target_revision(self, rev): pass 
+            def open_root(self, base_rev):
+                return MyDirEditor()
+            def close(self): pass
+        reporter = self.ra.do_diff(1, "", self.ra.get_repos_root(), MyEditor())
+        reporter.set_path("", 0, True)
+        reporter.finish()
+
     def test_get_log(self):
         returned = []
         def cb(*args):




More information about the bazaar-commits mailing list