/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4597.9.2 by Vincent Ladeuil
Merge bzr.dev into cleanup
1
# Copyright (C) 2005-2010 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
915 by Martin Pool
- add simple test case for bzr status
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
915 by Martin Pool
- add simple test case for bzr status
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
915 by Martin Pool
- add simple test case for bzr status
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
915 by Martin Pool
- add simple test case for bzr status
16
17
"""Tests of status command.
18
19
Most of these depend on the particular formatting used.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
20
As such they really are blackbox tests even though some of the
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
21
tests are not using self.capture. If we add tests for the programmatic
22
interface later, they will be non blackbox tests.
915 by Martin Pool
- add simple test case for bzr status
23
"""
24
1185.33.71 by Martin Pool
Status tests include unicode character.
25
from cStringIO import StringIO
1685.1.80 by Wouter van Heyst
more code cleanup
26
import codecs
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
27
from os import mkdir, chdir, rmdir, unlink
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
28
import sys
1185.33.71 by Martin Pool
Status tests include unicode character.
29
from tempfile import TemporaryFile
30
1551.15.58 by Aaron Bentley
Status honours selected paths for conflicts (#127606)
31
from bzrlib import (
32
    bzrdir,
33
    conflicts,
34
    errors,
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
35
    osutils,
5418.4.2 by Parth Malwankar
blackbox test for shelve summary in status
36
    status,
1551.15.58 by Aaron Bentley
Status honours selected paths for conflicts (#127606)
37
    )
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
38
import bzrlib.branch
39
from bzrlib.osutils import pathjoin
1948.4.33 by John Arbash Meinel
Switch from get_revision_spec() to RevisionSpec.from_string() (as advised by Martin)
40
from bzrlib.revisionspec import RevisionSpec
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
41
from bzrlib.status import show_tree_status
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
42
from bzrlib.tests import TestCaseWithTransport, TestSkipped
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
43
from bzrlib.workingtree import WorkingTree
44
915 by Martin Pool
- add simple test case for bzr status
45
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
46
class BranchStatus(TestCaseWithTransport):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
47
5508.1.1 by John Arbash Meinel
Fix bug #662053, 'bzr status' shouldn't fail
48
    def setUp(self):
49
        super(BranchStatus, self).setUp()
50
        # As TestCase.setUp clears all hooks, we install this default
51
        # post_status hook handler for the test.
52
        status.hooks.install_named_hook('post_status',
53
            status._show_shelve_summary,
54
            'bzr status')
55
2255.7.60 by Robert Collins
Make the assertStatus blackbox helper clearer.
56
    def assertStatus(self, expected_lines, working_tree,
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
57
        revision=None, short=False, pending=True, verbose=False):
1927.2.3 by Robert Collins
review comment application - paired with Martin.
58
        """Run status in working_tree and look for output.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
59
2255.7.60 by Robert Collins
Make the assertStatus blackbox helper clearer.
60
        :param expected_lines: The lines to look for.
1927.2.3 by Robert Collins
review comment application - paired with Martin.
61
        :param working_tree: The tree to run status in.
62
        """
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
63
        output_string = self.status_string(working_tree, revision, short,
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
64
                pending, verbose)
2255.7.60 by Robert Collins
Make the assertStatus blackbox helper clearer.
65
        self.assertEqual(expected_lines, output_string.splitlines(True))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
66
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
67
    def status_string(self, wt, revision=None, short=False, pending=True,
68
        verbose=False):
1927.2.3 by Robert Collins
review comment application - paired with Martin.
69
        # use a real file rather than StringIO because it doesn't handle
70
        # Unicode very well.
71
        tof = codecs.getwriter('utf-8')(TemporaryFile())
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
72
        show_tree_status(wt, to_file=tof, revision=revision, short=short,
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
73
                show_pending=pending, verbose=verbose)
1927.2.3 by Robert Collins
review comment application - paired with Martin.
74
        tof.seek(0)
75
        return tof.read().decode('utf-8')
76
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
77
    def test_branch_status(self):
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
78
        """Test basic branch status"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
79
        wt = self.make_branch_and_tree('.')
1927.2.3 by Robert Collins
review comment application - paired with Martin.
80
81
        # status with no commits or files - it must
82
        # work and show no output. We do this with no
83
        # commits to be sure that it's not going to fail
84
        # as a corner case.
85
        self.assertStatus([], wt)
86
87
        self.build_tree(['hello.c', 'bye.c'])
88
        self.assertStatus([
89
                'unknown:\n',
90
                '  bye.c\n',
91
                '  hello.c\n',
92
            ],
93
            wt)
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
94
        self.assertStatus([
1551.10.7 by Aaron Bentley
Use new-style output for status
95
                '?   bye.c\n',
96
                '?   hello.c\n',
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
97
            ],
98
            wt, short=True)
1927.2.3 by Robert Collins
review comment application - paired with Martin.
99
100
        # add a commit to allow showing pending merges.
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
101
        wt.commit('create a parent to allow testing merge output')
915 by Martin Pool
- add simple test case for bzr status
102
1908.6.7 by Robert Collins
Remove all users of set_pending_merges and add_pending_merge except tests that they work correctly.
103
        wt.add_parent_tree_id('pending@pending-0-0')
1927.2.3 by Robert Collins
review comment application - paired with Martin.
104
        self.assertStatus([
105
                'unknown:\n',
106
                '  bye.c\n',
107
                '  hello.c\n',
3936.2.3 by Ian Clatworthy
feedback from jameinel
108
                'pending merge tips: (use -v to see all merge revisions)\n',
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
109
                '  (ghost) pending@pending-0-0\n',
110
            ],
111
            wt)
112
        self.assertStatus([
113
                'unknown:\n',
114
                '  bye.c\n',
115
                '  hello.c\n',
1927.2.3 by Robert Collins
review comment application - paired with Martin.
116
                'pending merges:\n',
3377.3.41 by John Arbash Meinel
Fix up a couple of the tests
117
                '  (ghost) pending@pending-0-0\n',
1927.2.3 by Robert Collins
review comment application - paired with Martin.
118
            ],
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
119
            wt, verbose=True)
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
120
        self.assertStatus([
1551.10.7 by Aaron Bentley
Use new-style output for status
121
                '?   bye.c\n',
122
                '?   hello.c\n',
3377.3.41 by John Arbash Meinel
Fix up a couple of the tests
123
                'P   (ghost) pending@pending-0-0\n',
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
124
            ],
125
            wt, short=True)
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
126
        self.assertStatus([
127
                'unknown:\n',
128
                '  bye.c\n',
129
                '  hello.c\n',
130
            ],
131
            wt, pending=False)
132
        self.assertStatus([
133
                '?   bye.c\n',
134
                '?   hello.c\n',
135
            ],
136
            wt, short=True, pending=False)
915 by Martin Pool
- add simple test case for bzr status
137
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
138
    def test_branch_status_revisions(self):
139
        """Tests branch status with revisions"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
140
        wt = self.make_branch_and_tree('.')
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
141
142
        self.build_tree(['hello.c', 'bye.c'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
143
        wt.add('hello.c')
144
        wt.add('bye.c')
145
        wt.commit('Test message')
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
146
1948.4.36 by John Arbash Meinel
[merge] bzr.dev 1978
147
        revs = [RevisionSpec.from_string('0')]
1927.2.3 by Robert Collins
review comment application - paired with Martin.
148
        self.assertStatus([
149
                'added:\n',
150
                '  bye.c\n',
151
                '  hello.c\n'
152
            ],
153
            wt,
154
            revision=revs)
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
155
156
        self.build_tree(['more.c'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
157
        wt.add('more.c')
158
        wt.commit('Another test message')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
159
1948.4.33 by John Arbash Meinel
Switch from get_revision_spec() to RevisionSpec.from_string() (as advised by Martin)
160
        revs.append(RevisionSpec.from_string('1'))
1927.2.3 by Robert Collins
review comment application - paired with Martin.
161
        self.assertStatus([
162
                'added:\n',
163
                '  bye.c\n',
164
                '  hello.c\n',
165
            ],
166
            wt,
167
            revision=revs)
1185.12.27 by Aaron Bentley
Use line log for pending merges
168
169
    def test_pending(self):
1185.33.71 by Martin Pool
Status tests include unicode character.
170
        """Pending merges display works, including Unicode"""
1185.12.27 by Aaron Bentley
Use line log for pending merges
171
        mkdir("./branch")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
172
        wt = self.make_branch_and_tree('branch')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
173
        b = wt.branch
174
        wt.commit("Empty commit 1")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
175
        b_2_dir = b.bzrdir.sprout('./copy')
176
        b_2 = b_2_dir.open_branch()
177
        wt2 = b_2_dir.open_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
178
        wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
179
        wt2.merge_from_branch(wt.branch)
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
180
        message = self.status_string(wt2, verbose=True)
2296.1.1 by Martin Pool
Make tests for truncation of status output more robust on wide terminals.
181
        self.assertStartsWith(message, "pending merges:\n")
182
        self.assertEndsWith(message, "Empty commit 2\n")
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
183
        wt2.commit("merged")
1185.16.88 by mbp at sourcefrog
Make commit message long enough in test for pending merges
184
        # must be long to make sure we see elipsis at the end
2296.1.1 by Martin Pool
Make tests for truncation of status output more robust on wide terminals.
185
        wt.commit("Empty commit 3 " +
186
                   "blah blah blah blah " * 100)
1551.15.70 by Aaron Bentley
Avoid using builtins.merge
187
        wt2.merge_from_branch(wt.branch)
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
188
        message = self.status_string(wt2, verbose=True)
2296.1.1 by Martin Pool
Make tests for truncation of status output more robust on wide terminals.
189
        self.assertStartsWith(message, "pending merges:\n")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
190
        self.assert_("Empty commit 3" in message)
2296.1.1 by Martin Pool
Make tests for truncation of status output more robust on wide terminals.
191
        self.assertEndsWith(message, "...\n")
1185.12.27 by Aaron Bentley
Use line log for pending merges
192
2255.7.97 by Robert Collins
Teach delta.report_changes about unversioned files, removing all inventory access during status --short.
193
    def test_tree_status_ignores(self):
194
        """Tests branch status with ignores"""
195
        wt = self.make_branch_and_tree('.')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
196
        self.run_bzr('ignore *~')
2255.7.97 by Robert Collins
Teach delta.report_changes about unversioned files, removing all inventory access during status --short.
197
        wt.commit('commit .bzrignore')
198
        self.build_tree(['foo.c', 'foo.c~'])
199
        self.assertStatus([
200
                'unknown:\n',
201
                '  foo.c\n',
202
                ],
203
                wt)
204
        self.assertStatus([
205
                '?   foo.c\n',
206
                ],
207
                wt, short=True)
208
209
    def test_tree_status_specific_files(self):
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
210
        """Tests branch status with given specific files"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
211
        wt = self.make_branch_and_tree('.')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
212
        b = wt.branch
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
213
5504.5.1 by Rory Yorke
Show missing files in bzr status (bug 134168).
214
        self.build_tree(['directory/','directory/hello.c',
215
                         'bye.c','test.c','dir2/',
216
                         'missing.c'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
217
        wt.add('directory')
218
        wt.add('test.c')
219
        wt.commit('testing')
5504.5.1 by Rory Yorke
Show missing files in bzr status (bug 134168).
220
        wt.add('missing.c')
221
        unlink('missing.c')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
222
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
223
        self.assertStatus([
5504.5.1 by Rory Yorke
Show missing files in bzr status (bug 134168).
224
                'missing:\n',
225
                '  missing.c\n',
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
226
                'unknown:\n',
227
                '  bye.c\n',
2255.7.91 by Robert Collins
Move unknown detection in long status into the delta creation, saving a tree-scan.
228
                '  dir2/\n',
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
229
                '  directory/hello.c\n'
230
                ],
231
                wt)
232
233
        self.assertStatus([
1551.10.7 by Aaron Bentley
Use new-style output for status
234
                '?   bye.c\n',
2255.7.97 by Robert Collins
Teach delta.report_changes about unversioned files, removing all inventory access during status --short.
235
                '?   dir2/\n',
5504.5.1 by Rory Yorke
Show missing files in bzr status (bug 134168).
236
                '+!  missing.c\n',
1551.10.7 by Aaron Bentley
Use new-style output for status
237
                '?   directory/hello.c\n'
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
238
                ],
239
                wt, short=True)
240
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
241
        tof = StringIO()
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
242
        self.assertRaises(errors.PathsDoNotExist,
243
                          show_tree_status,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
244
                          wt, specific_files=['bye.c','test.c','absent.c'],
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
245
                          to_file=tof)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
246
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
247
        tof = StringIO()
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
248
        show_tree_status(wt, specific_files=['directory'], to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
249
        tof.seek(0)
250
        self.assertEquals(tof.readlines(),
251
                          ['unknown:\n',
252
                           '  directory/hello.c\n'
253
                           ])
254
        tof = StringIO()
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
255
        show_tree_status(wt, specific_files=['directory'], to_file=tof,
256
                         short=True)
257
        tof.seek(0)
1551.10.7 by Aaron Bentley
Use new-style output for status
258
        self.assertEquals(tof.readlines(), ['?   directory/hello.c\n'])
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
259
260
        tof = StringIO()
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
261
        show_tree_status(wt, specific_files=['dir2'], to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
262
        tof.seek(0)
263
        self.assertEquals(tof.readlines(),
264
                          ['unknown:\n',
2255.7.91 by Robert Collins
Move unknown detection in long status into the delta creation, saving a tree-scan.
265
                           '  dir2/\n'
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
266
                           ])
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
267
        tof = StringIO()
268
        show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
269
        tof.seek(0)
2255.7.97 by Robert Collins
Teach delta.report_changes about unversioned files, removing all inventory access during status --short.
270
        self.assertEquals(tof.readlines(), ['?   dir2/\n'])
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
271
2748.2.1 by Lukáš Lalinsky
Return ConflictsList() instead of [] from Tree.conflicts.
272
        tof = StringIO()
273
        revs = [RevisionSpec.from_string('0'), RevisionSpec.from_string('1')]
2761.1.2 by Aaron Bentley
Fix line wrapping
274
        show_tree_status(wt, specific_files=['test.c'], to_file=tof,
275
                         short=True, revision=revs)
2748.2.1 by Lukáš Lalinsky
Return ConflictsList() instead of [] from Tree.conflicts.
276
        tof.seek(0)
277
        self.assertEquals(tof.readlines(), ['+N  test.c\n'])
278
5504.5.1 by Rory Yorke
Show missing files in bzr status (bug 134168).
279
        tof = StringIO()
280
        show_tree_status(wt, specific_files=['missing.c'], to_file=tof)
281
        tof.seek(0)
282
        self.assertEquals(tof.readlines(),
283
                          ['missing:\n',
284
                           '  missing.c\n'])
285
286
        tof = StringIO()
287
        show_tree_status(wt, specific_files=['missing.c'], to_file=tof,
288
                         short=True)
289
        tof.seek(0)
290
        self.assertEquals(tof.readlines(),
291
                          ['+!  missing.c\n'])
292
1551.15.58 by Aaron Bentley
Status honours selected paths for conflicts (#127606)
293
    def test_specific_files_conflicts(self):
294
        tree = self.make_branch_and_tree('.')
295
        self.build_tree(['dir2/'])
296
        tree.add('dir2')
297
        tree.commit('added dir2')
298
        tree.set_conflicts(conflicts.ConflictList(
299
            [conflicts.ContentsConflict('foo')]))
300
        tof = StringIO()
301
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
302
        self.assertEqualDiff('', tof.getvalue())
303
        tree.set_conflicts(conflicts.ConflictList(
304
            [conflicts.ContentsConflict('dir2')]))
305
        tof = StringIO()
306
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
307
        self.assertEqualDiff('conflicts:\n  Contents conflict in dir2\n',
308
                             tof.getvalue())
309
310
        tree.set_conflicts(conflicts.ConflictList(
311
            [conflicts.ContentsConflict('dir2/file1')]))
312
        tof = StringIO()
313
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
314
        self.assertEqualDiff('conflicts:\n  Contents conflict in dir2/file1\n',
315
                             tof.getvalue())
316
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
317
    def _prepare_nonexistent(self):
1662.1.9 by Martin Pool
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)
318
        wt = self.make_branch_and_tree('.')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
319
        self.assertStatus([], wt)
320
        self.build_tree(['FILE_A', 'FILE_B', 'FILE_C', 'FILE_D', 'FILE_E', ])
321
        wt.add('FILE_A')
322
        wt.add('FILE_B')
323
        wt.add('FILE_C')
324
        wt.add('FILE_D')
325
        wt.add('FILE_E')
326
        wt.commit('Create five empty files.')
5861.2.5 by Wouter van Heyst
Fix remaining failing blackbox tests under pypy due to refcount/flush interaction.
327
        with open('FILE_B', 'w') as f: f.write('Modification to file FILE_B.')
328
        with open('FILE_C', 'w') as f: f.write('Modification to file FILE_C.')
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
329
        unlink('FILE_E')  # FILE_E will be versioned but missing
5861.2.5 by Wouter van Heyst
Fix remaining failing blackbox tests under pypy due to refcount/flush interaction.
330
        with open('FILE_Q', 'w') as f: f.write('FILE_Q is added but not committed.')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
331
        wt.add('FILE_Q')  # FILE_Q will be added but not committed
332
        open('UNVERSIONED_BUT_EXISTING', 'w')
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
333
        return wt
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
334
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
335
    def test_status_nonexistent_file(self):
336
        # files that don't exist in either the basis tree or working tree
337
        # should give an error
338
        wt = self._prepare_nonexistent()
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
339
        self.assertStatus([
340
            'removed:\n',
341
            '  FILE_E\n',
342
            'added:\n',
343
            '  FILE_Q\n',
344
            'modified:\n',
345
            '  FILE_B\n',
346
            '  FILE_C\n',
347
            'unknown:\n',
348
            '  UNVERSIONED_BUT_EXISTING\n',
349
            ],
350
            wt)
351
        self.assertStatus([
352
            ' M  FILE_B\n',
353
            ' M  FILE_C\n',
354
            ' D  FILE_E\n',
355
            '+N  FILE_Q\n',
356
            '?   UNVERSIONED_BUT_EXISTING\n',
357
            ],
358
            wt, short=True)
359
360
        # Okay, everything's looking good with the existent files.
361
        # Let's see what happens when we throw in non-existent files.
362
363
        # bzr st [--short] NONEXISTENT '
364
        expected = [
365
          'nonexistent:\n',
366
          '  NONEXISTENT\n',
367
          ]
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
368
        out, err = self.run_bzr('status NONEXISTENT', retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
369
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
370
        self.assertContainsRe(err,
371
                              r'.*ERROR: Path\(s\) do not exist: '
372
                              'NONEXISTENT.*')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
373
        expected = [
374
          'X:   NONEXISTENT\n',
375
          ]
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
376
        out, err = self.run_bzr('status --short NONEXISTENT', retcode=3)
377
        self.assertContainsRe(err,
378
                              r'.*ERROR: Path\(s\) do not exist: '
379
                              'NONEXISTENT.*')
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
380
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
381
    def test_status_nonexistent_file_with_others(self):
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
382
        # bzr st [--short] NONEXISTENT ...others..
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
383
        wt = self._prepare_nonexistent()
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
384
        expected = [
385
          'removed:\n',
386
          '  FILE_E\n',
387
          'modified:\n',
388
          '  FILE_B\n',
389
          '  FILE_C\n',
390
          'nonexistent:\n',
391
          '  NONEXISTENT\n',
392
          ]
393
        out, err = self.run_bzr('status NONEXISTENT '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
394
                                'FILE_A FILE_B FILE_C FILE_D FILE_E',
395
                                retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
396
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
397
        self.assertContainsRe(err,
398
                              r'.*ERROR: Path\(s\) do not exist: '
399
                              'NONEXISTENT.*')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
400
        expected = [
401
          ' D  FILE_E\n',
402
          ' M  FILE_C\n',
403
          ' M  FILE_B\n',
404
          'X   NONEXISTENT\n',
405
          ]
406
        out, err = self.run_bzr('status --short NONEXISTENT '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
407
                                'FILE_A FILE_B FILE_C FILE_D FILE_E',
408
                                retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
409
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
410
        self.assertContainsRe(err,
411
                              r'.*ERROR: Path\(s\) do not exist: '
412
                              'NONEXISTENT.*')
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
413
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
414
    def test_status_multiple_nonexistent_files(self):
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
415
        # bzr st [--short] NONEXISTENT ... ANOTHER_NONEXISTENT ...
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
416
        wt = self._prepare_nonexistent()
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
417
        expected = [
418
          'removed:\n',
419
          '  FILE_E\n',
420
          'modified:\n',
421
          '  FILE_B\n',
422
          '  FILE_C\n',
423
          'nonexistent:\n',
424
          '  ANOTHER_NONEXISTENT\n',
425
          '  NONEXISTENT\n',
426
          ]
427
        out, err = self.run_bzr('status NONEXISTENT '
428
                                'FILE_A FILE_B ANOTHER_NONEXISTENT '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
429
                                'FILE_C FILE_D FILE_E', retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
430
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
431
        self.assertContainsRe(err,
432
                              r'.*ERROR: Path\(s\) do not exist: '
433
                              'ANOTHER_NONEXISTENT NONEXISTENT.*')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
434
        expected = [
435
          ' D  FILE_E\n',
436
          ' M  FILE_C\n',
437
          ' M  FILE_B\n',
438
          'X   ANOTHER_NONEXISTENT\n',
439
          'X   NONEXISTENT\n',
440
          ]
441
        out, err = self.run_bzr('status --short NONEXISTENT '
442
                                'FILE_A FILE_B ANOTHER_NONEXISTENT '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
443
                                'FILE_C FILE_D FILE_E', retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
444
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
445
        self.assertContainsRe(err,
446
                              r'.*ERROR: Path\(s\) do not exist: '
447
                              'ANOTHER_NONEXISTENT NONEXISTENT.*')
4032.1.2 by John Arbash Meinel
Track down a few more files that have trailing whitespace.
448
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
449
    def test_status_nonexistent_file_with_unversioned(self):
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
450
        # bzr st [--short] NONEXISTENT A B UNVERSIONED_BUT_EXISTING C D E Q
3930.2.17 by Ian Clatworthy
split tests as suggested by Jelmer's review
451
        wt = self._prepare_nonexistent()
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
452
        expected = [
453
          'removed:\n',
454
          '  FILE_E\n',
455
          'added:\n',
456
          '  FILE_Q\n',
457
          'modified:\n',
458
          '  FILE_B\n',
459
          '  FILE_C\n',
460
          'unknown:\n',
461
          '  UNVERSIONED_BUT_EXISTING\n',
462
          'nonexistent:\n',
463
          '  NONEXISTENT\n',
464
          ]
465
        out, err = self.run_bzr('status NONEXISTENT '
466
                                'FILE_A FILE_B UNVERSIONED_BUT_EXISTING '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
467
                                'FILE_C FILE_D FILE_E FILE_Q', retcode=3)
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
468
        self.assertEqual(expected, out.splitlines(True))
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
469
        self.assertContainsRe(err,
470
                              r'.*ERROR: Path\(s\) do not exist: '
471
                              'NONEXISTENT.*')
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
472
        expected = [
473
          '+N  FILE_Q\n',
474
          '?   UNVERSIONED_BUT_EXISTING\n',
475
          ' D  FILE_E\n',
476
          ' M  FILE_C\n',
477
          ' M  FILE_B\n',
478
          'X   NONEXISTENT\n',
479
          ]
5861.2.7 by Wouter van Heyst
Paper over different sorting order in pypy by sorting th expected and actual lists.
480
        expected.sort()
3930.2.12 by Karl Fogel
Part of bug #306394: Add regression tests.
481
        out, err = self.run_bzr('status --short NONEXISTENT '
482
                                'FILE_A FILE_B UNVERSIONED_BUT_EXISTING '
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
483
                                'FILE_C FILE_D FILE_E FILE_Q', retcode=3)
5861.2.7 by Wouter van Heyst
Paper over different sorting order in pypy by sorting th expected and actual lists.
484
        actual = out.splitlines(True)
485
        actual.sort()
486
        self.assertEqual(expected, actual)
3930.2.13 by Karl Fogel
Part of bug #306394: Raise an error (code 3) when status is invoked on
487
        self.assertContainsRe(err,
488
                              r'.*ERROR: Path\(s\) do not exist: '
489
                              'NONEXISTENT.*')
1662.1.9 by Martin Pool
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)
490
2091.4.2 by wang
add tests for "diff" and "status"
491
    def test_status_out_of_date(self):
492
        """Simulate status of out-of-date tree after remote push"""
493
        tree = self.make_branch_and_tree('.')
494
        self.build_tree_contents([('a', 'foo\n')])
495
        tree.lock_write()
496
        try:
497
            tree.add(['a'])
498
            tree.commit('add test file')
499
            # simulate what happens after a remote push
500
            tree.set_last_revision("0")
501
        finally:
2408.1.7 by Alexander Belchenko
Fix blackbox test_status_out_of_date: unlock WT before next command running
502
            # before run another commands we should unlock tree
2091.4.2 by wang
add tests for "diff" and "status"
503
            tree.unlock()
2408.1.7 by Alexander Belchenko
Fix blackbox test_status_out_of_date: unlock WT before next command running
504
        out, err = self.run_bzr('status')
505
        self.assertEqual("working tree is out of date, run 'bzr update'\n",
506
                         err)
2091.4.2 by wang
add tests for "diff" and "status"
507
5137.2.2 by Arnaud Jeansen
Add a unit test for LP: #40103 (status on an ignored file)
508
    def test_status_on_ignored(self):
509
        """Tests branch status on an unversioned file which is considered ignored.
510
511
        See https://bugs.launchpad.net/bzr/+bug/40103
512
        """
513
        tree = self.make_branch_and_tree('.')
514
5137.2.4 by Arnaud Jeansen
Make new unit test easier to read wrt. sorting
515
        self.build_tree(['test1.c', 'test1.c~', 'test2.c~'])
5137.2.2 by Arnaud Jeansen
Add a unit test for LP: #40103 (status on an ignored file)
516
        result = self.run_bzr('status')[0]
5137.2.4 by Arnaud Jeansen
Make new unit test easier to read wrt. sorting
517
        self.assertContainsRe(result, "unknown:\n  test1.c\n")
5137.2.3 by Arnaud Jeansen
Rework unit test according to feedback
518
        short_result = self.run_bzr('status --short')[0]
5137.2.4 by Arnaud Jeansen
Make new unit test easier to read wrt. sorting
519
        self.assertContainsRe(short_result, "\?   test1.c\n")
520
521
        result = self.run_bzr('status test1.c')[0]
522
        self.assertContainsRe(result, "unknown:\n  test1.c\n")
523
        short_result = self.run_bzr('status --short test1.c')[0]
524
        self.assertContainsRe(short_result, "\?   test1.c\n")
525
526
        result = self.run_bzr('status test1.c~')[0]
527
        self.assertContainsRe(result, "ignored:\n  test1.c~\n")
528
        short_result = self.run_bzr('status --short test1.c~')[0]
529
        self.assertContainsRe(short_result, "I   test1.c~\n")
530
531
        result = self.run_bzr('status test1.c~ test2.c~')[0]
532
        self.assertContainsRe(result, "ignored:\n  test1.c~\n  test2.c~\n")
533
        short_result = self.run_bzr('status --short test1.c~ test2.c~')[0]
534
        self.assertContainsRe(short_result, "I   test1.c~\nI   test2.c~\n")
535
536
        result = self.run_bzr('status test1.c test1.c~ test2.c~')[0]
537
        self.assertContainsRe(result, "unknown:\n  test1.c\nignored:\n  test1.c~\n  test2.c~\n")
538
        short_result = self.run_bzr('status --short test1.c test1.c~ test2.c~')[0]
539
        self.assertContainsRe(short_result, "\?   test1.c\nI   test1.c~\nI   test2.c~\n")
5137.2.2 by Arnaud Jeansen
Add a unit test for LP: #40103 (status on an ignored file)
540
3655.3.1 by Lukáš Lalinský
Fix `bzr st -rbranch:PATH_TO_BRANCH`
541
    def test_status_write_lock(self):
3732.1.1 by Ian Clatworthy
fix bzr st -rbranch:path-to-branch (Lukas Lalinsky)
542
        """Test that status works without fetching history and
3655.3.1 by Lukáš Lalinský
Fix `bzr st -rbranch:PATH_TO_BRANCH`
543
        having a write lock.
544
545
        See https://bugs.launchpad.net/bzr/+bug/149270
546
        """
547
        mkdir('branch1')
548
        wt = self.make_branch_and_tree('branch1')
549
        b = wt.branch
550
        wt.commit('Empty commit 1')
551
        wt2 = b.bzrdir.sprout('branch2').open_workingtree()
3732.1.1 by Ian Clatworthy
fix bzr st -rbranch:path-to-branch (Lukas Lalinsky)
552
        wt2.commit('Empty commit 2')
3655.3.1 by Lukáš Lalinský
Fix `bzr st -rbranch:PATH_TO_BRANCH`
553
        out, err = self.run_bzr('status branch1 -rbranch:branch2')
554
        self.assertEqual('', out)
555
5418.4.2 by Parth Malwankar
blackbox test for shelve summary in status
556
    def test_status_with_shelves(self):
557
        """Ensure that _show_shelve_summary handler works.
558
        """
559
        wt = self.make_branch_and_tree('.')
560
        self.build_tree(['hello.c'])
561
        wt.add('hello.c')
562
        self.run_bzr(['shelve', '--all', '-m', 'foo'])
563
        self.build_tree(['bye.c'])
564
        wt.add('bye.c')
565
        self.assertStatus([
566
                'added:\n',
567
                '  bye.c\n',
5609.11.2 by Alexander Belchenko
correct singular form, thanks John
568
                '1 shelf exists. See "bzr shelve --list" for details.\n',
5609.11.1 by Alexander Belchenko
use proper plural form to print status message about existing shelves.
569
            ],
570
            wt)
571
        self.run_bzr(['shelve', '--all', '-m', 'bar'])
572
        self.build_tree(['spam.c'])
573
        wt.add('spam.c')
574
        self.assertStatus([
575
                'added:\n',
576
                '  spam.c\n',
577
                '2 shelves exist. See "bzr shelve --list" for details.\n',
5418.4.2 by Parth Malwankar
blackbox test for shelve summary in status
578
            ],
579
            wt)
580
1662.1.9 by Martin Pool
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)
581
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
582
class CheckoutStatus(BranchStatus):
1551.2.12 by Aaron Bentley
whitespace fixups
583
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
584
    def setUp(self):
585
        super(CheckoutStatus, self).setUp()
586
        mkdir('codir')
587
        chdir('codir')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
588
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
589
    def make_branch_and_tree(self, relpath):
590
        source = self.make_branch(pathjoin('..', relpath))
591
        checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
5051.3.10 by Jelmer Vernooij
Pass colocated branch name around in more places.
592
        bzrlib.branch.BranchReferenceFormat().initialize(checkout,
593
            target_branch=source)
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
594
        return checkout.create_workingtree()
595
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
596
1534.4.54 by Robert Collins
Merge from integration.
597
class TestStatus(TestCaseWithTransport):
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
598
2318.2.1 by Kent Gibson
Apply status versioned patch
599
    def test_status_plain(self):
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
600
        tree = self.make_branch_and_tree('.')
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
601
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
602
        self.build_tree(['hello.txt'])
603
        result = self.run_bzr("status")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
604
        self.assertContainsRe(result, "unknown:\n  hello.txt\n")
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
605
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
606
        tree.add("hello.txt")
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
607
        result = self.run_bzr("status")[0]
1551.10.7 by Aaron Bentley
Use new-style output for status
608
        self.assertContainsRe(result, "added:\n  hello.txt\n")
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
609
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
610
        tree.commit(message="added")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
611
        result = self.run_bzr("status -r 0..1")[0]
1551.10.7 by Aaron Bentley
Use new-style output for status
612
        self.assertContainsRe(result, "added:\n  hello.txt\n")
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
613
2745.4.3 by Lukáš Lalinsky
Change -C to -c.
614
        result = self.run_bzr("status -c 1")[0]
2745.4.1 by Lukáš Lalinsky
New option -C/--change for diff and status to show changes in one revision. (#56299)
615
        self.assertContainsRe(result, "added:\n  hello.txt\n")
616
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
617
        self.build_tree(['world.txt'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
618
        result = self.run_bzr("status -r 0")[0]
1551.10.7 by Aaron Bentley
Use new-style output for status
619
        self.assertContainsRe(result, "added:\n  hello.txt\n" \
620
                                      "unknown:\n  world.txt\n")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
621
        result2 = self.run_bzr("status -r 0..")[0]
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
622
        self.assertEquals(result2, result)
2318.2.1 by Kent Gibson
Apply status versioned patch
623
624
    def test_status_short(self):
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
625
        tree = self.make_branch_and_tree('.')
2318.2.1 by Kent Gibson
Apply status versioned patch
626
627
        self.build_tree(['hello.txt'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
628
        result = self.run_bzr("status --short")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
629
        self.assertContainsRe(result, "[?]   hello.txt\n")
630
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
631
        tree.add("hello.txt")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
632
        result = self.run_bzr("status --short")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
633
        self.assertContainsRe(result, "[+]N  hello.txt\n")
634
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
635
        tree.commit(message="added")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
636
        result = self.run_bzr("status --short -r 0..1")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
637
        self.assertContainsRe(result, "[+]N  hello.txt\n")
638
639
        self.build_tree(['world.txt'])
5945.1.3 by Martin von Gagern
Add blackbox tests for -S as an alias to --short.
640
        result = self.run_bzr("status -S -r 0")[0]
1551.10.7 by Aaron Bentley
Use new-style output for status
641
        self.assertContainsRe(result, "[+]N  hello.txt\n" \
642
                                      "[?]   world.txt\n")
5945.1.3 by Martin von Gagern
Add blackbox tests for -S as an alias to --short.
643
        result2 = self.run_bzr("status -S -r 0..")[0]
2147.2.2 by Keir Mierle
Fix spacing error and add tests for status --short command flag.
644
        self.assertEquals(result2, result)
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
645
2318.2.1 by Kent Gibson
Apply status versioned patch
646
    def test_status_versioned(self):
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
647
        tree = self.make_branch_and_tree('.')
2318.2.1 by Kent Gibson
Apply status versioned patch
648
649
        self.build_tree(['hello.txt'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
650
        result = self.run_bzr("status --versioned")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
651
        self.assertNotContainsRe(result, "unknown:\n  hello.txt\n")
652
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
653
        tree.add("hello.txt")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
654
        result = self.run_bzr("status --versioned")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
655
        self.assertContainsRe(result, "added:\n  hello.txt\n")
656
2664.7.1 by Daniel Watkins
tests.blackbox.test_status now uses internals where appropriate.
657
        tree.commit("added")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
658
        result = self.run_bzr("status --versioned -r 0..1")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
659
        self.assertContainsRe(result, "added:\n  hello.txt\n")
660
661
        self.build_tree(['world.txt'])
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
662
        result = self.run_bzr("status --versioned -r 0")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
663
        self.assertContainsRe(result, "added:\n  hello.txt\n")
664
        self.assertNotContainsRe(result, "unknown:\n  world.txt\n")
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
665
        result2 = self.run_bzr("status --versioned -r 0..")[0]
2318.2.1 by Kent Gibson
Apply status versioned patch
666
        self.assertEquals(result2, result)
667
2663.1.7 by Daniel Watkins
Capitalised short names.
668
    def test_status_SV(self):
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
669
        tree = self.make_branch_and_tree('.')
670
671
        self.build_tree(['hello.txt'])
2663.1.7 by Daniel Watkins
Capitalised short names.
672
        result = self.run_bzr("status -SV")[0]
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
673
        self.assertNotContainsRe(result, "hello.txt")
674
675
        tree.add("hello.txt")
2663.1.7 by Daniel Watkins
Capitalised short names.
676
        result = self.run_bzr("status -SV")[0]
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
677
        self.assertContainsRe(result, "[+]N  hello.txt\n")
678
679
        tree.commit(message="added")
2663.1.7 by Daniel Watkins
Capitalised short names.
680
        result = self.run_bzr("status -SV -r 0..1")[0]
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
681
        self.assertContainsRe(result, "[+]N  hello.txt\n")
682
683
        self.build_tree(['world.txt'])
2663.1.7 by Daniel Watkins
Capitalised short names.
684
        result = self.run_bzr("status -SV -r 0")[0]
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
685
        self.assertContainsRe(result, "[+]N  hello.txt\n")
686
2663.1.7 by Daniel Watkins
Capitalised short names.
687
        result2 = self.run_bzr("status -SV -r 0..")[0]
2663.1.3 by Daniel Watkins
Added test for 'status --quiet'.
688
        self.assertEquals(result2, result)
689
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
690
    def assertStatusContains(self, pattern, short=False):
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
691
        """Run status, and assert it contains the given pattern"""
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
692
        if short:
693
            result = self.run_bzr("status --short")[0]
694
        else:
695
            result = self.run_bzr("status")[0]
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
696
        self.assertContainsRe(result, pattern)
697
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
698
    def test_kind_change_plain(self):
699
        tree = self.make_branch_and_tree('.')
700
        self.build_tree(['file'])
701
        tree.add('file')
702
        tree.commit('added file')
703
        unlink('file')
704
        self.build_tree(['file/'])
705
        self.assertStatusContains('kind changed:\n  file \(file => directory\)')
706
        tree.rename_one('file', 'directory')
5076.3.2 by Arnaud Jeansen
Formatting : handle long strings similarly to other tests
707
        self.assertStatusContains('renamed:\n  file/ => directory/\n' \
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
708
                                  'modified:\n  directory/\n')
709
        rmdir('directory')
710
        self.assertStatusContains('removed:\n  file\n')
711
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
712
    def test_kind_change_short(self):
713
        tree = self.make_branch_and_tree('.')
714
        self.build_tree(['file'])
715
        tree.add('file')
716
        tree.commit('added file')
717
        unlink('file')
718
        self.build_tree(['file/'])
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
719
        self.assertStatusContains('K  file => file/',
720
                                   short=True)
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
721
        tree.rename_one('file', 'directory')
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
722
        self.assertStatusContains('RK  file => directory/',
723
                                   short=True)
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
724
        rmdir('directory')
5076.3.1 by Arnaud Jeansen
Add test to the status for kind-changed elements
725
        self.assertStatusContains('RD  file => directory',
726
                                   short=True)
1551.10.9 by Aaron Bentley
Add test cases for status with kind change
727
2745.4.1 by Lukáš Lalinsky
New option -C/--change for diff and status to show changes in one revision. (#56299)
728
    def test_status_illegal_revision_specifiers(self):
729
        out, err = self.run_bzr('status -r 1..23..123', retcode=3)
730
        self.assertContainsRe(err, 'one or two revision specifiers')
731
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
732
    def test_status_no_pending(self):
733
        a_tree = self.make_branch_and_tree('a')
734
        self.build_tree(['a/a'])
735
        a_tree.add('a')
736
        a_tree.commit('a')
737
        b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
738
        self.build_tree(['b/b'])
739
        b_tree.add('b')
740
        b_tree.commit('b')
741
3585.2.1 by Robert Collins
Create acceptance test for bug 150438.
742
        self.run_bzr('merge ../b', working_dir='a')
743
        out, err = self.run_bzr('status --no-pending', working_dir='a')
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
744
        self.assertEquals(out, "added:\n  b\n")
745
3636.1.1 by Robert Collins
Stop passing specific_file lists to show_tree_status when the specific
746
    def test_pending_specific_files(self):
747
        """With a specific file list, pending merges are not shown."""
748
        tree = self.make_branch_and_tree('tree')
749
        self.build_tree_contents([('tree/a', 'content of a\n')])
750
        tree.add('a')
751
        r1_id = tree.commit('one')
752
        alt = tree.bzrdir.sprout('alt').open_workingtree()
753
        self.build_tree_contents([('alt/a', 'content of a\nfrom alt\n')])
754
        alt_id = alt.commit('alt')
755
        tree.merge_from_branch(alt.branch)
3655.2.1 by Lukáš Lalinský
Fix test_pending_specific_files
756
        output = self.make_utf8_encoded_stringio()
3636.1.1 by Robert Collins
Stop passing specific_file lists to show_tree_status when the specific
757
        show_tree_status(tree, to_file=output)
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
758
        self.assertContainsRe(output.getvalue(), 'pending merge')
3636.1.1 by Robert Collins
Stop passing specific_file lists to show_tree_status when the specific
759
        out, err = self.run_bzr('status tree/a')
3936.2.1 by Ian Clatworthy
verbose flag for status - code & tests
760
        self.assertNotContainsRe(out, 'pending merge')
3636.1.1 by Robert Collins
Stop passing specific_file lists to show_tree_status when the specific
761
3270.6.1 by James Westby
Add --no-pending to status to not show the pending merges. (#202830)
762
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
763
class TestStatusEncodings(TestCaseWithTransport):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
764
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
765
    def make_uncommitted_tree(self):
766
        """Build a branch with uncommitted unicode named changes in the cwd."""
767
        working_tree = self.make_branch_and_tree(u'.')
768
        filename = u'hell\u00d8'
769
        try:
770
            self.build_tree_contents([(filename, 'contents of hello')])
771
        except UnicodeEncodeError:
772
            raise TestSkipped("can't build unicode working tree in "
773
                "filesystem encoding %s" % sys.getfilesystemencoding())
774
        working_tree.add(filename)
775
        return working_tree
776
777
    def test_stdout_ascii(self):
4986.2.5 by Martin Pool
Change status blackbox encoding tests to use overrideAttr.
778
        self.overrideAttr(osutils, '_cached_user_encoding', 'ascii')
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
779
        working_tree = self.make_uncommitted_tree()
780
        stdout, stderr = self.run_bzr("status")
781
782
        self.assertEquals(stdout, """\
783
added:
784
  hell?
785
""")
786
787
    def test_stdout_latin1(self):
4986.2.5 by Martin Pool
Change status blackbox encoding tests to use overrideAttr.
788
        self.overrideAttr(osutils, '_cached_user_encoding', 'latin-1')
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
789
        working_tree = self.make_uncommitted_tree()
790
        stdout, stderr = self.run_bzr('status')
791
792
        self.assertEquals(stdout, u"""\
793
added:
794
  hell\u00d8
795
""".encode('latin-1'))
796