/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
6614.1.3 by Vincent Ladeuil
Fix assertEquals being deprecated by using assertEqual.
1
# Copyright (C) 2006, 2007, 2009, 2011, 2012, 2016 Canonical Ltd
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
16
17
"""Test the executable bit under various working tree formats."""
18
19
import os
20
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
21
from breezy import (
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
22
    osutils,
23
    )
6622.1.34 by Jelmer Vernooij
Rename brzlib => breezy.
24
from breezy.tests.per_workingtree import TestCaseWithWorkingTree
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
25
26
27
class TestExecutable(TestCaseWithWorkingTree):
28
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
29
    def setUp(self):
30
        super(TestExecutable, self).setUp()
6963.2.4 by Jelmer Vernooij
Add bees.
31
        self.a_id = b"a-20051208024829-849e76f7968d7a86"
32
        self.b_id = b"b-20051208024829-849e76f7968d7a86"
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
33
        wt = self.make_branch_and_tree('b1')
34
        b = wt.branch
7350.3.1 by Jelmer Vernooij
Add Tree.get_transform.
35
        tt = wt.get_transform()
6973.9.1 by Jelmer Vernooij
More test fixes.
36
        tt.new_file('a', tt.root, [b'a test\n'], self.a_id, True)
37
        tt.new_file('b', tt.root, [b'b test\n'], self.b_id, False)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
38
        tt.apply()
39
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
40
        self.wt = wt
41
42
    def check_exist(self, tree):
43
        """Just check that both files have the right executable bits set"""
2255.2.35 by Robert Collins
Remove inappropriate use of inventory in tree executability tests. The inventory is not the authoritative source of executability.
44
        tree.lock_read()
6963.2.4 by Jelmer Vernooij
Add bees.
45
        self.assertTrue(tree.is_executable('a'), "'a' lost the execute bit")
46
        self.assertFalse(tree.is_executable('b'), "'b' gained an execute bit")
2255.2.35 by Robert Collins
Remove inappropriate use of inventory in tree executability tests. The inventory is not the authoritative source of executability.
47
        tree.unlock()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
48
49
    def check_empty(self, tree, ignore_inv=False):
50
        """Check that the files are truly missing
51
        :param ignore_inv: If you just delete files from a working tree
52
                the inventory still shows them, so don't assert that
53
                the inventory is empty, just that the tree doesn't have them
54
        """
2255.2.36 by Robert Collins
Fix Dirstate unversioning of entries which are in a parent.
55
        tree.lock_read()
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
56
        if not ignore_inv and getattr(tree, 'root_inventory', None):
1852.6.6 by Robert Collins
Finish updating iter_entries change to make all tests pass.
57
            self.assertEqual(
6405.2.10 by Jelmer Vernooij
Fix more tests.
58
                [('', tree.root_inventory.root)],
59
                list(tree.root_inventory.iter_entries()))
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
60
        self.assertFalse(tree.has_id(self.a_id))
61
        self.assertFalse(tree.has_filename('a'))
62
        self.assertFalse(tree.has_id(self.b_id))
63
        self.assertFalse(tree.has_filename('b'))
2255.2.36 by Robert Collins
Fix Dirstate unversioning of entries which are in a parent.
64
        tree.unlock()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
65
66
    def commit_and_branch(self):
67
        """Commit the current tree, and create a second tree"""
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
68
        r1 = self.wt.commit('adding a,b')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
69
        # Now make sure that 'bzr branch' also preserves the
70
        # executable bit
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
71
        dir2 = self.wt.branch.controldir.sprout('b2', revision_id=r1)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
72
        wt2 = dir2.open_workingtree()
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
73
        self.assertEqual([r1], wt2.get_parent_ids())
74
        self.assertEqual(r1, wt2.branch.last_revision())
6876.5.3 by Jelmer Vernooij
Fix test_executable test.
75
        return wt2, r1
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
76
77
    def test_01_is_executable(self):
78
        """Make sure that the tree was created and has the executable bit set"""
79
        self.check_exist(self.wt)
80
81
    def test_02_stays_executable(self):
82
        """reopen the tree and ensure it stuck."""
6653.6.1 by Jelmer Vernooij
Rename a number of attributes from bzrdir to controldir.
83
        self.wt = self.wt.controldir.open_workingtree()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
84
        self.check_exist(self.wt)
85
86
    def test_03_after_commit(self):
87
        """Commit the change, and check the history"""
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
88
        r1 = self.wt.commit('adding a,b')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
89
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
90
        rev_tree = self.wt.branch.repository.revision_tree(r1)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
91
        self.check_exist(rev_tree)
92
93
    def test_04_after_removed(self):
94
        """Make sure reverting removed files brings them back correctly"""
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
95
        r1 = self.wt.commit('adding a,b')
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
96
97
        # Make sure the entries are gone
98
        os.remove('b1/a')
99
        os.remove('b1/b')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
100
        self.check_empty(self.wt, ignore_inv=True)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
101
102
        # Make sure that revert is able to bring them back,
103
        # and sets 'a' back to being executable
104
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
105
        rev_tree = self.wt.branch.repository.revision_tree(r1)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
106
107
        self.wt.revert(['a', 'b'], rev_tree, backups=False)
108
        self.check_exist(self.wt)
109
110
    def test_05_removed_and_committed(self):
111
        """Check that reverting to an earlier commit restores them"""
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
112
        r1 = self.wt.commit('adding a,b')
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
113
114
        # Now remove them again, and make sure that after a
115
        # commit, they are still marked correctly
116
        os.remove('b1/a')
117
        os.remove('b1/b')
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
118
        r2 = self.wt.commit('removed')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
119
120
        self.check_empty(self.wt)
121
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
122
        rev_tree = self.wt.branch.repository.revision_tree(r1)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
123
        # Now revert back to the previous commit
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
124
        self.wt.revert(old_tree=rev_tree, backups=False)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
125
126
        self.check_exist(self.wt)
127
128
    def test_06_branch(self):
129
        """branch b1=>b2 should preserve the executable bits"""
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
130
        # TODO: Maybe this should be a blackbox test
6876.5.3 by Jelmer Vernooij
Fix test_executable test.
131
        wt2, r1 = self.commit_and_branch()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
132
133
        self.check_exist(wt2)
134
135
    def test_07_pull(self):
136
        """Test that pull will handle bits correctly"""
6876.5.3 by Jelmer Vernooij
Fix test_executable test.
137
        wt2, r1 = self.commit_and_branch()
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
138
139
        os.remove('b1/a')
140
        os.remove('b1/b')
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
141
        r2 = self.wt.commit('removed')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
142
143
        # now wt2 can pull and the files should be removed
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
144
145
        # Make sure pull will delete the files
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
146
        wt2.pull(self.wt.branch)
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
147
        self.assertEqual([r2], wt2.get_parent_ids())
148
        self.assertEqual(r2, wt2.branch.last_revision())
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
149
        self.check_empty(wt2)
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
150
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
151
        # Now restore the files on the first branch and commit
1711.4.30 by John Arbash Meinel
Don't peak under the covers, and test all working tree implementations for executable success (suggested by Robert Collins)
152
        # so that the second branch can pull the changes
153
        # and make sure that the executable bit has been copied
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
154
        rev_tree = self.wt.branch.repository.revision_tree(r1)
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
155
        self.wt.revert(old_tree=rev_tree, backups=False)
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
156
        r3 = self.wt.commit('resurrected')
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
157
158
        self.check_exist(self.wt)
159
160
        wt2.pull(self.wt.branch)
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
161
        self.assertEqual([r3], wt2.get_parent_ids())
162
        self.assertEqual(r3, wt2.branch.last_revision())
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
163
        self.check_exist(wt2)
164
165
    def test_08_no_op_revert(self):
166
        """Just do a simple revert without anything changed
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
167
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
168
        The bits shouldn't swap.
169
        """
6876.5.1 by Jelmer Vernooij
Avoid passing in revision ids if possible.
170
        r1 = self.wt.commit('adding a,b')
171
        rev_tree = self.wt.branch.repository.revision_tree(r1)
2748.3.2 by Aaron Bentley
Fix revert, remove-tree, and various tests to use None for 'no files specified'
172
        self.wt.revert(old_tree=rev_tree, backups=False)
1711.4.33 by John Arbash Meinel
By Martin's suggestion, break the long test into lots of small ones.
173
        self.check_exist(self.wt)
174
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
175
    def test_commit_with_exec_from_basis(self):
176
        self.wt._is_executable_from_path_and_stat = \
177
            self.wt._is_executable_from_path_and_stat_from_basis
178
        rev_id1 = self.wt.commit('one')
179
        rev_tree1 = self.wt.branch.repository.revision_tree(rev_id1)
6913.3.4 by Jelmer Vernooij
Avoid use of inventory and file ids.
180
        a_executable = rev_tree1.is_executable('a')
181
        b_executable = rev_tree1.is_executable('b')
2911.5.4 by John Arbash Meinel
Switch around to properly look up the executable bit in the basis.
182
        self.assertIsNot(None, a_executable)
183
        self.assertTrue(a_executable)
184
        self.assertIsNot(None, b_executable)
185
        self.assertFalse(b_executable)
186
187
    def test_use_exec_from_basis(self):
6379.7.3 by Jelmer Vernooij
Fix test_use_exec_from_basis
188
        self.wt._supports_executable = lambda: False
189
        self.addCleanup(self.wt.lock_read().unlock)
6809.4.4 by Jelmer Vernooij
Swap arguments for Tree.is_executable.
190
        self.assertTrue(self.wt.is_executable('a'))
191
        self.assertFalse(self.wt.is_executable('b'))