1
# Copyright (C) 2005-2012, 2016 Canonical Ltd
1
# Copyright (C) 2005 by 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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
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
18
"""Tests of status command.
19
20
Most of these depend on the particular formatting used.
20
As such they really are blackbox tests even though some of the
21
tests are not using self.capture. If we add tests for the programmatic
22
interface later, they will be non blackbox tests.
26
from os import mkdir, chdir, rmdir, unlink
35
from breezy.bzr import (
39
from ...osutils import pathjoin
40
from ...revisionspec import RevisionSpec
41
from ...sixish import (
46
from ...status import show_tree_status
47
from .. import TestCaseWithTransport, TestSkipped
48
from ...workingtree import WorkingTree
51
class BranchStatus(TestCaseWithTransport):
54
super(BranchStatus, self).setUp()
55
# As TestCase.setUp clears all hooks, we install this default
56
# post_status hook handler for the test.
57
status.hooks.install_named_hook('post_status',
58
status._show_shelve_summary,
61
def assertStatus(self, expected_lines, working_tree, specific_files=None,
62
revision=None, short=False, pending=True, verbose=False):
63
"""Run status in working_tree and look for output.
65
:param expected_lines: The lines to look for.
66
:param working_tree: The tree to run status in.
68
output_string = self.status_string(working_tree, specific_files, revision, short,
70
self.assertEqual(expected_lines, output_string.splitlines(True))
72
def status_string(self, wt, specific_files=None, revision=None,
73
short=False, pending=True, verbose=False):
74
uio = self.make_utf8_encoded_stringio()
75
show_tree_status(wt, specific_files=specific_files, to_file=uio,
76
revision=revision, short=short, show_pending=pending,
78
return uio.getvalue().decode('utf-8')
80
def test_branch_status(self):
24
from bzrlib.selftest import TestCaseInTempDir
25
from bzrlib.revisionspec import RevisionSpec
26
from bzrlib.merge import merge
27
from cStringIO import StringIO
28
from bzrlib.status import show_status
29
from bzrlib.branch import Branch
31
from bzrlib.clone import copy_branch
33
class BranchStatus(TestCaseInTempDir):
35
def test_branch_status(self):
81
36
"""Test basic branch status"""
82
wt = self.make_branch_and_tree('.')
84
# status with no commits or files - it must
85
# work and show no output. We do this with no
86
# commits to be sure that it's not going to fail
88
self.assertStatus([], wt)
37
from cStringIO import StringIO
38
from bzrlib.status import show_status
39
from bzrlib.branch import Branch
41
b = Branch.initialize('.')
45
show_status(b, to_file=tof)
46
self.assertEquals(tof.getvalue(), "")
90
49
self.build_tree(['hello.c', 'bye.c'])
103
# add a commit to allow showing pending merges.
104
wt.commit('create a parent to allow testing merge output')
106
wt.add_parent_tree_id(b'pending@pending-0-0')
111
'pending merge tips: (use -v to see all merge revisions)\n',
112
' (ghost) pending@pending-0-0\n',
120
' (ghost) pending@pending-0-0\n',
126
'P (ghost) pending@pending-0-0\n',
139
wt, short=True, pending=False)
50
b.working_tree().add_pending_merge('pending@pending-0-0')
51
show_status(b, to_file=tof)
53
self.assertEquals(tof.readlines(),
58
' pending@pending-0-0\n'
141
61
def test_branch_status_revisions(self):
142
62
"""Tests branch status with revisions"""
143
wt = self.make_branch_and_tree('.')
64
b = Branch.initialize('.')
145
67
self.build_tree(['hello.c', 'bye.c'])
148
wt.commit('Test message')
70
b.working_tree().commit('Test message')
150
revs = [RevisionSpec.from_string('0')]
74
revs.append(RevisionSpec(0))
76
show_status(b, to_file=tof, revision=revs)
79
self.assertEquals(tof.readlines(),
159
84
self.build_tree(['more.c'])
161
wt.commit('Another test message')
86
b.working_tree().commit('Another test message')
89
revs.append(RevisionSpec(1))
91
show_status(b, to_file=tof, revision=revs)
94
self.assertEquals(tof.readlines(),
163
revs.append(RevisionSpec.from_string('1'))
99
def status_string(self, branch):
101
show_status(branch, to_file=tof)
103
return tof.getvalue()
172
105
def test_pending(self):
173
"""Pending merges display works, including Unicode"""
106
"""Pending merges display works"""
174
107
mkdir("./branch")
175
wt = self.make_branch_and_tree('branch')
177
wt.commit("Empty commit 1")
178
b_2_dir = b.controldir.sprout('./copy')
179
b_2 = b_2_dir.open_branch()
180
wt2 = b_2_dir.open_workingtree()
181
wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
182
wt2.merge_from_branch(wt.branch)
183
message = self.status_string(wt2, verbose=True)
184
self.assertStartsWith(message, "pending merges:\n")
185
self.assertEndsWith(message, "Empty commit 2\n")
108
b = Branch.initialize('./branch')
109
b.working_tree().commit("Empty commit 1")
110
b_2 = copy_branch(b, './copy')
111
b.working_tree().commit("Empty commit 2")
112
merge(["./branch", -1], [None, None], this_dir = './copy')
113
message = self.status_string(b_2)
114
self.assert_(message.startswith("pending merges:\n"))
115
self.assert_(message.endswith("Empty commit 2\n"))
116
b_2.working_tree().commit("merged")
187
117
# must be long to make sure we see elipsis at the end
188
wt.commit("Empty commit 3 "
189
+ "blah blah blah blah " * 100)
190
wt2.merge_from_branch(wt.branch)
191
message = self.status_string(wt2, verbose=True)
192
self.assertStartsWith(message, "pending merges:\n")
193
self.assertTrue("Empty commit 3" in message)
194
self.assertEndsWith(message, "...\n")
196
def test_tree_status_ignores(self):
197
"""Tests branch status with ignores"""
198
wt = self.make_branch_and_tree('.')
199
self.run_bzr('ignore *~')
200
wt.commit('commit .bzrignore')
201
self.build_tree(['foo.c', 'foo.c~'])
212
def test_tree_status_specific_files(self):
118
b.working_tree().commit("Empty commit 3 blah blah blah blah blah blah blah blah blah"
119
" blah blah blah blah blah blah bleh")
120
merge(["./branch", -1], [None, None], this_dir = './copy')
121
message = self.status_string(b_2)
122
self.assert_(message.startswith("pending merges:\n"))
123
self.assert_("Empty commit 3" in message)
124
self.assert_(message.endswith("...\n"))
126
def test_branch_status_specific_files(self):
213
127
"""Tests branch status with given specific files"""
214
wt = self.make_branch_and_tree('.')
217
self.build_tree(['directory/', 'directory/hello.c',
218
'bye.c', 'test.c', 'dir2/',
232
' directory/hello.c\n'
239
'? directory/hello.c\n',
245
self.assertRaises(errors.PathsDoNotExist,
247
wt, specific_files=['bye.c', 'test.c', 'absent.c'],
251
show_tree_status(wt, specific_files=['directory'], to_file=tof)
253
self.assertEqual(tof.readlines(),
255
' directory/hello.c\n'
258
show_tree_status(wt, specific_files=['directory'], to_file=tof,
261
self.assertEqual(tof.readlines(), ['? directory/hello.c\n'])
264
show_tree_status(wt, specific_files=['dir2'], to_file=tof)
266
self.assertEqual(tof.readlines(),
271
show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
273
self.assertEqual(tof.readlines(), ['? dir2/\n'])
276
revs = [RevisionSpec.from_string('0'), RevisionSpec.from_string('1')]
277
show_tree_status(wt, specific_files=['test.c'], to_file=tof,
278
short=True, revision=revs)
280
self.assertEqual(tof.readlines(), ['+N test.c\n'])
283
show_tree_status(wt, specific_files=['missing.c'], to_file=tof)
285
self.assertEqual(tof.readlines(),
290
show_tree_status(wt, specific_files=['missing.c'], to_file=tof,
293
self.assertEqual(tof.readlines(),
296
def test_specific_files_conflicts(self):
297
tree = self.make_branch_and_tree('.')
298
self.build_tree(['dir2/'])
300
tree.commit('added dir2')
301
tree.set_conflicts(conflicts.ConflictList(
302
[conflicts.ContentsConflict('foo')]))
304
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
305
self.assertEqualDiff(b'', tof.getvalue())
306
tree.set_conflicts(conflicts.ConflictList(
307
[conflicts.ContentsConflict('dir2')]))
309
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
310
self.assertEqualDiff('conflicts:\n Contents conflict in dir2\n',
313
tree.set_conflicts(conflicts.ConflictList(
314
[conflicts.ContentsConflict('dir2/file1')]))
316
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
317
self.assertEqualDiff('conflicts:\n Contents conflict in dir2/file1\n',
320
def _prepare_nonexistent(self):
321
wt = self.make_branch_and_tree('.')
322
self.assertStatus([], wt)
323
self.build_tree(['FILE_A', 'FILE_B', 'FILE_C', 'FILE_D', 'FILE_E', ])
329
wt.commit('Create five empty files.')
330
with open('FILE_B', 'w') as f:
331
f.write('Modification to file FILE_B.')
332
with open('FILE_C', 'w') as f:
333
f.write('Modification to file FILE_C.')
334
unlink('FILE_E') # FILE_E will be versioned but missing
335
with open('FILE_Q', 'w') as f:
336
f.write('FILE_Q is added but not committed.')
337
wt.add('FILE_Q') # FILE_Q will be added but not committed
338
open('UNVERSIONED_BUT_EXISTING', 'w')
341
def test_status_nonexistent_file(self):
342
# files that don't exist in either the basis tree or working tree
343
# should give an error
344
wt = self._prepare_nonexistent()
354
' UNVERSIONED_BUT_EXISTING\n',
362
'? UNVERSIONED_BUT_EXISTING\n',
366
# Okay, everything's looking good with the existent files.
367
# Let's see what happens when we throw in non-existent files.
369
# brz st [--short] NONEXISTENT '
374
out, err = self.run_bzr('status NONEXISTENT', retcode=3)
375
self.assertEqual(expected, out.splitlines(True))
376
self.assertContainsRe(err,
377
r'.*ERROR: Path\(s\) do not exist: '
382
out, err = self.run_bzr('status --short NONEXISTENT', retcode=3)
383
self.assertContainsRe(err,
384
r'.*ERROR: Path\(s\) do not exist: '
387
def test_status_nonexistent_file_with_others(self):
388
# brz st [--short] NONEXISTENT ...others..
389
wt = self._prepare_nonexistent()
399
out, err = self.run_bzr('status NONEXISTENT '
400
'FILE_A FILE_B FILE_C FILE_D FILE_E',
402
self.assertEqual(expected, out.splitlines(True))
403
self.assertContainsRe(err,
404
r'.*ERROR: Path\(s\) do not exist: '
412
out, err = self.run_bzr('status --short NONEXISTENT '
413
'FILE_A FILE_B FILE_C FILE_D FILE_E',
415
self.assertEqual(expected, out.splitlines(True))
416
self.assertContainsRe(err,
417
r'.*ERROR: Path\(s\) do not exist: '
420
def test_status_multiple_nonexistent_files(self):
421
# brz st [--short] NONEXISTENT ... ANOTHER_NONEXISTENT ...
422
wt = self._prepare_nonexistent()
430
' ANOTHER_NONEXISTENT\n',
433
out, err = self.run_bzr('status NONEXISTENT '
434
'FILE_A FILE_B ANOTHER_NONEXISTENT '
435
'FILE_C FILE_D FILE_E', retcode=3)
436
self.assertEqual(expected, out.splitlines(True))
437
self.assertContainsRe(err,
438
r'.*ERROR: Path\(s\) do not exist: '
439
'ANOTHER_NONEXISTENT NONEXISTENT.*')
444
'X ANOTHER_NONEXISTENT\n',
447
out, err = self.run_bzr('status --short NONEXISTENT '
448
'FILE_A FILE_B ANOTHER_NONEXISTENT '
449
'FILE_C FILE_D FILE_E', retcode=3)
450
self.assertEqual(expected, out.splitlines(True))
451
self.assertContainsRe(err,
452
r'.*ERROR: Path\(s\) do not exist: '
453
'ANOTHER_NONEXISTENT NONEXISTENT.*')
455
def test_status_nonexistent_file_with_unversioned(self):
456
# brz st [--short] NONEXISTENT A B UNVERSIONED_BUT_EXISTING C D E Q
457
wt = self._prepare_nonexistent()
467
' UNVERSIONED_BUT_EXISTING\n',
471
out, err = self.run_bzr('status NONEXISTENT '
472
'FILE_A FILE_B UNVERSIONED_BUT_EXISTING '
473
'FILE_C FILE_D FILE_E FILE_Q', retcode=3)
474
self.assertEqual(expected, out.splitlines(True))
475
self.assertContainsRe(err,
476
r'.*ERROR: Path\(s\) do not exist: '
480
'? UNVERSIONED_BUT_EXISTING\n',
486
out, err = self.run_bzr('status --short NONEXISTENT '
487
'FILE_A FILE_B UNVERSIONED_BUT_EXISTING '
488
'FILE_C FILE_D FILE_E FILE_Q', retcode=3)
489
actual = out.splitlines(True)
491
self.assertEqual(expected, actual)
492
self.assertContainsRe(err,
493
r'.*ERROR: Path\(s\) do not exist: '
496
def test_status_out_of_date(self):
497
"""Simulate status of out-of-date tree after remote push"""
498
tree = self.make_branch_and_tree('.')
499
self.build_tree_contents([('a', b'foo\n')])
500
with tree.lock_write():
502
tree.commit('add test file')
503
# simulate what happens after a remote push
504
tree.set_last_revision(b"0")
505
out, err = self.run_bzr('status')
506
self.assertEqual("working tree is out of date, run 'brz update'\n",
509
def test_status_on_ignored(self):
510
"""Tests branch status on an unversioned file which is considered ignored.
512
See https://bugs.launchpad.net/bzr/+bug/40103
514
tree = self.make_branch_and_tree('.')
516
self.build_tree(['test1.c', 'test1.c~', 'test2.c~'])
517
result = self.run_bzr('status')[0]
518
self.assertContainsRe(result, "unknown:\n test1.c\n")
519
short_result = self.run_bzr('status --short')[0]
520
self.assertContainsRe(short_result, "\\? test1.c\n")
522
result = self.run_bzr('status test1.c')[0]
523
self.assertContainsRe(result, "unknown:\n test1.c\n")
524
short_result = self.run_bzr('status --short test1.c')[0]
525
self.assertContainsRe(short_result, "\\? test1.c\n")
527
result = self.run_bzr('status test1.c~')[0]
528
self.assertContainsRe(result, "ignored:\n test1.c~\n")
529
short_result = self.run_bzr('status --short test1.c~')[0]
530
self.assertContainsRe(short_result, "I test1.c~\n")
532
result = self.run_bzr('status test1.c~ test2.c~')[0]
533
self.assertContainsRe(result, "ignored:\n test1.c~\n test2.c~\n")
534
short_result = self.run_bzr('status --short test1.c~ test2.c~')[0]
535
self.assertContainsRe(short_result, "I test1.c~\nI test2.c~\n")
537
result = self.run_bzr('status test1.c test1.c~ test2.c~')[0]
538
self.assertContainsRe(
539
result, "unknown:\n test1.c\nignored:\n test1.c~\n test2.c~\n")
540
short_result = self.run_bzr(
541
'status --short test1.c test1.c~ test2.c~')[0]
542
self.assertContainsRe(
543
short_result, "\\? test1.c\nI test1.c~\nI test2.c~\n")
545
def test_status_write_lock(self):
546
"""Test that status works without fetching history and
549
See https://bugs.launchpad.net/bzr/+bug/149270
552
wt = self.make_branch_and_tree('branch1')
554
wt.commit('Empty commit 1')
555
wt2 = b.controldir.sprout('branch2').open_workingtree()
556
wt2.commit('Empty commit 2')
557
out, err = self.run_bzr('status branch1 -rbranch:branch2')
558
self.assertEqual('', out)
560
def test_status_with_shelves(self):
561
"""Ensure that _show_shelve_summary handler works.
563
wt = self.make_branch_and_tree('.')
564
self.build_tree(['hello.c'])
566
self.run_bzr(['shelve', '--all', '-m', 'foo'])
567
self.build_tree(['bye.c'])
572
'1 shelf exists. See "brz shelve --list" for details.\n',
575
self.run_bzr(['shelve', '--all', '-m', 'bar'])
576
self.build_tree(['eggs.c', 'spam.c'])
583
'2 shelves exist. See "brz shelve --list" for details.\n',
591
specific_files=['spam.c'])
594
class CheckoutStatus(BranchStatus):
597
super(CheckoutStatus, self).setUp()
601
def make_branch_and_tree(self, relpath):
602
source = self.make_branch(pathjoin('..', relpath))
603
checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
604
checkout.set_branch_reference(source)
605
return checkout.create_workingtree()
608
class TestStatus(TestCaseWithTransport):
610
def test_status_plain(self):
611
tree = self.make_branch_and_tree('.')
613
self.build_tree(['hello.txt'])
614
result = self.run_bzr("status")[0]
615
self.assertContainsRe(result, "unknown:\n hello.txt\n")
617
tree.add("hello.txt")
618
result = self.run_bzr("status")[0]
619
self.assertContainsRe(result, "added:\n hello.txt\n")
621
tree.commit(message="added")
622
result = self.run_bzr("status -r 0..1")[0]
623
self.assertContainsRe(result, "added:\n hello.txt\n")
625
result = self.run_bzr("status -c 1")[0]
626
self.assertContainsRe(result, "added:\n hello.txt\n")
628
self.build_tree(['world.txt'])
629
result = self.run_bzr("status -r 0")[0]
630
self.assertContainsRe(result, "added:\n hello.txt\n"
631
"unknown:\n world.txt\n")
632
result2 = self.run_bzr("status -r 0..")[0]
633
self.assertEqual(result2, result)
635
def test_status_short(self):
636
tree = self.make_branch_and_tree('.')
638
self.build_tree(['hello.txt'])
639
result = self.run_bzr("status --short")[0]
640
self.assertContainsRe(result, "[?] hello.txt\n")
642
tree.add("hello.txt")
643
result = self.run_bzr("status --short")[0]
644
self.assertContainsRe(result, "[+]N hello.txt\n")
646
tree.commit(message="added")
647
result = self.run_bzr("status --short -r 0..1")[0]
648
self.assertContainsRe(result, "[+]N hello.txt\n")
650
self.build_tree(['world.txt'])
651
result = self.run_bzr("status -S -r 0")[0]
652
self.assertContainsRe(result, "[+]N hello.txt\n"
654
result2 = self.run_bzr("status -S -r 0..")[0]
655
self.assertEqual(result2, result)
657
def test_status_versioned(self):
658
tree = self.make_branch_and_tree('.')
660
self.build_tree(['hello.txt'])
661
result = self.run_bzr("status --versioned")[0]
662
self.assertNotContainsRe(result, "unknown:\n hello.txt\n")
664
tree.add("hello.txt")
665
result = self.run_bzr("status --versioned")[0]
666
self.assertContainsRe(result, "added:\n hello.txt\n")
669
result = self.run_bzr("status --versioned -r 0..1")[0]
670
self.assertContainsRe(result, "added:\n hello.txt\n")
672
self.build_tree(['world.txt'])
673
result = self.run_bzr("status --versioned -r 0")[0]
674
self.assertContainsRe(result, "added:\n hello.txt\n")
675
self.assertNotContainsRe(result, "unknown:\n world.txt\n")
676
result2 = self.run_bzr("status --versioned -r 0..")[0]
677
self.assertEqual(result2, result)
679
def test_status_SV(self):
680
tree = self.make_branch_and_tree('.')
682
self.build_tree(['hello.txt'])
683
result = self.run_bzr("status -SV")[0]
684
self.assertNotContainsRe(result, "hello.txt")
686
tree.add("hello.txt")
687
result = self.run_bzr("status -SV")[0]
688
self.assertContainsRe(result, "[+]N hello.txt\n")
690
tree.commit(message="added")
691
result = self.run_bzr("status -SV -r 0..1")[0]
692
self.assertContainsRe(result, "[+]N hello.txt\n")
694
self.build_tree(['world.txt'])
695
result = self.run_bzr("status -SV -r 0")[0]
696
self.assertContainsRe(result, "[+]N hello.txt\n")
698
result2 = self.run_bzr("status -SV -r 0..")[0]
699
self.assertEqual(result2, result)
701
def assertStatusContains(self, pattern, short=False):
702
"""Run status, and assert it contains the given pattern"""
704
result = self.run_bzr("status --short")[0]
706
result = self.run_bzr("status")[0]
707
self.assertContainsRe(result, pattern)
709
def test_kind_change_plain(self):
710
tree = self.make_branch_and_tree('.')
711
self.build_tree(['file'])
713
tree.commit('added file')
715
self.build_tree(['file/'])
716
self.assertStatusContains(
717
'kind changed:\n file \\(file => directory\\)')
718
tree.rename_one('file', 'directory')
719
self.assertStatusContains('renamed:\n file => directory/\n'
720
'modified:\n directory/\n')
722
self.assertStatusContains('removed:\n file\n')
724
def test_kind_change_short(self):
725
tree = self.make_branch_and_tree('.')
726
self.build_tree(['file'])
728
tree.commit('added file')
730
self.build_tree(['file/'])
731
self.assertStatusContains('K file => file/',
733
tree.rename_one('file', 'directory')
734
self.assertStatusContains('RK file => directory/',
737
self.assertStatusContains('RD file => directory',
740
def test_status_illegal_revision_specifiers(self):
741
out, err = self.run_bzr('status -r 1..23..123', retcode=3)
742
self.assertContainsRe(err, 'one or two revision specifiers')
744
def test_status_no_pending(self):
745
a_tree = self.make_branch_and_tree('a')
746
self.build_tree(['a/a'])
749
b_tree = a_tree.controldir.sprout('b').open_workingtree()
750
self.build_tree(['b/b'])
754
self.run_bzr('merge ../b', working_dir='a')
755
out, err = self.run_bzr('status --no-pending', working_dir='a')
756
self.assertEqual(out, "added:\n b\n")
758
def test_pending_specific_files(self):
759
"""With a specific file list, pending merges are not shown."""
760
tree = self.make_branch_and_tree('tree')
761
self.build_tree_contents([('tree/a', b'content of a\n')])
763
r1_id = tree.commit('one')
764
alt = tree.controldir.sprout('alt').open_workingtree()
765
self.build_tree_contents([('alt/a', b'content of a\nfrom alt\n')])
766
alt_id = alt.commit('alt')
767
tree.merge_from_branch(alt.branch)
768
output = self.make_utf8_encoded_stringio()
769
show_tree_status(tree, to_file=output)
770
self.assertContainsRe(output.getvalue(), b'pending merge')
771
out, err = self.run_bzr('status tree/a')
772
self.assertNotContainsRe(out, 'pending merge')
775
class TestStatusEncodings(TestCaseWithTransport):
777
def make_uncommitted_tree(self):
778
"""Build a branch with uncommitted unicode named changes in the cwd."""
779
working_tree = self.make_branch_and_tree(u'.')
780
filename = u'hell\u00d8'
782
self.build_tree_contents([(filename, b'contents of hello')])
783
except UnicodeEncodeError:
784
raise TestSkipped("can't build unicode working tree in "
785
"filesystem encoding %s" % sys.getfilesystemencoding())
786
working_tree.add(filename)
789
def test_stdout_ascii(self):
790
self.overrideAttr(osutils, '_cached_user_encoding', 'ascii')
791
working_tree = self.make_uncommitted_tree()
792
stdout, stderr = self.run_bzr("status")
794
self.assertEqual(stdout, """\
799
def test_stdout_latin1(self):
800
self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1')
801
working_tree = self.make_uncommitted_tree()
802
stdout, stderr = self.run_bzr('status')
809
expected = expected.encode('latin-1')
810
self.assertEqual(stdout, expected)
128
from cStringIO import StringIO
129
from bzrlib.status import show_status
130
from bzrlib.branch import Branch
132
b = Branch.initialize('.')
134
self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
137
b.working_tree().commit('testing')
140
show_status(b, to_file=tof)
142
self.assertEquals(tof.readlines(),
146
' directory/hello.c\n'
150
show_status(b, specific_files=['bye.c','test.c','absent.c'], to_file=tof)
152
self.assertEquals(tof.readlines(),
158
show_status(b, specific_files=['directory'], to_file=tof)
160
self.assertEquals(tof.readlines(),
162
' directory/hello.c\n'
165
show_status(b, specific_files=['dir2'], to_file=tof)
167
self.assertEquals(tof.readlines(),