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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Black-box tests for bzr revert."""
21
21
import bzrlib.osutils
22
from bzrlib.tests import TestCaseWithTransport
22
from bzrlib.tests.blackbox import ExternalBase
23
23
from bzrlib.trace import mutter
24
24
from bzrlib.workingtree import WorkingTree
27
class TestRevert(TestCaseWithTransport):
27
class TestRevert(ExternalBase):
29
29
def _prepare_tree(self):
31
self.run_bzr('mkdir dir')
31
self.runbzr('mkdir dir')
33
33
f = file('dir/file', 'wb')
36
self.run_bzr('add dir/file')
36
self.runbzr('add dir/file')
38
self.run_bzr('commit -m1')
38
self.runbzr('commit -m1')
41
41
f = file('dir/file', 'wb')
46
self.assertEquals('modified:\n dir/file\n', self.run_bzr('status')[0])
46
self.assertEquals('modified:\n dir/file\n', self.capture('status'))
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')
53
self.run_bzr('commit -m 1')
53
self.run_bzr('commit', '-m', '1')
54
54
wt = WorkingTree.open('.')
55
55
wt.rename_one('a/b', 'f/b')
56
56
wt.rename_one('a/d/e', 'f/e')
69
self.assertEquals('1\n', self.run_bzr('revno')[0])
70
self.run_bzr('revert %s file' % param)
69
self.assertEquals('1\n', self.capture('revno'))
70
self.runbzr('revert %s file' % param)
71
71
self.assertEquals('spam', open('file', 'rb').read())
73
73
def test_revert_in_subdir(self):
84
84
self._prepare_tree()
85
self.run_bzr('checkout --lightweight . ../sprach')
86
self.run_bzr('commit -m more')
85
self.runbzr('checkout --lightweight . ../sprach')
86
self.runbzr('commit -m more')
87
87
os.chdir('../sprach')
88
self.assertEqual('', self.run_bzr('status')[0])
89
self.run_bzr('revert')
90
self.assertEqual('', self.run_bzr('status')[0])
88
self.assertEqual('', self.capture('status'))
90
self.assertEqual('', self.capture('status'))
92
92
def test_revert_dirname(self):
93
93
"""Test that revert DIRECTORY does what's expected"""
94
94
self._prepare_rename_mod_tree()
95
self.run_bzr('revert a')
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')
103
self.run_bzr('revert f')
104
self.assertPathDoesNotExist('j')
105
self.assertPathDoesNotExist('h')
106
self.assertPathExists('a/d/e')
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')
101
self.run_bzr('revert', 'f')
102
self.failIfExists('j')
103
self.failIfExists('h')
104
self.failUnlessExists('a/d/e')
108
106
def test_revert_chatter(self):
109
107
self._prepare_rename_mod_tree()
120
118
def test_revert(self):
121
119
self.run_bzr('init')
123
with file('hello', 'wt') as f: f.write('foo')
124
self.run_bzr('add hello')
125
self.run_bzr('commit -m setup hello')
127
with file('goodbye', 'wt') as f: f.write('baz')
128
self.run_bzr('add goodbye')
129
self.run_bzr('commit -m setup goodbye')
131
with file('hello', 'wt') as f: f.write('bar')
132
with file('goodbye', 'wt') as f: f.write('qux')
133
self.run_bzr('revert hello')
121
file('hello', 'wt').write('foo')
122
self.run_bzr('add', 'hello')
123
self.run_bzr('commit', '-m', 'setup', 'hello')
125
file('goodbye', 'wt').write('baz')
126
self.run_bzr('add', 'goodbye')
127
self.run_bzr('commit', '-m', 'setup', 'goodbye')
129
file('hello', 'wt').write('bar')
130
file('goodbye', 'wt').write('qux')
131
self.run_bzr('revert', 'hello')
134
132
self.check_file_contents('hello', 'foo')
135
133
self.check_file_contents('goodbye', 'qux')
136
134
self.run_bzr('revert')
137
135
self.check_file_contents('goodbye', 'baz')
139
137
os.mkdir('revertdir')
140
self.run_bzr('add revertdir')
141
self.run_bzr('commit -m f')
138
self.run_bzr('add', 'revertdir')
139
self.run_bzr('commit', '-m', 'f')
142
140
os.rmdir('revertdir')
143
141
self.run_bzr('revert')
145
143
if bzrlib.osutils.has_symlinks():
146
144
os.symlink('/unlikely/to/exist', 'symlink')
147
self.run_bzr('add symlink')
148
self.run_bzr('commit -m f')
145
self.run_bzr('add', 'symlink')
146
self.run_bzr('commit', '-m', 'f')
149
147
os.unlink('symlink')
150
148
self.run_bzr('revert')
151
self.assertPathExists('symlink')
149
self.failUnlessExists('symlink')
152
150
os.unlink('symlink')
153
151
os.symlink('a-different-path', 'symlink')
154
152
self.run_bzr('revert')
156
154
os.readlink('symlink'))
158
156
self.log("skipping revert symlink tests")
160
with file('hello', 'wt') as f: f.write('xyz')
161
self.run_bzr('commit -m xyz hello')
162
self.run_bzr('revert -r 1 hello')
158
file('hello', 'wt').write('xyz')
159
self.run_bzr('commit', '-m', 'xyz', 'hello')
160
self.run_bzr('revert', '-r', '1', 'hello')
163
161
self.check_file_contents('hello', 'foo')
164
self.run_bzr('revert hello')
162
self.run_bzr('revert', 'hello')
165
163
self.check_file_contents('hello', 'xyz')
166
164
os.chdir('revertdir')
167
165
self.run_bzr('revert')
185
183
self.build_tree(['file'])
186
184
tree.add(['file'])
187
185
tree.commit('add file')
188
out, err = self.run_bzr('revert -r -2')
186
out, err = self.run_bzr('revert', '-r', '-2')
189
187
self.assertEqual('', out)
190
188
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('.')])