Rev 1999: Merge new subvertpy. in file:///data/jelmer/bzr-svn/0.5/

Jelmer Vernooij jelmer at samba.org
Mon Nov 17 03:43:02 GMT 2008


At file:///data/jelmer/bzr-svn/0.5/

------------------------------------------------------------
revno: 1999
revision-id: jelmer at samba.org-20081117034300-wc5sqo582fjc4e0i
parent: jelmer at samba.org-20081117020155-w38808hqlln5cs2e
parent: jelmer at samba.org-20081117020421-9f8a7hkb714ropxl
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.5
timestamp: Mon 2008-11-17 04:43:00 +0100
message:
  Merge new subvertpy.
modified:
  subvertpy/subvertpy/ra_svn.py  ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
    ------------------------------------------------------------
    revno: 1925.2.33
    revision-id: jelmer at samba.org-20081117020421-9f8a7hkb714ropxl
    parent: jelmer at samba.org-20081117014500-5rrkw978hy845tco
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Mon 2008-11-17 03:04:21 +0100
    message:
      Implement replay() and replay_range().
    modified:
      subvertpy/ra_svn.py            ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
    ------------------------------------------------------------
    revno: 1925.2.32
    revision-id: jelmer at samba.org-20081117014500-5rrkw978hy845tco
    parent: jelmer at samba.org-20081117011713-tjg28s9ib85xuxhf
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Mon 2008-11-17 02:45:00 +0100
    message:
      Implement a couple more commands.
    modified:
      subvertpy/ra_svn.py            ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
    ------------------------------------------------------------
    revno: 1925.2.31
    revision-id: jelmer at samba.org-20081117011713-tjg28s9ib85xuxhf
    parent: jelmer at samba.org-20081117010748-qyofdqkslzm14z0f
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: trunk
    timestamp: Mon 2008-11-17 02:17:13 +0100
    message:
      Make sure connection gets set back to not busy after exception occurs.
    modified:
      subvertpy/ra_svn.py            ra_svn.py-20081116165419-qplciag3b7ikc6ms-1
=== modified file 'subvertpy/subvertpy/ra_svn.py'
--- a/subvertpy/subvertpy/ra_svn.py	2008-11-17 01:07:48 +0000
+++ b/subvertpy/subvertpy/ra_svn.py	2008-11-17 02:04:21 +0000
@@ -117,6 +117,82 @@
 
 SVN_PORT = 3690
 
+
+def feed_editor(conn, editor):
+    tokens = {}
+    diff = {}
+    txdelta_handler = {}
+    # Process commands
+    while True:
+        command, args = conn.recv_msg()
+        if command == "target-rev":
+            editor.set_target_revision(args[0])
+        elif command == "open-root":
+            if len(args[0]) == 0:
+                token = editor.open_root()
+            else:
+                token = editor.open_root(args[0][0])
+            tokens[args[1]] = token
+        elif command == "delete-entry":
+            tokens[args[2]].delete_entry(args[0], args[1])
+        elif command == "add-dir":
+            if len(args[3]) == 0:
+                token = tokens[args[1]].add_directory(args[0])
+            else:
+                token = tokens[args[1]].add_directory(args[0], args[3][0], args[4][0])
+            tokens[args[2]] = token
+        elif command == "open-dir":
+            tokens[args[2]] = tokens[args[1]].open_directory(args[0], args[3])
+        elif command == "change-dir-prop":
+            if len(args[2]) == 0:
+                tokens[args[0]].change_prop(args[1], None)
+            else:
+                tokens[args[0]].change_prop(args[1], args[2][0])
+        elif command == "close-dir":
+            tokens[args[0]].close()
+        elif command == "absent-dir":
+            tokens[args[1]].absent(args[0])
+        elif command == "add-file":
+            if len(args[3]) == 0:
+                token = tokens[args[1]].add_file(args[0])
+            else:
+                token = tokens[args[1]].add_file(args[0], args[3][0], args[4][0])
+            tokens[args[2]] = token
+        elif command == "open-file":
+            tokens[args[2]] = tokens[args[1]].open_file(args[0], args[3])
+        elif command == "apply-textdelta":
+            if len(args[1]) == 0:
+                txdelta_handler[args[0]] = tokens[args[0]].apply_textdelta(None)
+            else:
+                txdelta_handler[args[0]] = tokens[args[0]].apply_textdelta(args[1][0])
+            diff[args[0]] = ""
+        elif command == "textdelta-chunk":
+            diff[args[0]] += args[1]
+        elif command == "textdelta-end":
+            for w in unpack_svndiff0(diff[args[0]]):
+                txdelta_handler[args[0]](w)
+            txdelta_handler[args[0]](None)
+        elif command == "change-file-prop":
+            if len(args[2]) == 0:
+                tokens[args[0]].change_prop(args[1], None)
+            else:
+                tokens[args[0]].change_prop(args[1], args[2][0])
+        elif command == "close-file":
+            if len(args[1]) == 0:
+                tokens[args[0]].close()
+            else:
+                tokens[args[0]].close(args[1][0])
+        elif command == "close-edit":
+            editor.close()
+            break
+        elif command == "abort-edit":
+            editor.abort()
+            break
+
+    conn.send_success()
+    conn._unpack()
+
+
 class Reporter:
 
     def __init__(self, conn, editor):
@@ -153,78 +229,7 @@
     def finish(self):
         self.conn.send_msg([literal("finish-report"), []])
         auth = self.conn.recv_msg()
-        tokens = {}
-        diff = {}
-        txdelta_handler = {}
-        # Process commands
-        while True:
-            command, args = self.conn.recv_msg()
-            if command == "target-rev":
-                self.editor.set_target_revision(args[0])
-            elif command == "open-root":
-                if len(args[0]) == 0:
-                    token = self.editor.open_root()
-                else:
-                    token = self.editor.open_root(args[0][0])
-                tokens[args[1]] = token
-            elif command == "delete-entry":
-                tokens[args[2]].delete_entry(args[0], args[1])
-            elif command == "add-dir":
-                if len(args[3]) == 0:
-                    token = tokens[args[1]].add_directory(args[0])
-                else:
-                    token = tokens[args[1]].add_directory(args[0], args[3][0], args[4][0])
-                tokens[args[2]] = token
-            elif command == "open-dir":
-                tokens[args[2]] = tokens[args[1]].open_directory(args[0], args[3])
-            elif command == "change-dir-prop":
-                if len(args[2]) == 0:
-                    tokens[args[0]].change_prop(args[1], None)
-                else:
-                    tokens[args[0]].change_prop(args[1], args[2][0])
-            elif command == "close-dir":
-                tokens[args[0]].close()
-            elif command == "absent-dir":
-                tokens[args[1]].absent(args[0])
-            elif command == "add-file":
-                if len(args[3]) == 0:
-                    token = tokens[args[1]].add_file(args[0])
-                else:
-                    token = tokens[args[1]].add_file(args[0], args[3][0], args[4][0])
-                tokens[args[2]] = token
-            elif command == "open-file":
-                tokens[args[2]] = tokens[args[1]].open_file(args[0], args[3])
-            elif command == "apply-textdelta":
-                if len(args[1]) == 0:
-                    txdelta_handler[args[0]] = tokens[args[0]].apply_textdelta(None)
-                else:
-                    txdelta_handler[args[0]] = tokens[args[0]].apply_textdelta(args[1][0])
-                diff[args[0]] = ""
-            elif command == "textdelta-chunk":
-                diff[args[0]] += args[1]
-            elif command == "textdelta-end":
-                for w in unpack_svndiff0(diff[args[0]]):
-                    txdelta_handler[args[0]](w)
-                txdelta_handler[args[0]](None)
-            elif command == "change-file-prop":
-                if len(args[2]) == 0:
-                    tokens[args[0]].change_prop(args[1], None)
-                else:
-                    tokens[args[0]].change_prop(args[1], args[2][0])
-            elif command == "close-file":
-                if len(args[1]) == 0:
-                    tokens[args[0]].close()
-                else:
-                    tokens[args[0]].close(args[1][0])
-            elif command == "close-edit":
-                self.editor.close()
-                break
-            elif command == "abort-edit":
-                self.editor.abort()
-                break
-
-        self.conn.send_success()
-        self.conn._unpack()
+        feed_editor(self.conn, self.editor)
         self.conn.busy = False
 
     def abort(self):
@@ -315,6 +320,7 @@
         self.conn._open_ids.pop()
         self.conn.send_msg([literal("close-dir"), [self.id]])
 
+
 class FileEditor:
 
     def __init__(self, conn, id):
@@ -428,7 +434,7 @@
             if num == ERR_RA_SVN_UNKNOWN_CMD:
                 raise NotImplementedError(msg)
             raise SubversionException(msg, num)
-        assert msg[0] == "success"
+        assert msg[0] == "success", "Got: %r" % msg
         assert len(msg) == 2
         return msg[1]
 
@@ -472,11 +478,23 @@
     def get_file_revs(self, path, start, end, file_rev_handler):
         raise NotImplementedError(self.get_file_revs)
 
+    @mark_busy
     def get_locations(self, path, peg_revision, location_revisions):
-        raise NotImplementedError(self.get_locations)
+        self.send_msg([literal("get-locations"), [path, peg_revision, location_revisions]])
+        self._recv_ack()
+        ret = {}
+        while True:
+            msg = self.recv_msg()
+            if msg == "done":
+                break
+            ret[msg[0]] = msg[1]
+        self._unparse()
+        return ret
 
     def get_locks(self, path):
-        raise NotImplementedError(self.get_locks)
+        self.send_msg([literal("get-lock"), [path]])
+        self._recv_ack()
+        return self._unpack()
 
     def lock(self, path_revs, comment, steal_lock, lock_func):
         raise NotImplementedError(self.lock)
@@ -487,9 +505,30 @@
     def mergeinfo(self, paths, revision=-1, inherit=None, include_descendants=False):
         raise NotImplementedError(self.mergeinfo)
 
-    def get_location_segments(self, path, peg_revision, start_revision,
-                              end_revision, py_rcvr):
-        raise NotImplementedError(self.get_location_segments)
+    def location_segments(self, path, start_revision, end_revision, 
+                          include_merged_revisions=False):
+        args = [path]
+        if start_revision is None or start_revision == -1:
+            args.append([])
+        else:
+            args.append([start_revision])
+        if end_revision is None or end_revision == -1:
+            args.append([])
+        else:
+            args.append([end_revision])
+        args.append(include_merged_revisions)
+        self.send_msg([literal("get-location-segments"), args])
+        self._recv_ack()
+        while True:
+            msg = self.recv_msg()
+            if msg == "done":
+                break
+            yield msg
+        self._unpack()
+
+    def get_location_segments(self, path, start_revision, end_revision, rcvr):
+        for msg in self.location_segments(path, start_revision, end_revision):
+            rcvr(*msg)
 
     def has_capability(self, capability):
         return capability in self._server_capabilities
@@ -507,7 +546,13 @@
         return {"dir": NODE_DIR, "file": NODE_FILE, "unknown": NODE_UNKNOWN, "none": NODE_NONE}[ret]
 
     def get_lock(self, path):
-        raise NotImplementedError(self.get_lock)
+        self.send_msg([literal("get-lock"), [path]])
+        self._recv_ack()
+        ret = self._unpack()
+        if len(ret) == 0:
+            return None
+        else:
+            return ret[0]
 
     @mark_busy
     def get_dir(self, path, revision=-1, dirent_fields=0, want_props=True, want_contents=True):
@@ -566,10 +611,25 @@
         raise NotImplementedError(self.get_file)
 
     def change_rev_prop(self, rev, name, value):
-        raise NotImplementedError(self.change_rev_prop)
+        args = [rev, name]
+        if value is not None:
+            args.append(value)
+        self.send_msg([literal("change-rev-prop"), args])
+        self._recv_ack()
+        self._unparse()
 
     def get_commit_editor(self, revprops, callback=None, lock_tokens=None, 
                           keep_locks=False):
+        args = [revprops[properties.PROP_REVISION_LOG]]
+        if lock_tokens is not None:
+            args.append(lock_tokens.items())
+        else:
+            args.append([])
+        args.append(keep_locks)
+        if len(revprops) > 1:
+            args.append(revprops.items())
+        self.send_msg([literal("commit"), args])
+        self._recv_ack()
         raise NotImplementedError(self.get_commit_editor)
 
     def rev_proplist(self, revision):
@@ -577,12 +637,34 @@
         self._recv_ack()
         return dict(self._unpack()[0])
 
+    def rev_prop(self, revision, name):
+        self.send_msg([literal("rev-prop"), [revision, name]])
+        self._recv_ack()
+        ret = self._unpack()
+        if len(ret) == 0:
+            return None
+        else:
+            return ret[0]
+
+    @mark_busy
     def replay(self, revision, low_water_mark, update_editor, send_deltas=True):
-        raise NotImplementedError(self.replay)
+        self.send_msg([literal("replay"), [revision, low_water_mark, send_deltas]])
+        self._recv_ack()
+        feed_editor(self, update_editor)
+        self._unpack()
 
+    @mark_busy
     def replay_range(self, start_revision, end_revision, low_water_mark, cbs, 
                      send_deltas=True):
-        raise NotImplementedError(self.replay_range)
+        self.send_msg([literal("replay-range"), [start_revision, end_revision, low_water_mark, send_deltas]])
+        self._recv_ack()
+        for i in range(start_revision, end_revision+1):
+            msg = self.recv_msg()
+            assert msg[0] == "revprops"
+            edit = cbs[0](i, dict(msg[1]))
+            feed_editor(self, edit)
+            cbs[1](i, dict(msg[1]), edit)
+        self._unpack()
 
     def do_switch(self, revision_to_update_to, update_target, recurse, 
                   switch_url, update_editor, depth=None):
@@ -598,9 +680,13 @@
             args.append(literal(depth))
 
         self.busy = True
-        self.send_msg([literal("switch"), args])
-        self._recv_ack()
-        return Reporter(self, update_editor)
+        try:
+            self.send_msg([literal("switch"), args])
+            self._recv_ack()
+            return Reporter(self, update_editor)
+        except:
+            self.busy = False
+            raise
 
     def do_update(self, revision_to_update_to, update_target, recurse, 
                   update_editor, depth=None):
@@ -615,9 +701,13 @@
             args.append(literal(depth))
 
         self.busy = True
-        self.send_msg([literal("update"), args])
-        self._recv_ack()
-        return Reporter(self, update_editor)
+        try:
+            self.send_msg([literal("update"), args])
+            self._recv_ack()
+            return Reporter(self, update_editor)
+        except:
+            self.busy = False
+            raise
 
     def do_diff(self, revision_to_update, diff_target, versus_url, diff_editor,
                 recurse=True, ignore_ancestry=False, text_deltas=False, depth=None):
@@ -630,9 +720,13 @@
         if depth is not None:
             args.append(literal(depth))
         self.busy = True
-        self.send_msg([literal("diff"), args])
-        self._recv_ack()
-        return Reporter(self, diff_editor)
+        try:
+            self.send_msg([literal("diff"), args])
+            self._recv_ack()
+            return Reporter(self, diff_editor)
+        except:
+            self.busy = False
+            raise
 
     def get_repos_root(self):
         return self._root_url
@@ -643,6 +737,13 @@
         self._recv_ack()
         return self._unpack()[0]
 
+    @mark_busy
+    def get_dated_rev(self, date):
+        self.send_msg([literal("get-dated-rev"), [date]])
+        self._recv_ack()
+        return self._unpack()[0]
+
+    @mark_busy
     def reparent(self, url):
         self.send_msg([literal("reparent"), [url]])
         self._recv_ack()




More information about the bazaar-commits mailing list