15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
"""Black-box tests for brz cat.
18
"""Black-box tests for bzr cat.
22
from ..matchers import ContainsNoVfsCalls
23
from ...transport import memory
21
from brzlib import tests
22
from brzlib.tests.matchers import ContainsNoVfsCalls
23
from brzlib.transport import memory
26
26
class TestCat(tests.TestCaseWithTransport):
28
28
def test_cat(self):
29
29
tree = self.make_branch_and_tree('branch')
30
self.build_tree_contents([('branch/a', b'foo\n')])
30
self.build_tree_contents([('branch/a', 'foo\n')])
32
# 'brz cat' without an option should cat the last revision
32
# 'bzr cat' without an option should cat the last revision
33
33
self.run_bzr(['cat', 'a'], retcode=3, working_dir='branch')
35
35
tree.commit(message='1')
36
self.build_tree_contents([('branch/a', b'baz\n')])
36
self.build_tree_contents([('branch/a', 'baz\n')])
38
38
self.assertEqual('foo\n',
39
self.run_bzr(['cat', 'a'], working_dir='branch')[0])
39
self.run_bzr(['cat', 'a'], working_dir='branch')[0])
41
41
# On Windows, we used to have a bug where newlines got changed into
42
42
# crlf, whereas cat ought to write out the file exactly as it's
43
43
# recorded (by default.) That problem can't be reproduced in-process,
44
# so we need just one test here that
45
self.assertEqual(b'foo\n',
46
self.run_bzr_subprocess(['cat', 'a'],
47
working_dir='branch')[0])
44
# so we need just one test here that
45
self.assertEqual('foo\n',
46
self.run_bzr_subprocess(['cat', 'a'],
47
working_dir='branch')[0])
49
49
tree.commit(message='2')
59
59
rev_id = tree.branch.last_revision()
62
'baz\n', self.run_bzr(
63
['cat', 'a', '-r', 'revid:%s' % rev_id.decode('utf-8')],
64
working_dir='branch')[0])
62
'baz\n', self.run_bzr(['cat', 'a', '-r', 'revid:%s' % rev_id],
63
working_dir='branch')[0])
66
65
self.assertEqual('foo\n',
67
self.run_bzr(['cat', 'branch/a',
68
'-r', 'revno:1:branch'])[0])
66
self.run_bzr(['cat', 'branch/a',
67
'-r', 'revno:1:branch'])[0])
69
68
self.run_bzr(['cat', 'a'], retcode=3)
70
69
self.run_bzr(['cat', 'a', '-r', 'revno:1:branch-that-does-not-exist'],
78
77
# current trees later in the test case
79
78
# a-rev-tree is special because it appears in both the revision
80
79
# tree and the working tree
81
self.build_tree_contents([('a-rev-tree', b'foo\n'),
82
('c-rev', b'baz\n'), ('d-rev', b'bar\n'), ('e-rev', b'qux\n')])
83
with tree.lock_write():
80
self.build_tree_contents([('a-rev-tree', 'foo\n'),
81
('c-rev', 'baz\n'), ('d-rev', 'bar\n'), ('e-rev', 'qux\n')])
84
84
tree.add(['a-rev-tree', 'c-rev', 'd-rev', 'e-rev'])
85
tree.commit('add test files', rev_id=b'first')
85
tree.commit('add test files', rev_id='first')
86
86
# remove currently uses self._write_inventory -
87
87
# work around that for now.
90
90
tree.rename_one('a-rev-tree', 'b-tree')
91
91
tree.rename_one('c-rev', 'a-rev-tree')
92
92
tree.rename_one('e-rev', 'old-rev')
93
self.build_tree_contents([('e-rev', b'new\n')])
93
self.build_tree_contents([('e-rev', 'new\n')])
94
94
tree.add(['e-rev'])
96
# calling bzr as another process require free lock on win32
96
99
# 'b-tree' is not present in the old tree.
97
self.run_bzr_error(["^brz: ERROR: u?'b-tree' "
100
self.run_bzr_error(["^bzr: ERROR: u?'b-tree' "
98
101
"is not present in revision .+$"],
99
102
'cat b-tree --name-from-revision')
101
104
# get to the old file automatically
102
105
out, err = self.run_bzr('cat d-rev')
103
self.assertEqual('', err)
104
106
self.assertEqual('bar\n', out)
107
self.assertEqual('', err)
107
self.run_bzr('cat a-rev-tree --name-from-revision')
110
self.run_bzr('cat a-rev-tree --name-from-revision')
108
111
self.assertEqual('foo\n', out)
109
112
self.assertEqual('', err)
158
161
# subprocess because we really need to patch in a plugin that
159
162
# registers the filters. Instead, we patch in a custom
160
163
# filter_stack and use run_bzr() ...
161
from ..test_filters import _stack_2
162
from ...tree import Tree
164
from cStringIO import StringIO
165
from brzlib.commands import run_bzr
166
from brzlib.tests.test_filters import _stack_2
167
from brzlib.trace import mutter
168
from brzlib.tree import Tree
163
169
wt = self.make_branch_and_tree('.')
164
170
self.build_tree_contents([
165
('README', b"junk\nline 1 of README\nline 2 of README\n"),
171
('README', "junk\nline 1 of README\nline 2 of README\n"),
168
174
wt.commit('Making sure there is a basis_tree available')
169
175
url = self.get_readonly_url() + '/README'
170
176
real_content_filter_stack = Tree._content_filter_stack
172
177
def _custom_content_filter_stack(tree, path=None, file_id=None):
174
179
Tree._content_filter_stack = _custom_content_filter_stack
185
190
self.build_tree(['README'])
187
192
wt.commit('Making sure there is a basis_tree available')
188
wt.branch.controldir.destroy_workingtree()
193
wt.branch.bzrdir.destroy_workingtree()
190
195
url = self.get_readonly_url() + '/README'
191
196
out, err = self.run_bzr(['cat', url])
194
199
def test_cat_nonexistent_branch(self):
195
200
self.vfs_transport_factory = memory.MemoryServer
196
self.run_bzr_error(['^brz: ERROR: Not a branch'],
201
self.run_bzr_error(['^bzr: ERROR: Not a branch'],
197
202
['cat', self.get_url()])
199
204
def test_cat_directory(self):
221
226
def test_simple_branch_cat(self):
222
227
self.setup_smart_server_with_call_log()
223
228
t = self.make_branch_and_tree('branch')
224
self.build_tree_contents([('branch/foo', b'thecontents')])
229
self.build_tree_contents([('branch/foo', 'thecontents')])
226
231
t.commit("message")
227
232
self.reset_smart_call_log()