Update news, remove some more imports.
[jelmer/subvertpy.git] / workingtree.py
index d5e95e244ae687a6ea93c2e7db10dbfaee7d9009..6932937da16f3974f0ecb8c21d350d16cc2b2322 100644 (file)
 """Checkouts and working trees (working copies)."""
 
 import bzrlib
+from bzrlib import urlutils
 from bzrlib.branch import PullResult
 from bzrlib.bzrdir import BzrDirFormat, BzrDir
 from bzrlib.errors import (InvalidRevisionId, NotBranchError, NoSuchFile,
-                           NoRepositoryPresent, BzrError)
+                           NoRepositoryPresent, BzrError, UninitializableFormat)
 from bzrlib.inventory import Inventory, InventoryFile, InventoryLink
 from bzrlib.lockable_files import TransportLock, LockableFiles
 from bzrlib.lockdir import LockDir
@@ -32,7 +33,8 @@ from bzrlib.workingtree import WorkingTree, WorkingTreeFormat
 
 from branch import SvnBranch
 from convert import SvnConverter
-from errors import LocalCommitsUnsupported
+from errors import LocalCommitsUnsupported, NoSvnRepositoryPresent
+from remote import SvnRemoteAccess
 from repository import (SvnRepository, SVN_PROP_BZR_ANCESTRY,
                         SVN_PROP_SVK_MERGE, SVN_PROP_BZR_FILEIDS, 
                         SVN_PROP_BZR_REVISION_ID, SVN_PROP_BZR_REVISION_INFO,
@@ -43,7 +45,6 @@ from transport import (SvnRaTransport, svn_config, bzr_to_svn_url,
                        _create_auth_baton) 
 from tree import SvnBasisTree
 
-from copy import copy
 import os
 import urllib
 
@@ -145,6 +146,11 @@ class SvnWorkingTree(WorkingTree):
     def apply_inventory_delta(self, changes):
         raise NotImplementedError(self.apply_inventory_delta)
 
+    def update(self, change_reporter=None):
+        rev = svn.core.svn_opt_revision_t()
+        rev.kind = svn.core.svn_opt_revision_head
+        svn.client.update(self.basedir, rev, True, self.client_ctx)
+
     def remove(self, files, verbose=False, to_file=None):
         # FIXME: Use to_file argument
         # FIXME: Use verbose argument
@@ -186,7 +192,7 @@ class SvnWorkingTree(WorkingTree):
                 svn.wc.delete2(self.abspath(entry), from_wc, None, None, None)
             finally:
                 svn.wc.adm_close(from_wc)
-            new_name = "%s/%s" % (to_dir, os.path.basename(entry))
+            new_name = urlutils.join(to_dir, os.path.basename(entry))
             self._change_fileid_mapping(self.inventory.path2id(entry), new_name)
             self._change_fileid_mapping(None, entry)
 
@@ -400,7 +406,9 @@ class SvnWorkingTree(WorkingTree):
     def commit(self, message=None, message_callback=None, revprops=None, 
                timestamp=None, timezone=None, committer=None, rev_id=None, 
                allow_pointless=True, strict=False, verbose=False, local=False, 
-               reporter=None, config=None, specific_files=None):
+               reporter=None, config=None, specific_files=None, author=None):
+        if author is not None:
+            revprops['author'] = author
         # FIXME: Use allow_pointless
         # FIXME: Use verbose
         # FIXME: Use reporter
@@ -558,9 +566,8 @@ class SvnWorkingTree(WorkingTree):
         rev.kind = svn.core.svn_opt_revision_number
         rev.value.number = self.branch.lookup_revision_id(stop_revision)
         fetched = svn.client.update(self.basedir, rev, True, self.client_ctx)
-        self.base_revid = self.branch.repository.generate_revision_id(
-            fetched, self.branch.get_branch_path(fetched))
-        result.new_revid = self.branch.generate_revision_id(fetched)
+        self.base_revid = self.branch.generate_revision_id(fetched)
+        result.new_revid = self.base_revid
         result.new_revno = self.branch.revision_id_to_revno(result.new_revid)
         return result
 
@@ -713,12 +720,10 @@ class SvnCheckout(BzrDir):
         finally:
             svn.wc.adm_close(wc)
 
-        self.remote_transport = SvnRaTransport(svn_url)
-        self.svn_root_transport = SvnRaTransport(
-            self.remote_transport.get_repos_root())
+        remote_transport = SvnRaTransport(svn_url)
+        self.remote_bzrdir = SvnRemoteAccess(remote_transport)
+        self.svn_root_transport = remote_transport.clone_root()
         self.root_transport = self.transport = transport
-
-        self.branch_path = svn_url[len(bzr_to_svn_url(self.svn_root_transport.base)):]
         
     def clone(self, path, revision_id=None, force_new_repo=False):
         raise NotImplementedError(self.clone)
@@ -742,7 +747,12 @@ class SvnCheckout(BzrDir):
         raise NoRepositoryPresent(self)
 
     def find_repository(self):
-        return SvnRepository(self, self.svn_root_transport, self.branch_path)
+        return SvnRepository(self, self.svn_root_transport, self.remote_bzrdir.branch_path)
+
+    def needs_format_conversion(self, format=None):
+        if format is None:
+            format = BzrDirFormat.get_default_format()
+        return not isinstance(self._format, format.__class__)
 
     def create_workingtree(self, revision_id=None):
         """See BzrDir.create_workingtree().
@@ -761,48 +771,16 @@ class SvnCheckout(BzrDir):
         repos = self.find_repository()
 
         try:
-            branch = SvnBranch(self.root_transport.base, repos, 
-                               self.branch_path)
+            branch = SvnBranch(self.svn_root_transport.base, repos, 
+                               self.remote_bzrdir.branch_path)
         except SubversionException, (_, num):
             if num == svn.core.SVN_ERR_WC_NOT_DIRECTORY:
                 raise NotBranchError(path=self.base)
             raise
+
+        branch.bzrdir = self.remote_bzrdir
  
-        branch.bzrdir = self
         return branch
 
 
-class SvnWorkingTreeDirFormat(BzrDirFormat):
-    """Working Tree implementation that uses Subversion working copies."""
-    _lock_class = TransportLock
-
-    @classmethod
-    def probe_transport(klass, transport):
-        format = klass()
-
-        if isinstance(transport, LocalTransport) and \
-            transport.has(svn.wc.get_adm_dir()):
-            return format
 
-        raise NotBranchError(path=transport.base)
-
-    def _open(self, transport):
-        subr_version = svn.core.svn_subr_version()
-        if subr_version.major == 1 and subr_version.minor < 4:
-            raise NoCheckoutSupport()
-        return SvnCheckout(transport, self)
-
-    def get_format_string(self):
-        return 'Subversion Local Checkout'
-
-    def get_format_description(self):
-        return 'Subversion Local Checkout'
-
-    def initialize_on_transport(self, transport):
-        raise NotImplementedError(self.initialize_on_transport)
-
-    def get_converter(self, format=None):
-        """See BzrDirFormat.get_converter()."""
-        if format is None:
-            format = get_rich_root_format()
-        return SvnConverter(format)