/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/tests/blackbox/test_revert.py

[merge] robertc's integration, updated tests to check for retcode=3

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006, 2007, 2009, 2010, 2011, 2016 Canonical Ltd
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
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
"""Black-box tests for brz revert."""
18
 
 
19
 
import os
20
 
 
21
 
import breezy.osutils
22
 
from breezy.tests import TestCaseWithTransport
23
 
from breezy.trace import mutter
24
 
from breezy.workingtree import WorkingTree
25
 
 
26
 
 
27
 
class TestRevert(TestCaseWithTransport):
28
 
 
29
 
    def _prepare_tree(self):
30
 
        self.run_bzr('init')
31
 
        self.run_bzr('mkdir dir')
32
 
 
33
 
        with open('dir/file', 'wb') as f:
34
 
            f.write(b'spam')
35
 
        self.run_bzr('add dir/file')
36
 
 
37
 
        self.run_bzr('commit -m1')
38
 
 
39
 
        # modify file
40
 
        with open('dir/file', 'wb') as f:
41
 
            f.write(b'eggs')
42
 
 
43
 
        # check status
44
 
        self.assertEqual('modified:\n  dir/file\n', self.run_bzr('status')[0])
45
 
 
46
 
    def _prepare_rename_mod_tree(self):
47
 
        self.build_tree(['a/', 'a/b', 'a/c', 'a/d/', 'a/d/e', 'f/', 'f/g',
48
 
                         'f/h', 'f/i'])
49
 
        self.run_bzr('init')
50
 
        self.run_bzr('add')
51
 
        self.run_bzr('commit -m 1')
52
 
        wt = WorkingTree.open('.')
53
 
        wt.rename_one('a/b', 'f/b')
54
 
        wt.rename_one('a/d/e', 'f/e')
55
 
        wt.rename_one('a/d', 'f/d')
56
 
        wt.rename_one('f/g', 'a/g')
57
 
        wt.rename_one('f/h', 'h')
58
 
        wt.rename_one('f', 'j')
59
 
 
60
 
    def helper(self, param=''):
61
 
        self._prepare_tree()
62
 
        # change dir
63
 
        # revert to default revision for file in subdir does work
64
 
        os.chdir('dir')
65
 
        mutter('cd dir\n')
66
 
 
67
 
        self.assertEqual('1\n', self.run_bzr('revno')[0])
68
 
        self.run_bzr('revert %s file' % param)
69
 
        with open('file', 'rb') as f:
70
 
            self.assertEqual(b'spam', f.read())
71
 
 
72
 
    def test_revert_in_subdir(self):
73
 
        self.helper()
74
 
 
75
 
    def test_revert_to_revision_in_subdir(self):
76
 
        # test case for bug #29424:
77
 
        # revert to specific revision for file in subdir does not work
78
 
        self.helper('-r 1')
79
 
 
80
 
    def test_revert_in_checkout(self):
81
 
        os.mkdir('brach')
82
 
        os.chdir('brach')
83
 
        self._prepare_tree()
84
 
        self.run_bzr('checkout --lightweight . ../sprach')
85
 
        self.run_bzr('commit -m more')
86
 
        os.chdir('../sprach')
87
 
        self.assertEqual('', self.run_bzr('status')[0])
88
 
        self.run_bzr('revert')
89
 
        self.assertEqual('', self.run_bzr('status')[0])
90
 
 
91
 
    def test_revert_dirname(self):
92
 
        """Test that revert DIRECTORY does what's expected"""
93
 
        self._prepare_rename_mod_tree()
94
 
        self.run_bzr('revert a')
95
 
        self.assertPathExists('a/b')
96
 
        self.assertPathExists('a/d')
97
 
        self.assertPathDoesNotExist('a/g')
98
 
        self.expectFailure(
99
 
            "j is in the delta revert applies because j was renamed too",
100
 
            self.assertPathExists, 'j')
101
 
        self.assertPathExists('h')
102
 
        self.run_bzr('revert f')
103
 
        self.assertPathDoesNotExist('j')
104
 
        self.assertPathDoesNotExist('h')
105
 
        self.assertPathExists('a/d/e')
106
 
 
107
 
    def test_revert_chatter(self):
108
 
        self._prepare_rename_mod_tree()
109
 
        chatter = self.run_bzr('revert')[1]
110
 
        self.assertEqualDiff(
111
 
            'R   a/g => f/g\n'
112
 
            'R   h => f/h\n'
113
 
            'R   j/ => f/\n'
114
 
            'R   j/b => a/b\n'
115
 
            'R   j/d/ => a/d/\n'
116
 
            'R   j/e => a/d/e\n',
117
 
            chatter)
118
 
 
119
 
    def test_revert(self):
120
 
        self.run_bzr('init')
121
 
 
122
 
        with open('hello', 'wt') as f:
123
 
            f.write('foo')
124
 
        self.run_bzr('add hello')
125
 
        self.run_bzr('commit -m setup hello')
126
 
 
127
 
        with open('goodbye', 'wt') as f:
128
 
            f.write('baz')
129
 
        self.run_bzr('add goodbye')
130
 
        self.run_bzr('commit -m setup goodbye')
131
 
 
132
 
        with open('hello', 'wt') as f:
133
 
            f.write('bar')
134
 
        with open('goodbye', 'wt') as f:
135
 
            f.write('qux')
136
 
        self.run_bzr('revert hello')
137
 
        self.check_file_contents('hello', b'foo')
138
 
        self.check_file_contents('goodbye', b'qux')
139
 
        self.run_bzr('revert')
140
 
        self.check_file_contents('goodbye', b'baz')
141
 
 
142
 
        os.mkdir('revertdir')
143
 
        self.run_bzr('add revertdir')
144
 
        self.run_bzr('commit -m f')
145
 
        os.rmdir('revertdir')
146
 
        self.run_bzr('revert')
147
 
 
148
 
        if breezy.osutils.has_symlinks():
149
 
            os.symlink('/unlikely/to/exist', 'symlink')
150
 
            self.run_bzr('add symlink')
151
 
            self.run_bzr('commit -m f')
152
 
            os.unlink('symlink')
153
 
            self.run_bzr('revert')
154
 
            self.assertPathExists('symlink')
155
 
            os.unlink('symlink')
156
 
            os.symlink('a-different-path', 'symlink')
157
 
            self.run_bzr('revert')
158
 
            self.assertEqual('/unlikely/to/exist',
159
 
                             os.readlink('symlink'))
160
 
        else:
161
 
            self.log("skipping revert symlink tests")
162
 
 
163
 
        with open('hello', 'wt') as f:
164
 
            f.write('xyz')
165
 
        self.run_bzr('commit -m xyz hello')
166
 
        self.run_bzr('revert -r 1 hello')
167
 
        self.check_file_contents('hello', b'foo')
168
 
        self.run_bzr('revert hello')
169
 
        self.check_file_contents('hello', b'xyz')
170
 
        os.chdir('revertdir')
171
 
        self.run_bzr('revert')
172
 
        os.chdir('..')
173
 
 
174
 
    def test_revert_newly_added(self):
175
 
        # this tests the UI reports reverting a newly added file
176
 
        # correct (such files are not deleted)
177
 
        tree = self.make_branch_and_tree('.')
178
 
        self.build_tree(['file'])
179
 
        tree.add(['file'])
180
 
        out, err = self.run_bzr('revert')
181
 
        self.assertEqual('', out)
182
 
        self.assertEqual('-   file\n', err)
183
 
 
184
 
    def test_revert_removing_file(self):
185
 
        # this tests the UI reports reverting a file which has been committed
186
 
        # to a revision that did not have it, reports it as being deleted.
187
 
        tree = self.make_branch_and_tree('.')
188
 
        tree.commit('empty commit')
189
 
        self.build_tree(['file'])
190
 
        tree.add(['file'])
191
 
        tree.commit('add file')
192
 
        out, err = self.run_bzr('revert -r -2')
193
 
        self.assertEqual('', out)
194
 
        self.assertEqual('-D  file\n', err)
195
 
 
196
 
    def test_revert_forget_merges(self):
197
 
        # revert --forget-merges removes any pending merges into the tree, but
198
 
        # leaves the files unchanged
199
 
        tree = self.make_branch_and_tree('.')
200
 
        # forget-merges before first commit, though pointless, does not fail
201
 
        self.run_bzr(['revert', '--forget-merges'])
202
 
        self.build_tree(['file'])
203
 
        first_rev_id = tree.commit('initial commit')
204
 
        self.build_tree_contents([('file', b'new content')])
205
 
        existing_parents = tree.get_parent_ids()
206
 
        self.assertEqual([first_rev_id], existing_parents)
207
 
        merged_parents = existing_parents + [b'merged-in-rev']
208
 
        tree.set_parent_ids(merged_parents)
209
 
        self.assertEqual(merged_parents, tree.get_parent_ids())
210
 
        self.run_bzr(['revert', '--forget-merges'])
211
 
        self.assertEqual([first_rev_id], tree.get_parent_ids())
212
 
        # changed files are not reverted
213
 
        self.assertFileEqual(b'new content', 'file')
214
 
        # you can give it the path of a tree
215
 
        self.run_bzr(['revert', '--forget-merges', tree.abspath('.')])