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