Rev 2913: Ensure that WT3 properly extracts the executable bit from the basis inventory. in http://bzr.arbash-meinel.com/branches/bzr/0.92-dev/dirstate_error_149113

John Arbash Meinel john at arbash-meinel.com
Tue Oct 16 23:19:29 BST 2007


At http://bzr.arbash-meinel.com/branches/bzr/0.92-dev/dirstate_error_149113

------------------------------------------------------------
revno: 2913
revision-id: john at arbash-meinel.com-20071016221259-mfm1vbvtsdoi5sac
parent: john at arbash-meinel.com-20071016211734-u0ce8cr11khccb65
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: dirstate_error_149113
timestamp: Tue 2007-10-16 17:12:59 -0500
message:
  Ensure that WT3 properly extracts the executable bit from the basis inventory.
modified:
  bzrlib/tests/test_workingtree.py testworkingtree.py-20051004024258-b88d0fe8f101d468
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
-------------- next part --------------
=== modified file 'bzrlib/tests/test_workingtree.py'
--- a/bzrlib/tests/test_workingtree.py	2007-04-13 18:45:26 +0000
+++ b/bzrlib/tests/test_workingtree.py	2007-10-16 22:12:59 +0000
@@ -219,6 +219,35 @@
         tree._control_files._transport.delete("pending-merges")
         self.assertEqual([], tree.get_parent_ids())
 
+    def test_commit_with_exec_from_basis(self):
+        tree = self.make_branch_and_tree('tree',
+                format=bzrdir.format_registry.get('knit')())
+        self.build_tree(['tree/file'])
+        tree.add(['file'], ['file-id'])
+        tree._is_executable_from_path_and_stat = \
+            tree._is_executable_from_path_and_stat_from_basis
+        rev_id1 = tree.commit('one')
+        rev_tree1 = tree.branch.repository.revision_tree(rev_id1)
+        self.assertFalse(rev_tree1.inventory['file-id'].executable)
+        tree.lock_write()
+        try:
+            tree._inventory['file-id'].executable = True
+            rev_id2 = tree.commit('two')
+        finally:
+            tree.unlock()
+        rev_tree2 = tree.branch.repository.revision_tree(rev_id2)
+        self.assertTrue(rev_tree2.inventory['file-id'].executable)
+
+        # Now set it back to False, and make sure that is preserved
+        tree.lock_write()
+        try:
+            tree._inventory['file-id'].executable = False
+            rev_id3 = tree.commit('four')
+        finally:
+            tree.unlock()
+        rev_tree3 = tree.branch.repository.revision_tree(rev_id3)
+        self.assertFalse(rev_tree3.inventory['file-id'].executable)
+
 
 class TestFormat2WorkingTree(TestCaseWithTransport):
     """Tests that are specific to format 2 trees."""

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2007-10-08 07:29:57 +0000
+++ b/bzrlib/workingtree.py	2007-10-16 22:12:59 +0000
@@ -599,9 +599,20 @@
             path = self.inventory.id2path(file_id)
         return os.lstat(self.abspath(path)).st_mtime
 
+    def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):
+        file_id = self.path2id(path)
+        return self._inventory[file_id].executable
+
+    def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
+        mode = stat_result.st_mode
+        return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
+
     if not supports_executable():
         def is_executable(self, file_id, path=None):
             return self._inventory[file_id].executable
+
+        _is_executable_from_path_and_stat = \
+            _is_executable_from_path_and_stat_from_stat
     else:
         def is_executable(self, file_id, path=None):
             if not path:
@@ -609,6 +620,9 @@
             mode = os.lstat(self.abspath(path)).st_mode
             return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
 
+        _is_executable_from_path_and_stat = \
+            _is_executable_from_path_and_stat_from_basis
+
     @needs_tree_write_lock
     def _add(self, files, ids, kinds):
         """See MutableTree._add."""
@@ -705,11 +719,7 @@
         if kind == 'file':
             size = stat_result.st_size
             # try for a stat cache lookup
-            if not supports_executable():
-                executable = None # caller can decide policy.
-            else:
-                mode = stat_result.st_mode
-                executable = bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
+            executable = self._is_executable_from_path_and_stat(path, stat_result)
             return (kind, size, executable, self._sha_from_stat(
                 path, stat_result))
         elif kind == 'directory':



More information about the bazaar-commits mailing list