Rev 993: Merge 0.4 in file:///data/jelmer/bzr-svn/layout/

Jelmer Vernooij jelmer at samba.org
Fri May 2 21:25:21 BST 2008


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

------------------------------------------------------------
revno: 993
revision-id: jelmer at samba.org-20080502202505-dt4qe0v8dsdivtpk
parent: jelmer at samba.org-20080502202401-bo2z83mdmz0yqmks
parent: jelmer at samba.org-20080502160233-7jbc8juolrno1mnk
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: layout
timestamp: Fri 2008-05-02 22:25:05 +0200
message:
  Merge 0.4
modified:
  branchprops.py                 branchprops.py-20061223204623-80lvm7pjrpsgk0dd-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
  tests/test_transport.py        test_transport.py-20060621232111-xh7xvoblzsrgj79t-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
    ------------------------------------------------------------
    revno: 974.1.140
    revision-id: jelmer at samba.org-20080502160233-7jbc8juolrno1mnk
    parent: jelmer at samba.org-20080502152551-zu1qfk162u4pw4lx
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4
    timestamp: Fri 2008-05-02 18:02:33 +0200
    message:
      Fix a couple of regressions.
    modified:
      logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
    ------------------------------------------------------------
    revno: 974.1.139
    revision-id: jelmer at samba.org-20080502152551-zu1qfk162u4pw4lx
    parent: jelmer at samba.org-20080502140325-bo0oaia7o3v2s8iq
    committer: Jelmer Vernooij <jelmer at samba.org>
    branch nick: 0.4
    timestamp: Fri 2008-05-02 17:25:51 +0200
    message:
      Share connection pools between transport instances.
    modified:
      branchprops.py                 branchprops.py-20061223204623-80lvm7pjrpsgk0dd-1
      logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
      repository.py                  repository.py-20060306123302-1f8c5069b3fe0265
      tests/test_transport.py        test_transport.py-20060621232111-xh7xvoblzsrgj79t-1
      transport.py                   transport.py-20060406231150-b3472d06b3a0818d
=== modified file 'branchprops.py'
--- a/branchprops.py	2008-05-02 12:30:29 +0000
+++ b/branchprops.py	2008-05-02 15:25:51 +0000
@@ -38,7 +38,7 @@
         path = path.lstrip("/")
 
         try:
-            (_, _, props) = self.log._get_transport().get_dir(path, 
+            (_, _, props) = self.log._transport.get_dir(path, 
                 revnum)
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:

=== modified file 'logwalker.py'
--- a/logwalker.py	2008-05-02 14:03:25 +0000
+++ b/logwalker.py	2008-05-02 16:02:33 +0000
@@ -99,7 +99,7 @@
         CacheTable.__init__(self, cache_db)
 
         self.actual = actual
-        self._get_transport = actual._get_transport
+        self._transport = actual._transport
         self.find_children = actual.find_children
 
         self.saved_revnum = self.cachedb.execute("SELECT MAX(rev) FROM changed_path").fetchone()[0]
@@ -175,7 +175,7 @@
 
             next = changes.find_prev_location(revpaths, path, revnum)
 
-            revprops = lazy_dict({}, self._get_transport().revprop_list, revnum)
+            revprops = lazy_dict({}, self._transport.revprop_list, revnum)
 
             if changes.changes_path(revpaths, path, True):
                 yield (path, revpaths, revnum, revprops)
@@ -242,7 +242,7 @@
         """
         if to_revnum <= self.saved_revnum:
             return
-        latest_revnum = self.actual._get_transport().get_latest_revnum()
+        latest_revnum = self.actual._transport.get_latest_revnum()
         to_revnum = max(latest_revnum, to_revnum)
 
         pb = ui.ui_factory.nested_progress_bar()
@@ -250,7 +250,7 @@
         try:
             try:
                 while self.saved_revnum < to_revnum:
-                    for (orig_paths, revision, revprops) in self.actual._get_transport().iter_log("", self.saved_revnum, 
+                    for (orig_paths, revision, revprops) in self.actual._transport.iter_log("", self.saved_revnum, 
                                              to_revnum, self.actual._limit, True, 
                                              True, []):
                         pb.update('fetching svn revision info', revision, to_revnum)
@@ -301,20 +301,13 @@
         """
         assert isinstance(transport, SvnRaTransport)
 
-        self.url = transport.base
-        self._transport = None
+        self._transport = transport
 
         if limit is not None:
             self._limit = limit
         else:
             self._limit = LOG_CHUNK_LIMIT
 
-    def _get_transport(self):
-        if self._transport is not None:
-            return self._transport
-        self._transport = SvnRaTransport(self.url)
-        return self._transport
-
     def find_latest_change(self, path, revnum, include_children=True):
         """Find latest revision that touched path.
 
@@ -325,7 +318,7 @@
         assert isinstance(revnum, int) and revnum >= 0
         
         try:
-            return self._get_transport().iter_log(path, revnum, 0, 2, True, False, []).next()[1]
+            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:
                 raise NoSuchRevision(branch=self, 
@@ -347,7 +340,7 @@
         assert from_revnum >= 0 and to_revnum >= 0 and from_revnum >= to_revnum
 
         try:
-            for (changed_paths, revnum, known_revprops) in self._get_transport().iter_log(path, from_revnum, to_revnum, limit, True, False, []):
+            for (changed_paths, revnum, known_revprops) in self._transport.iter_log(path, from_revnum, to_revnum, limit, True, False, []):
                 if pb is not None:
                     pb.update("determining changes", from_revnum-revnum, from_revnum)
                 if revnum == 0 and changed_paths is None:
@@ -356,7 +349,7 @@
                     assert isinstance(changed_paths, dict), "invalid paths in %r:%r" % (revnum, path)
                     revpaths = struct_revpaths_to_tuples(changed_paths)
                 next = changes.find_prev_location(revpaths, path, revnum)
-                revprops = lazy_dict(known_revprops, self._get_transport().revprop_list, revnum)
+                revprops = lazy_dict(known_revprops, self._transport.revprop_list, revnum)
                 yield (path, revpaths, revnum, revprops)
                 if next is None:
                     break
@@ -364,7 +357,7 @@
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
                 raise NoSuchRevision(branch=self, 
-                    revision="Revision number %d" % revnum)
+                    revision="Revision number %d" % from_revnum)
             raise
 
     def get_revision_paths(self, revnum):
@@ -380,7 +373,7 @@
 
         try:
             return struct_revpaths_to_tuples(
-                self._get_transport().iter_log("", revnum, revnum, 1, True, True, []).next()[0])
+                self._transport.iter_log("", revnum, revnum, 1, True, True, []).next()[0])
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
                 raise NoSuchRevision(branch=self, 
@@ -394,8 +387,7 @@
         :param revnum:  Revision to check
         """
         path = path.strip("/")
-        transport = self._get_transport()
-        ft = transport.check_path(path, revnum)
+        ft = self._transport.check_path(path, revnum)
         if ft == svn.core.svn_node_file:
             return []
         assert ft == svn.core.svn_node_dir
@@ -444,15 +436,13 @@
                 pass
         pool = Pool()
         editor = TreeLister(path)
-        old_base = transport.base
+        conn = self._transport.connections.get(urlutils.join(self._transport.get_svn_repos_root(), path))
         try:
-            root_repos = transport.get_svn_repos_root()
-            transport.reparent(urlutils.join(root_repos, path))
-            reporter = transport.do_update(revnum, True, editor, pool)
+            reporter = conn.do_update(revnum, True, editor, pool)
             reporter.set_path("", revnum, True, None, pool)
             reporter.finish_report(pool)
         finally:
-            transport.reparent(old_base)
+            self._transport.connections.add(conn)
         return editor.files
 
     def get_previous(self, path, revnum):
@@ -466,7 +456,7 @@
             return (None, -1)
 
         try:
-            paths = struct_revpaths_to_tuples(self._get_transport().iter_log(path, revnum, revnum, 1, True, False, []).next()[0])
+            paths = struct_revpaths_to_tuples(self._transport.iter_log(path, revnum, revnum, 1, True, False, []).next()[0])
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
                 raise NoSuchRevision(branch=self, 

=== modified file 'repository.py'
--- a/repository.py	2008-05-02 20:24:01 +0000
+++ b/repository.py	2008-05-02 20:25:05 +0000
@@ -485,7 +485,7 @@
         assert isinstance(mapping, BzrSvnMapping)
 
         if revprops is None:
-            revprops = logwalker.lazy_dict({}, self._log._get_transport().revprop_list, revnum)
+            revprops = logwalker.lazy_dict({}, self.transport.revprop_list, revnum)
 
         if changed_fileprops is None:
             changed_fileprops = logwalker.lazy_dict({}, self.branchprop_list.get_changed_properties, path, revnum)

=== modified file 'tests/test_transport.py'
--- a/tests/test_transport.py	2008-04-12 16:08:21 +0000
+++ b/tests/test_transport.py	2008-05-02 15:25:51 +0000
@@ -41,13 +41,6 @@
         self.assertIsInstance(t, SvnRaTransport)
         self.assertEqual(t.base, repos_url)
 
-    def test_reparent(self):
-        repos_url = self.make_client('d', 'dc')
-        t = SvnRaTransport(repos_url)
-        t.mkdir("foo")
-        t.reparent("%s/foo" % repos_url)
-        self.assertEqual("%s/foo" % repos_url, t.base)
-
     def test_lock_read(self):
         repos_url = self.make_client('d', 'dc')
         t = SvnRaTransport(repos_url)
@@ -116,8 +109,6 @@
         t = SvnRaTransport(repos_url)
         tt = t.clone()
         self.assertEqual(tt.base, t.base)
-        tt.reparent(urlutils.join(t.base, "dir"))
-        self.assertNotEqual(tt.base, t.base)
 
     def test_mkdir(self):
         repos_url = self.make_client('d', 'dc')

=== modified file 'transport.py'
--- a/transport.py	2008-05-02 13:05:29 +0000
+++ b/transport.py	2008-05-02 15:25:51 +0000
@@ -461,7 +461,19 @@
             if c.url == url:
                 self.connections.remove(c)
                 return c
-        return Connection(url)
+        # Nothing available? Just pick an existing one and reparent:
+        if len(self.connections) == 0:
+            return Connection(url)
+        c = self.connections.pop()
+        try:
+            c.reparent(url)
+            return c
+        except NotImplementedError:
+            self.connections.add(c)
+            return Connection(url)
+        except:
+            self.connections.add(c)
+            raise
 
     def add(self, connection):
         self.connections.add(connection)
@@ -473,7 +485,7 @@
     This implements just as much of Transport as is necessary 
     to fool Bazaar. """
     @convert_svn_error
-    def __init__(self, url="", _backing_url=None):
+    def __init__(self, url="", _backing_url=None, pool=None):
         self.pool = Pool()
         bzr_url = url
         self.svn_url = bzr_to_svn_url(url)
@@ -484,11 +496,13 @@
         self._backing_url = _backing_url.rstrip("/")
         Transport.__init__(self, bzr_url)
 
-        self.connections = ConnectionPool()
-
-        connection = Connection(self._backing_url)
-
-        self.connections.add(connection)
+        if pool is None:
+            self.connections = ConnectionPool()
+        else:
+            self.connections = pool
+
+        # Make sure that the URL is valid by connecting to it.
+        self.connections.add(self.connections.get(self._backing_url))
 
         from bzrlib.plugins.svn import lazy_check_versions
         lazy_check_versions()
@@ -604,13 +618,6 @@
             return self.connections.get(self.svn_url)
         return self.get_connection()
 
-    def reparent_root(self):
-        if self._is_http_transport():
-            self.svn_url = self.get_svn_repos_root()
-            self.base = self.get_repos_root()
-        else:
-            self.reparent(self.get_repos_root())
-
     def change_rev_prop(self, revnum, name, value, pool=None):
         conn = self.get_connection()
         try:
@@ -618,23 +625,6 @@
         finally:
             self.add_connection(conn)
 
-    @convert_svn_error
-    def reparent(self, url):
-        url = url.rstrip("/")
-        self.base = url
-        self.svn_url = bzr_to_svn_url(url)
-        if self.svn_url == self._backing_url:
-            return
-        conn = self.get_connection()
-        try:
-            conn.reparent(url)     
-        except NotImplementedError:
-            self.add_connection(conn)
-            self.mutter('svn reparent (reconnect) %r' % url)
-            conn = self.connections.get(self.svn_url.encode('utf8'))
-        self.add_connection(conn)
-        self._backing_url = self.svn_url
-
     def get_dir(self, path, revnum, pool=None, kind=False):
         path = self._request_path(path)
         conn = self.get_connection()
@@ -742,15 +732,17 @@
     def clone_root(self):
         if self._is_http_transport():
             return SvnRaTransport(self.get_repos_root(), 
-                                  bzr_to_svn_url(self.base))
-        return SvnRaTransport(self.get_repos_root())
+                                  bzr_to_svn_url(self.base),
+                                  pool=self.connections)
+        return SvnRaTransport(self.get_repos_root(),
+                              pool=self.connections)
 
     def clone(self, offset=None):
         """See Transport.clone()."""
         if offset is None:
-            return SvnRaTransport(self.base)
+            return SvnRaTransport(self.base, pool=self.connections)
 
-        return SvnRaTransport(urlutils.join(self.base, offset))
+        return SvnRaTransport(urlutils.join(self.base, offset), pool=self.connections)
 
     def local_abspath(self, relpath):
         """See Transport.local_abspath()."""




More information about the bazaar-commits mailing list