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