Rev 442: Implement most of svn:externals as by-reference trees. in sftp://people.samba.org/~/bzr/bzr-svn/nestedtrees/

Jelmer Vernooij jelmer at samba.org
Mon Mar 26 02:31:42 BST 2007


At sftp://people.samba.org/~/bzr/bzr-svn/nestedtrees/

------------------------------------------------------------
revno: 442
revision-id: jelmer at samba.org-20070326012917-ufy37u6y0v3sd4pb
parent: jelmer at samba.org-20070325224054-4ea32tsmvr95gobb
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: nestedtrees
timestamp: Mon 2007-03-26 03:29:17 +0200
message:
  Implement most of svn:externals as by-reference trees.
  
  Still to be done:
  
   * Removal of externals
   * Change of externals locations / revisions
   * Proper file ids for externals and directories implicitly created by them
modified:
  branch.py                      svnbranch.py-20051017135706-11c749eb0dab04a7
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
  tests/test_repos.py            test_repos.py-20060508151940-ddc49a59257ca712
  tests/test_tree.py             test_tree.py-20070103204350-pr8nupes7e5sd2wr-1
  tree.py                        tree.py-20060624222557-dudlwqcmkf22lt2s-1
=== modified file 'branch.py'
--- a/branch.py	2007-03-25 18:41:40 +0000
+++ b/branch.py	2007-03-26 01:29:17 +0000
@@ -117,10 +117,7 @@
         self._revision_history.reverse()
 
     def get_root_id(self):
-        if self.last_revision() is None:
-            inv = Inventory()
-        else:
-            inv = self.repository.get_inventory(self.last_revision())
+        inv = self.repository.get_inventory(self.last_revision())
         return inv.root.file_id
 
     def _get_nick(self):

=== modified file 'fetch.py'
--- a/fetch.py	2007-03-25 19:11:08 +0000
+++ b/fetch.py	2007-03-26 01:29:17 +0000
@@ -14,7 +14,6 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-import bzrlib
 from bzrlib.inventory import Inventory
 import bzrlib.osutils as osutils
 from bzrlib.revision import Revision
@@ -143,7 +142,7 @@
             # Add externals. This happens after all children have been added
             # as they can be grandchildren.
             for (name, (rev, url)) in self.externals[id].items():
-                inventory_add_external(self.inventory, id, name, rev, url)
+                inventory_add_external(self.inventory, id, name, self.revid, rev, url)
             # FIXME: Externals could've disappeared or only changed. Need 
             # to keep track of them.
 
@@ -303,8 +302,7 @@
         rev = self._get_revision(self.revid)
         self.inventory.revision_id = self.revid
         rev.inventory_sha1 = osutils.sha_string(
-            bzrlib.xml5.serializer_v5.write_inventory_to_string(
-                self.inventory))
+                self.target.serialise_inventory(self.inventory))
         self.target.add_revision(self.revid, rev, self.inventory)
         self.pool.destroy()
 

=== modified file 'tests/test_repos.py'
--- a/tests/test_repos.py	2007-03-25 19:11:08 +0000
+++ b/tests/test_repos.py	2007-03-26 01:29:17 +0000
@@ -696,14 +696,12 @@
         self.client_commit("dc2", "My Message")
 
         oldrepos = Repository.open(repos_url2)
-        dir = BzrDir.create("f")
-        newrepos = dir.create_repository()
+        from bzrlib.repofmt.knitrepo import RepositoryFormatKnit3
+        newrepos = RepositoryFormatKnit3().initialize(BzrDir.create("f"))
         oldrepos.copy_content_into(newrepos)
-        inv = oldrepos.get_inventory(oldrepos.generate_revision_id(0, ""))
+        inv = oldrepos.get_inventory(oldrepos.generate_revision_id(1, ""))
         self.assertTrue(inv.has_filename("somedir/bla"))
-        self.assertTrue(inv.has_filename("somedir/bla/file"))
-        self.assertEqual(inv.path2id("somedir/bla"), "blaid")
-        self.assertEqual(inv.path2id("somedir/bla/file"), "blaid")
+        self.assertEqual(inv.path2id("somedir/bla"), Branch.open("%s/proj1/trunk" % repos_url1).get_root_id())
 
     def test_fetch_special_char(self):
         repos_url = self.make_client('d', 'dc')

=== modified file 'tests/test_tree.py'
--- a/tests/test_tree.py	2007-03-25 22:40:54 +0000
+++ b/tests/test_tree.py	2007-03-26 01:29:17 +0000
@@ -58,6 +58,20 @@
         self.assertEqual("target",
                          tree.inventory[tree.inventory.path2id("file")].symlink_target)
 
+    def test_external(self):
+        ref_repos_url = self.make_client("ref", "de")
+        self.make_client("d", "dc")
+        self.client_set_prop("dc", "svn:externals", str("bla\t%s\n" % ref_repos_url))
+        self.client_commit("dc", "add external")
+        self.client_update("dc")
+        wt = WorkingTree.open("dc")
+        tree = SvnBasisTree(wt)
+        self.assertEqual('tree-reference', 
+                         tree.inventory[tree.inventory.path2id("bla")].kind)
+        self.assertEqual(TreeReference(generate_svn_file_id(wt.branch.repository.uuid, 0, "", ""),
+             'bla', wt.branch.get_root_id(), revision=wt.branch.generate_revision_id(1)),
+                         tree.inventory[tree.inventory.path2id("bla")])
+
     def test_symlink_next(self):
         self.make_client("d", "dc")
         import os

=== modified file 'tree.py'
--- a/tree.py	2007-03-25 22:40:54 +0000
+++ b/tree.py	2007-03-26 01:29:17 +0000
@@ -63,6 +63,8 @@
                 specific revision is being referenced.
     :param url: URL of referenced tree.
     """
+    assert ref_revnum is None or isinstance(ref_revnum, int)
+    assert revid is None or isinstance(revid, str)
     # FIXME: Use file id map
     (dir, name) = os.path.split(path)
     parent = inv[parent_id]
@@ -218,8 +220,8 @@
         if self.externals.has_key(id):
             # Add externals. This happens after all children have been added
             # as they can be grandchildren.
-            for name in self.externals[id]:
-                inventory_add_external(self.inventory, id, name, rev, url)
+            for (name, (rev, url)) in self.externals[id].items():
+                inventory_add_external(self.tree._inventory, id, name, None, rev, url)
 
     def close_file(self, path, checksum):
         file_id, revision_id = self.tree.id_map[path]
@@ -334,6 +336,13 @@
                     (subid, subrevid) = find_ids(entry)
                     if subid is not None:
                         add_file_to_inv(subrelpath, subid, subrevid, wc)
+            # Process externals
+            # FIXME: props = svn.wc.get_prop_diffs(self.workingtree.abspath(relpath), wc)
+            props = {}
+            if props.has_key(svn.core.SVN_PROP_EXTERNALS):
+                for (name, (rev, url)) in \
+                        parse_externals_description(props[svn.core.SVN_PROP_EXTERNALS]).items():
+                    inventory_add_external(self._inventory, id, name, None, rev, url)
 
         wc = workingtree._get_wc() 
         try:




More information about the bazaar-commits mailing list