1
# Copyright (C) 2005 Canonical Ltd
1
# Copyright (C) 2006, 2007, 2009, 2010 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Black-box tests for bzr revert."""
21
21
import bzrlib.osutils
22
from bzrlib.tests.blackbox import ExternalBase
22
from bzrlib.tests import TestCaseWithTransport
23
23
from bzrlib.trace import mutter
24
24
from bzrlib.workingtree import WorkingTree
27
class TestRevert(ExternalBase):
27
class TestRevert(TestCaseWithTransport):
29
29
def _prepare_tree(self):
30
30
self.run_bzr('init')
46
46
self.assertEquals('modified:\n dir/file\n', self.run_bzr('status')[0])
48
48
def _prepare_rename_mod_tree(self):
49
self.build_tree(['a/', 'a/b', 'a/c', 'a/d/', 'a/d/e', 'f/', 'f/g',
49
self.build_tree(['a/', 'a/b', 'a/c', 'a/d/', 'a/d/e', 'f/', 'f/g',
51
51
self.run_bzr('init')
52
52
self.run_bzr('add')
93
93
"""Test that revert DIRECTORY does what's expected"""
94
94
self._prepare_rename_mod_tree()
95
95
self.run_bzr('revert a')
96
self.failUnlessExists('a/b')
97
self.failUnlessExists('a/d')
98
self.failIfExists('a/g')
99
self.failUnlessExists('j')
100
self.failUnlessExists('h')
96
self.assertPathExists('a/b')
97
self.assertPathExists('a/d')
98
self.assertPathDoesNotExist('a/g')
100
"j is in the delta revert applies because j was renamed too",
101
self.assertPathExists, 'j')
102
self.assertPathExists('h')
101
103
self.run_bzr('revert f')
102
self.failIfExists('j')
103
self.failIfExists('h')
104
self.failUnlessExists('a/d/e')
104
self.assertPathDoesNotExist('j')
105
self.assertPathDoesNotExist('h')
106
self.assertPathExists('a/d/e')
106
108
def test_revert_chatter(self):
107
109
self._prepare_rename_mod_tree()
118
120
def test_revert(self):
119
121
self.run_bzr('init')
121
file('hello', 'wt').write('foo')
123
with file('hello', 'wt') as f: f.write('foo')
122
124
self.run_bzr('add hello')
123
125
self.run_bzr('commit -m setup hello')
125
file('goodbye', 'wt').write('baz')
127
with file('goodbye', 'wt') as f: f.write('baz')
126
128
self.run_bzr('add goodbye')
127
129
self.run_bzr('commit -m setup goodbye')
129
file('hello', 'wt').write('bar')
130
file('goodbye', 'wt').write('qux')
131
with file('hello', 'wt') as f: f.write('bar')
132
with file('goodbye', 'wt') as f: f.write('qux')
131
133
self.run_bzr('revert hello')
132
134
self.check_file_contents('hello', 'foo')
133
135
self.check_file_contents('goodbye', 'qux')
146
148
self.run_bzr('commit -m f')
147
149
os.unlink('symlink')
148
150
self.run_bzr('revert')
149
self.failUnlessExists('symlink')
151
self.assertPathExists('symlink')
150
152
os.unlink('symlink')
151
153
os.symlink('a-different-path', 'symlink')
152
154
self.run_bzr('revert')
154
156
os.readlink('symlink'))
156
158
self.log("skipping revert symlink tests")
158
file('hello', 'wt').write('xyz')
160
with file('hello', 'wt') as f: f.write('xyz')
159
161
self.run_bzr('commit -m xyz hello')
160
162
self.run_bzr('revert -r 1 hello')
161
163
self.check_file_contents('hello', 'foo')
186
188
out, err = self.run_bzr('revert -r -2')
187
189
self.assertEqual('', out)
188
190
self.assertEqual('-D file\n', err)
192
def test_revert_forget_merges(self):
193
# revert --forget-merges removes any pending merges into the tree, but
194
# leaves the files unchanged
195
tree = self.make_branch_and_tree('.')
196
# forget-merges before first commit, though pointless, does not fail
197
self.run_bzr(['revert', '--forget-merges'])
198
self.build_tree(['file'])
199
first_rev_id = tree.commit('initial commit')
200
self.build_tree_contents([('file', 'new content')])
201
existing_parents = tree.get_parent_ids()
202
self.assertEquals([first_rev_id], existing_parents)
203
merged_parents = existing_parents + ['merged-in-rev']
204
tree.set_parent_ids(merged_parents)
205
self.assertEquals(merged_parents, tree.get_parent_ids())
206
self.run_bzr(['revert', '--forget-merges'])
207
self.assertEquals([first_rev_id], tree.get_parent_ids())
208
# changed files are not reverted
209
self.assertFileEqual('new content', 'file')
210
# you can give it the path of a tree
211
self.run_bzr(['revert', '--forget-merges', tree.abspath('.')])