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