Rev 1012: Avoid using client.checkout() - rather, use wc directly. in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Tue Mar 18 21:50:42 GMT 2008


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

------------------------------------------------------------
revno: 1012
revision-id:jelmer at samba.org-20080318215041-vwt4yqbf90m5lksw
parent: jelmer at samba.org-20080318203411-xy7ogj0mi12i468w
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Tue 2008-03-18 22:50:41 +0100
message:
  Avoid using client.checkout() - rather, use wc directly.
modified:
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  wc.pyx                         wc.pyx-20080313142018-10l8l23vha2j9e6b-1
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'branch.py'
--- a/branch.py	2008-03-16 06:11:05 +0000
+++ b/branch.py	2008-03-18 21:50:41 +0000
@@ -32,7 +32,7 @@
 from errors import NotSvnBranchPath
 from format import get_rich_root_format
 from repository import SvnRepository
-from transport import bzr_to_svn_url, create_svn_client
+from transport import bzr_to_svn_url
 
 
 class FakeControlFiles(object):
@@ -166,16 +166,18 @@
         :param revision_id: Tip of the checkout.
         :return: WorkingTree object of the checkout.
         """
+        import os, wc
         if revision_id is not None:
             revnum = self.lookup_revision_id(revision_id)
         else:
-            revnum = None
-
-        client_ctx = create_svn_client()
-        client_ctx.checkout(bzr_to_svn_url(self.base), to_location, revnum, 
-                            True)
-
-        return WorkingTree.open(to_location)
+            revnum = self.get_revnum()
+
+        os.mkdir(to_location)
+        wc.ensure_adm(to_location, self.repository.uuid, bzr_to_svn_url(self.base),
+                      bzr_to_svn_url(self.repository.base), revnum)
+        wt = WorkingTree.open(to_location)
+        wt.update(["."], revnum=revnum)
+        return wt
 
     def create_checkout(self, to_location, revision_id=None, lightweight=False,
                         accelerator_tree=None):

=== modified file 'wc.pyx'
--- a/wc.pyx	2008-03-18 20:34:11 +0000
+++ b/wc.pyx	2008-03-18 21:50:41 +0000
@@ -233,6 +233,11 @@
                                         apr_hash_t *config,
                                         apr_pool_t *pool)
 
+    svn_error_t *svn_wc_ensure_adm2(char *path, char *uuid, char *url,
+                                char *repos, svn_revnum_t revision,
+                                apr_pool_t *pool)
+
+
 def version():
     """Get libsvn_wc version information.
 
@@ -541,3 +546,16 @@
         pattern = <char **>apr_array_pop(patterns)
     apr_pool_destroy(pool)
     return ret
+
+
+def ensure_adm(char *path, char *uuid, char *url, repos=None, svn_revnum_t rev=-1):
+    cdef apr_pool_t *pool
+    cdef char *c_repos
+    pool = Pool(NULL)
+    if repos is None:
+        c_repos = NULL
+    else:
+        c_repos = repos
+    check_error(svn_wc_ensure_adm2(path, uuid, url, c_repos, rev, pool))
+    apr_pool_destroy(pool)
+

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-03-18 02:07:16 +0000
+++ b/workingtree.py	2008-03-18 21:50:41 +0000
@@ -57,14 +57,6 @@
 
 from format import get_rich_root_format
 
-class WorkingTreeInconsistent(BzrError):
-    _fmt = """Working copy is in inconsistent state (%(min_revnum)d:%(max_revnum)d)"""
-
-    def __init__(self, min_revnum, max_revnum):
-        self.min_revnum = min_revnum
-        self.max_revnum = max_revnum
-
-
 class SvnWorkingTree(WorkingTree):
     """WorkingTree implementation that uses a Subversion Working Copy for storage."""
     def __init__(self, bzrdir, local_path, branch):
@@ -72,21 +64,19 @@
         self.basedir = local_path
         self.bzrdir = bzrdir
         self._branch = branch
-        self.base_revnum = 0
         self.client_ctx = create_svn_client()
         self._get_wc()
         (min_rev, max_rev, switched, modified) = \
                 wc.revision_status(self.basedir, None, True)
-        if min_rev != max_rev:
-            #raise WorkingTreeInconsistent(status.min_rev, status.max_rev)
-            assert max_rev == self.client_ctx.update(self.basedir, 
-                                     max_rev, True)[0]
 
+        self.base_tree = None
         self.base_revnum = max_rev
-        self.base_tree = SvnBasisTree(self)
-        self.base_revid = branch.generate_revision_id(self.base_revnum)
-
-        self.read_working_inventory()
+        if max_rev < 0:
+            self.base_revid = None
+            self._set_inventory(Inventory(), dirty=False)
+        else:
+            self.base_revid = branch.generate_revision_id(self.base_revnum)
+            self.read_working_inventory()
 
         self.controldir = os.path.join(self.basedir, wc.get_adm_dir(), 
                                        'bzr')
@@ -141,8 +131,13 @@
     def apply_inventory_delta(self, changes):
         raise NotImplementedError(self.apply_inventory_delta)
 
-    def update(self, change_reporter=None):
-        self.client_ctx.update(self.basedir)
+    def update(self, change_reporter=None, possible_transports=None, revnum=None):
+        orig_revnum = self.base_revnum
+        self.base_revnum = self.client_ctx.update([self.basedir], rev=revnum)[0]
+        self.base_revid = self.branch.generate_revision_id(self.base_revnum)
+        self.base_tree = None
+        self.read_working_inventory()
+        return self.base_revnum - orig_revnum
 
     def remove(self, files, verbose=False, to_file=None):
         # FIXME: Use to_file argument
@@ -219,7 +214,7 @@
         assert isinstance(path, str)
 
         rp = self.branch.unprefix(path)
-        entry = self.base_tree.id_map[rp]
+        entry = self.basis_tree().id_map[rp]
         assert entry[0] is not None
         assert isinstance(entry[0], str), "fileid %r for %r is not a string" % (entry[0], path)
         return entry
@@ -349,13 +344,13 @@
         if revid is None or revid == NULL_REVISION:
             self.base_revid = revid
             self.base_revnum = 0
-            self.base_tree = RevisionTree(self, Inventory(), revid)
+            self.base_tree = None
             return
 
         rev = self.branch.lookup_revision_id(revid)
         self.base_revnum = rev
         self.base_revid = revid
-        self.base_tree = SvnBasisTree(self)
+        self.base_tree = None
 
         # TODO: Implement more efficient version
         newrev = self.branch.repository.get_revision(revid)
@@ -469,7 +464,7 @@
 
         self.base_revid = revid
         self.base_revnum = commit_info[0]
-        self.base_tree = SvnBasisTree(self)
+        self.base_tree = None
 
         return revid
 
@@ -543,11 +538,15 @@
         if self.base_revid is None or self.base_revid == NULL_REVISION:
             return self.branch.repository.revision_tree(self.base_revid)
 
+        if self.base_tree is None:
+            self.base_tree = SvnBasisTree(self)
+
         return self.base_tree
 
     def pull(self, source, overwrite=False, stop_revision=None, 
              delta_reporter=None, possible_transports=None):
         # FIXME: Use delta_reporter
+        # FIXME: Use source
         # FIXME: Use overwrite
         result = PullResult()
         result.source_branch = source
@@ -557,8 +556,11 @@
         if stop_revision is None:
             stop_revision = self.branch.last_revision()
         revnumber = self.branch.lookup_revision_id(stop_revision)
-        fetched = self.client_ctx.update(self.basedir, revnum, True)
+        fetched = self.client_ctx.update([self.basedir], revnum, True)
+        self.base_revnum = fetched
         self.base_revid = self.branch.generate_revision_id(fetched)
+        self.base_tree = None
+        self.read_working_inventory()
         result.new_revid = self.base_revid
         result.new_revno = self.branch.revision_id_to_revno(result.new_revid)
         return result




More information about the bazaar-commits mailing list