Rev 1432: Merge support for creating lightweight checkouts without svn.client. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Fri Jul 4 06:48:05 BST 2008


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

------------------------------------------------------------
revno: 1432
revision-id: jelmer at samba.org-20080704054804-fn8ankcj4t0jimmr
parent: jelmer at samba.org-20080704051010-l730wl8jargwltcg
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Fri 2008-07-04 07:48:04 +0200
message:
  Merge support for creating lightweight checkouts without svn.client.
modified:
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'branch.py'
--- a/branch.py	2008-07-04 02:49:15 +0000
+++ b/branch.py	2008-07-04 05:48:04 +0000
@@ -26,7 +26,7 @@
 from bzrlib.tag import BasicTags
 from bzrlib.workingtree import WorkingTree
 
-from bzrlib.plugins.svn import core
+from bzrlib.plugins.svn import core, wc
 from bzrlib.plugins.svn.auth import create_auth_baton
 from bzrlib.plugins.svn.client import Client, get_config
 from bzrlib.plugins.svn.commit import push
@@ -37,6 +37,7 @@
 from bzrlib.plugins.svn.repository import SvnRepository
 from bzrlib.plugins.svn.transport import bzr_to_svn_url
 
+import os
 
 class FakeControlFiles(object):
     """Dummy implementation of ControlFiles.
@@ -177,7 +178,8 @@
 
         :param relpath: path from the repository root.
         """
-        assert relpath.startswith(self.get_branch_path())
+        assert relpath.startswith(self.get_branch_path()), \
+                "expected %s prefix, got %s" % (self.get_branch_path(), relpath)
         return relpath[len(self.get_branch_path()):].strip("/")
 
     def get_branch_path(self, revnum=None):
@@ -255,16 +257,28 @@
         :param revision_id: Tip of the checkout.
         :return: WorkingTree object of the checkout.
         """
-        if revision_id is None:
-            rev = "HEAD"
+        from bzrlib.plugins.svn.workingtree import update_wc
+        if revision_id is not None:
+            revnum = self.lookup_revision_id(revision_id)
         else:
-            rev = self.lookup_revision_id(revision_id)
+            revnum = self.get_revnum()
 
         svn_url = bzr_to_svn_url(self.base)
-        client_ctx = Client(auth=create_auth_baton(svn_url))
-        client_ctx.checkout(svn_url, to_location, rev, "HEAD", True)
-
-        return WorkingTree.open(to_location)
+        os.mkdir(to_location)
+        wc.ensure_adm(to_location, self.repository.uuid, svn_url,
+                      bzr_to_svn_url(self.repository.base), revnum)
+        adm = wc.WorkingCopy(None, to_location, write_lock=True)
+        try:
+            conn = self.repository.transport.connections.get(svn_url)
+            try:
+                update_wc(adm, to_location, conn, revnum)
+            finally:
+                if not conn.busy:
+                    self.repository.transport.add_connection(conn)
+        finally:
+            adm.close()
+        wt = WorkingTree.open(to_location)
+        return wt
 
     def create_checkout(self, to_location, revision_id=None, lightweight=False,
                         accelerator_tree=None, hardlink=False):

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-07-01 15:58:38 +0000
+++ b/workingtree.py	2008-07-04 05:48:04 +0000
@@ -54,6 +54,18 @@
 import os
 import urllib
 
+def update_wc(adm, basedir, conn, revnum):
+    # FIXME: honor SVN_CONFIG_SECTION_HELPERS:SVN_CONFIG_OPTION_DIFF3_CMD
+    # FIXME: honor SVN_CONFIG_SECTION_MISCELLANY:SVN_CONFIG_OPTION_USE_COMMIT_TIMES
+    # FIXME: honor SVN_CONFIG_SECTION_MISCELLANY:SVN_CONFIG_OPTION_PRESERVED_CF_EXTS
+    editor = adm.get_update_editor(basedir, False, True)
+    assert editor is not None
+    reporter = conn.do_update(revnum, "", True, editor)
+    adm.crawl_revisions(basedir, reporter, restore_files=False, 
+                        recurse=True, use_commit_times=False)
+    # FIXME: handle externals
+
+
 def generate_ignore_list(ignore_map):
     """Create a list of ignores, ordered by directory.
     
@@ -141,8 +153,28 @@
     def apply_inventory_delta(self, changes):
         raise NotImplementedError(self.apply_inventory_delta)
 
-    def update(self, change_reporter=None):
-        self.client_ctx.update([self.basedir.encode("utf-8")], "HEAD", True)
+    def _update(self, revnum=None):
+        if revnum is None:
+            # FIXME: should be able to use -1 here
+            revnum = self.branch.get_revnum()
+        adm = self._get_wc()
+        try:
+            conn = self.branch.repository.transport.get_connection()
+            try:
+                update_wc(adm, self.basedir, conn, revnum)
+            finally:
+                self.branch.repository.transport.add_connection(conn)
+        finally:
+            adm.close()
+        return revnum
+
+    def update(self, change_reporter=None, possible_transports=None, revnum=None):
+        orig_revnum = self.base_revnum
+        self.base_revnum = self._update(revnum)
+        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
@@ -347,13 +379,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)
@@ -378,7 +410,8 @@
                 if entry == "":
                     continue
 
-                subwc = WorkingCopy(wc, os.path.join(self.basedir, path, entry))
+                subwc = WorkingCopy(wc, os.path.join(self.basedir, path, entry), 
+                                   write_lock=True)
                 try:
                     update_settings(subwc, os.path.join(path, entry))
                 finally:
@@ -552,9 +585,12 @@
         (result.old_revno, result.old_revid) = self.branch.last_revision_info()
         if stop_revision is None:
             stop_revision = self.branch.last_revision()
-        rev = self.branch.lookup_revision_id(stop_revision)
-        fetched = self.client_ctx.update(self.basedir, rev, True)
+        revnumber = self.branch.lookup_revision_id(stop_revision)
+        fetched = self._update(revnum)
+        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