/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: 2018-07-26 19:15:27 UTC
  • mto: This revision was merged to the branch mainline in revision 7055.
  • Revision ID: jelmer@jelmer.uk-20180726191527-wniq205k6tzfo1xx
Install fastimport from git.

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: f.write('foo')
 
123
        self.run_bzr('add hello')
 
124
        self.run_bzr('commit -m setup hello')
 
125
 
 
126
        with open('goodbye', 'wt') as f: f.write('baz')
 
127
        self.run_bzr('add goodbye')
 
128
        self.run_bzr('commit -m setup goodbye')
 
129
 
 
130
        with open('hello', 'wt') as f: f.write('bar')
 
131
        with open('goodbye', 'wt') as f: f.write('qux')
 
132
        self.run_bzr('revert hello')
 
133
        self.check_file_contents('hello', b'foo')
 
134
        self.check_file_contents('goodbye', b'qux')
 
135
        self.run_bzr('revert')
 
136
        self.check_file_contents('goodbye', b'baz')
 
137
 
 
138
        os.mkdir('revertdir')
 
139
        self.run_bzr('add revertdir')
 
140
        self.run_bzr('commit -m f')
 
141
        os.rmdir('revertdir')
 
142
        self.run_bzr('revert')
 
143
 
 
144
        if breezy.osutils.has_symlinks():
 
145
            os.symlink('/unlikely/to/exist', 'symlink')
 
146
            self.run_bzr('add symlink')
 
147
            self.run_bzr('commit -m f')
 
148
            os.unlink('symlink')
 
149
            self.run_bzr('revert')
 
150
            self.assertPathExists('symlink')
 
151
            os.unlink('symlink')
 
152
            os.symlink('a-different-path', 'symlink')
 
153
            self.run_bzr('revert')
 
154
            self.assertEqual('/unlikely/to/exist',
 
155
                             os.readlink('symlink'))
 
156
        else:
 
157
            self.log("skipping revert symlink tests")
 
158
 
 
159
        with open('hello', 'wt') as f: f.write('xyz')
 
160
        self.run_bzr('commit -m xyz hello')
 
161
        self.run_bzr('revert -r 1 hello')
 
162
        self.check_file_contents('hello', b'foo')
 
163
        self.run_bzr('revert hello')
 
164
        self.check_file_contents('hello', b'xyz')
 
165
        os.chdir('revertdir')
 
166
        self.run_bzr('revert')
 
167
        os.chdir('..')
 
168
 
 
169
    def test_revert_newly_added(self):
 
170
        # this tests the UI reports reverting a newly added file
 
171
        # correct (such files are not deleted)
 
172
        tree = self.make_branch_and_tree('.')
 
173
        self.build_tree(['file'])
 
174
        tree.add(['file'])
 
175
        out, err = self.run_bzr('revert')
 
176
        self.assertEqual('', out)
 
177
        self.assertEqual('-   file\n', err)
 
178
 
 
179
    def test_revert_removing_file(self):
 
180
        # this tests the UI reports reverting a file which has been committed
 
181
        # to a revision that did not have it, reports it as being deleted.
 
182
        tree = self.make_branch_and_tree('.')
 
183
        tree.commit('empty commit')
 
184
        self.build_tree(['file'])
 
185
        tree.add(['file'])
 
186
        tree.commit('add file')
 
187
        out, err = self.run_bzr('revert -r -2')
 
188
        self.assertEqual('', out)
 
189
        self.assertEqual('-D  file\n', err)
 
190
 
 
191
    def test_revert_forget_merges(self):
 
192
        # revert --forget-merges removes any pending merges into the tree, but
 
193
        # leaves the files unchanged
 
194
        tree = self.make_branch_and_tree('.')
 
195
        # forget-merges before first commit, though pointless, does not fail
 
196
        self.run_bzr(['revert', '--forget-merges'])
 
197
        self.build_tree(['file'])
 
198
        first_rev_id = tree.commit('initial commit')
 
199
        self.build_tree_contents([('file', b'new content')])
 
200
        existing_parents = tree.get_parent_ids()
 
201
        self.assertEqual([first_rev_id], existing_parents)
 
202
        merged_parents = existing_parents + [b'merged-in-rev']
 
203
        tree.set_parent_ids(merged_parents)
 
204
        self.assertEqual(merged_parents, tree.get_parent_ids())
 
205
        self.run_bzr(['revert', '--forget-merges'])
 
206
        self.assertEqual([first_rev_id], tree.get_parent_ids())
 
207
        # changed files are not reverted
 
208
        self.assertFileEqual(b'new content', 'file')
 
209
        # you can give it the path of a tree
 
210
        self.run_bzr(['revert', '--forget-merges', tree.abspath('.')])