/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

  • Committer: Jelmer Vernooij
  • Date: 2020-05-24 00:39:50 UTC
  • mto: This revision was merged to the branch mainline in revision 7504.
  • Revision ID: jelmer@jelmer.uk-20200524003950-bbc545r76vc5yajg
Add github action.

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('.')])