Rev 384: Fix recognizing properties when reading the base revision in a subversion working copy. bzr status in a large tree (Samba) now takes ~15 seconds in http://people.samba.org/bzr/jelmer/bzr-svn/bzr.dev

Jelmer Vernooij jelmer at samba.org
Mon Jan 8 04:46:17 GMT 2007


------------------------------------------------------------
revno: 384
revision-id: jelmer at samba.org-20070108044556-wv5lracm68pkuw2d
parent: jelmer at samba.org-20070108024856-wrhdhdetx909ouzl
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: main
timestamp: Mon 2007-01-08 05:45:56 +0100
message:
  Fix recognizing properties when reading the base revision in a subversion working copy. bzr status in a large tree (Samba) now takes ~15 seconds
modified:
  checkout.py                    workingtree.py-20060306120941-b083cb0fdd4a69de
  tests/test_tree.py             test_tree.py-20070103204350-pr8nupes7e5sd2wr-1
  tree.py                        tree.py-20060624222557-dudlwqcmkf22lt2s-1
=== modified file 'checkout.py'
--- a/checkout.py	2007-01-08 02:48:56 +0000
+++ b/checkout.py	2007-01-08 04:45:56 +0000
@@ -296,8 +296,9 @@
                 else:
                     (subid, subrevid) = find_ids(entry)
                     if subid:
+                        add_file_to_inv(subrelpath, subid, subrevid, id)
+                    else:
                         mutter('no id for %r' % entry.url)
-                        add_file_to_inv(subrelpath, subid, subrevid, id)
 
         wc = self._get_wc() 
         try:

=== modified file 'tests/test_tree.py'
--- a/tests/test_tree.py	2007-01-03 22:24:00 +0000
+++ b/tests/test_tree.py	2007-01-08 04:45:56 +0000
@@ -29,9 +29,8 @@
         self.client_add("dc/file")
         self.client_set_prop("dc/file", "svn:executable", "*")
         self.client_commit("dc", "executable")
-        self.client_update("dc")
         tree = SvnBasisTree(WorkingTree.open("dc"))
-        self.assertTrue(tree.is_executable(tree.inventory.path2id("file")))
+        self.assertTrue(tree.inventory[tree.inventory.path2id("file")].executable)
 
     def test_executable_changed(self):
         repos_url = self.make_client("d", "dc")
@@ -41,7 +40,7 @@
         self.client_update("dc")
         self.client_set_prop("dc/file", "svn:executable", "*")
         tree = SvnBasisTree(WorkingTree.open("dc"))
-        self.assertFalse(tree.is_executable(tree.inventory.path2id("file")))
+        self.assertFalse(tree.inventory[tree.inventory.path2id("file")].executable)
 
     def test_symlink(self):
         repos_url = self.make_client("d", "dc")
@@ -73,3 +72,17 @@
                          tree.inventory[tree.inventory.path2id("file")].kind)
         self.assertEqual("target",
                          tree.inventory[tree.inventory.path2id("file")].symlink_target)
+
+    def test_executable_link(self):
+        repos_url = self.make_client("d", "dc")
+        import os
+        os.symlink("target", "dc/file")
+        self.build_tree({"dc/file": "x"})
+        self.client_add("dc/file")
+        self.client_set_prop("dc/file", "svn:executable", "*")
+        self.client_commit("dc", "exe1")
+        wt = WorkingTree.open("dc")
+        tree = SvnBasisTree(wt)
+        self.assertFalse(tree.inventory[tree.inventory.path2id("file")].executable)
+        self.assertFalse(wt.inventory[wt.inventory.path2id("file")].executable)
+

=== modified file 'tree.py'
--- a/tree.py	2007-01-08 02:48:56 +0000
+++ b/tree.py	2007-01-08 04:45:56 +0000
@@ -173,6 +173,7 @@
             ie.text_sha1 = None
             ie.text_size = None
             ie.text_id = None
+            ie.executable = False
         else:
             ie.text_sha1 = osutils.sha_string(file_data)
             ie.text_size = len(file_data)
@@ -203,28 +204,21 @@
         self._inventory = Inventory()
         self._repository = workingtree.branch.repository
 
-        def _get_props(relpath):
-            path = self.workingtree.abspath(relpath)
-            wc = workingtree._get_wc()
-            try:
-                return svn.wc.get_prop_diffs(path, wc)
-            finally:
-                svn.wc.adm_close(wc)
-
-        def add_file_to_inv(relpath, id, revid):
-            props = _get_props(relpath)
+        def add_file_to_inv(relpath, id, revid, wc):
+            props = svn.wc.get_prop_diffs(self.workingtree.abspath(relpath), wc)
             if props.has_key(svn.core.SVN_PROP_SPECIAL):
                 ie = self._inventory.add_path(relpath, 'symlink', id)
                 ie.symlink_target = open(self._abspath(relpath)).read()[len("link "):]
                 ie.text_sha1 = None
                 ie.text_size = None
                 ie.text_id = None
+                ie.executable = False
             else:
                 ie = self._inventory.add_path(relpath, 'file', id)
                 data = osutils.fingerprint_file(open(self._abspath(relpath)))
                 ie.text_sha1 = data['sha1']
                 ie.text_size = data['size']
-            ie.executable = props.has_key(svn.core.SVN_PROP_EXECUTABLE)
+                ie.executable = props.has_key(svn.core.SVN_PROP_EXECUTABLE)
             ie.revision = revid
             return ie
 
@@ -267,7 +261,7 @@
                 else:
                     (subid, subrevid) = find_ids(entry)
                     if subid is not None:
-                        add_file_to_inv(subrelpath, subid, subrevid)
+                        add_file_to_inv(subrelpath, subid, subrevid, wc)
 
         wc = workingtree._get_wc() 
         try:




More information about the bazaar-commits mailing list