22
22
interface later, they will be non blackbox tests.
25
from cStringIO import StringIO
27
26
from os import mkdir, chdir, rmdir, unlink
29
from tempfile import TemporaryFile
38
from bzrlib.osutils import pathjoin
39
from bzrlib.revisionspec import RevisionSpec
40
from bzrlib.status import show_tree_status
41
from bzrlib.tests import TestCaseWithTransport, TestSkipped
42
from bzrlib.workingtree import WorkingTree
37
from ...osutils import pathjoin
38
from ...revisionspec import RevisionSpec
39
from ...sixish import (
42
from ...status import show_tree_status
43
from .. import TestCaseWithTransport, TestSkipped
44
from ...workingtree import WorkingTree
45
47
class BranchStatus(TestCaseWithTransport):
47
def assertStatus(self, expected_lines, working_tree,
50
super(BranchStatus, self).setUp()
51
# As TestCase.setUp clears all hooks, we install this default
52
# post_status hook handler for the test.
53
status.hooks.install_named_hook('post_status',
54
status._show_shelve_summary,
57
def assertStatus(self, expected_lines, working_tree, specific_files=None,
48
58
revision=None, short=False, pending=True, verbose=False):
49
59
"""Run status in working_tree and look for output.
51
61
:param expected_lines: The lines to look for.
52
62
:param working_tree: The tree to run status in.
54
output_string = self.status_string(working_tree, revision, short,
64
output_string = self.status_string(working_tree, specific_files, revision, short,
56
66
self.assertEqual(expected_lines, output_string.splitlines(True))
58
def status_string(self, wt, revision=None, short=False, pending=True,
60
# use a real file rather than StringIO because it doesn't handle
62
tof = codecs.getwriter('utf-8')(TemporaryFile())
63
show_tree_status(wt, to_file=tof, revision=revision, short=short,
64
show_pending=pending, verbose=verbose)
66
return tof.read().decode('utf-8')
68
def status_string(self, wt, specific_files=None, revision=None,
69
short=False, pending=True, verbose=False):
70
uio = self.make_utf8_encoded_stringio()
71
show_tree_status(wt, specific_files=specific_files, to_file=uio,
72
revision=revision, short=short, show_pending=pending,
74
return uio.getvalue().decode('utf-8')
68
76
def test_branch_status(self):
69
77
"""Test basic branch status"""
218
232
self.assertStatus([
221
236
'? directory/hello.c\n'
226
241
self.assertRaises(errors.PathsDoNotExist,
227
242
show_tree_status,
228
243
wt, specific_files=['bye.c','test.c','absent.c'],
232
247
show_tree_status(wt, specific_files=['directory'], to_file=tof)
234
self.assertEquals(tof.readlines(),
249
self.assertEqual(tof.readlines(),
236
251
' directory/hello.c\n'
239
254
show_tree_status(wt, specific_files=['directory'], to_file=tof,
242
self.assertEquals(tof.readlines(), ['? directory/hello.c\n'])
257
self.assertEqual(tof.readlines(), ['? directory/hello.c\n'])
245
260
show_tree_status(wt, specific_files=['dir2'], to_file=tof)
247
self.assertEquals(tof.readlines(),
262
self.assertEqual(tof.readlines(),
252
267
show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
254
self.assertEquals(tof.readlines(), ['? dir2/\n'])
269
self.assertEqual(tof.readlines(), ['? dir2/\n'])
257
272
revs = [RevisionSpec.from_string('0'), RevisionSpec.from_string('1')]
258
273
show_tree_status(wt, specific_files=['test.c'], to_file=tof,
259
274
short=True, revision=revs)
261
self.assertEquals(tof.readlines(), ['+N test.c\n'])
276
self.assertEqual(tof.readlines(), ['+N test.c\n'])
279
show_tree_status(wt, specific_files=['missing.c'], to_file=tof)
281
self.assertEqual(tof.readlines(),
286
show_tree_status(wt, specific_files=['missing.c'], to_file=tof,
289
self.assertEqual(tof.readlines(),
263
292
def test_specific_files_conflicts(self):
264
293
tree = self.make_branch_and_tree('.')
267
296
tree.commit('added dir2')
268
297
tree.set_conflicts(conflicts.ConflictList(
269
298
[conflicts.ContentsConflict('foo')]))
271
300
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
272
301
self.assertEqualDiff('', tof.getvalue())
273
302
tree.set_conflicts(conflicts.ConflictList(
274
303
[conflicts.ContentsConflict('dir2')]))
276
305
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
277
306
self.assertEqualDiff('conflicts:\n Contents conflict in dir2\n',
280
309
tree.set_conflicts(conflicts.ConflictList(
281
310
[conflicts.ContentsConflict('dir2/file1')]))
283
312
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
284
313
self.assertEqualDiff('conflicts:\n Contents conflict in dir2/file1\n',
296
325
wt.commit('Create five empty files.')
297
open('FILE_B', 'w').write('Modification to file FILE_B.')
298
open('FILE_C', 'w').write('Modification to file FILE_C.')
326
with open('FILE_B', 'w') as f: f.write('Modification to file FILE_B.')
327
with open('FILE_C', 'w') as f: f.write('Modification to file FILE_C.')
299
328
unlink('FILE_E') # FILE_E will be versioned but missing
300
open('FILE_Q', 'w').write('FILE_Q is added but not committed.')
329
with open('FILE_Q', 'w') as f: f.write('FILE_Q is added but not committed.')
301
330
wt.add('FILE_Q') # FILE_Q will be added but not committed
302
331
open('UNVERSIONED_BUT_EXISTING', 'w')
439
468
self.assertContainsRe(err,
440
469
r'.*ERROR: Path\(s\) do not exist: '
444
473
'? UNVERSIONED_BUT_EXISTING\n',
448
477
'X NONEXISTENT\n',
450
479
out, err = self.run_bzr('status --short NONEXISTENT '
451
480
'FILE_A FILE_B UNVERSIONED_BUT_EXISTING '
452
481
'FILE_C FILE_D FILE_E FILE_Q', retcode=3)
453
self.assertEqual(expected, out.splitlines(True))
482
actual = out.splitlines(True)
484
self.assertEqual(expected, actual)
454
485
self.assertContainsRe(err,
455
486
r'.*ERROR: Path\(s\) do not exist: '
520
551
out, err = self.run_bzr('status branch1 -rbranch:branch2')
521
552
self.assertEqual('', out)
554
def test_status_with_shelves(self):
555
"""Ensure that _show_shelve_summary handler works.
557
wt = self.make_branch_and_tree('.')
558
self.build_tree(['hello.c'])
560
self.run_bzr(['shelve', '--all', '-m', 'foo'])
561
self.build_tree(['bye.c'])
566
'1 shelf exists. See "brz shelve --list" for details.\n',
569
self.run_bzr(['shelve', '--all', '-m', 'bar'])
570
self.build_tree(['eggs.c', 'spam.c'])
577
'2 shelves exist. See "brz shelve --list" for details.\n',
585
specific_files=['spam.c'])
524
588
class CheckoutStatus(BranchStatus):
579
642
self.assertContainsRe(result, "[+]N hello.txt\n")
581
644
self.build_tree(['world.txt'])
582
result = self.run_bzr("status --short -r 0")[0]
645
result = self.run_bzr("status -S -r 0")[0]
583
646
self.assertContainsRe(result, "[+]N hello.txt\n" \
584
647
"[?] world.txt\n")
585
result2 = self.run_bzr("status --short -r 0..")[0]
586
self.assertEquals(result2, result)
648
result2 = self.run_bzr("status -S -r 0..")[0]
649
self.assertEqual(result2, result)
588
651
def test_status_versioned(self):
589
652
tree = self.make_branch_and_tree('.')
727
780
return working_tree
729
782
def test_stdout_ascii(self):
730
sys.stdout = StringIO()
731
osutils._cached_user_encoding = 'ascii'
783
self.overrideAttr(osutils, '_cached_user_encoding', 'ascii')
732
784
working_tree = self.make_uncommitted_tree()
733
785
stdout, stderr = self.run_bzr("status")
735
self.assertEquals(stdout, """\
787
self.assertEqual(stdout, """\
740
792
def test_stdout_latin1(self):
741
sys.stdout = StringIO()
742
osutils._cached_user_encoding = 'latin-1'
793
self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1')
743
794
working_tree = self.make_uncommitted_tree()
744
795
stdout, stderr = self.run_bzr('status')
746
self.assertEquals(stdout, u"""\
797
self.assertEqual(stdout, u"""\
749
800
""".encode('latin-1'))