/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_status.py

  • Committer: John Arbash Meinel
  • Date: 2006-09-06 15:32:11 UTC
  • mto: This revision was merged to the branch mainline in revision 1990.
  • Revision ID: john@arbash-meinel.com-20060906153211-9519b9dfdf3daf60
Don't use preexec_fn on win32

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Tests of status command.
 
18
 
 
19
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.
 
23
"""
 
24
 
 
25
from cStringIO import StringIO
 
26
import codecs
 
27
from os import mkdir, chdir
 
28
import sys
 
29
from tempfile import TemporaryFile
 
30
 
 
31
from bzrlib import bzrdir, errors, ignores
 
32
import bzrlib.branch
 
33
from bzrlib.builtins import merge
 
34
from bzrlib.osutils import pathjoin
 
35
from bzrlib.revisionspec import RevisionSpec
 
36
from bzrlib.status import show_tree_status
 
37
from bzrlib.tests import TestCaseWithTransport, TestSkipped
 
38
from bzrlib.workingtree import WorkingTree
 
39
 
 
40
 
 
41
class BranchStatus(TestCaseWithTransport):
 
42
    
 
43
    def assertStatus(self, output_lines, working_tree,
 
44
        revision=None):
 
45
        """Run status in working_tree and look for output.
 
46
        
 
47
        :param output_lines: The lines to look for.
 
48
        :param working_tree: The tree to run status in.
 
49
        """
 
50
        output_string = self.status_string(working_tree, revision)
 
51
        self.assertEqual(output_lines, output_string.splitlines(True))
 
52
    
 
53
    def status_string(self, wt, revision=None):
 
54
        # use a real file rather than StringIO because it doesn't handle
 
55
        # Unicode very well.
 
56
        tof = codecs.getwriter('utf-8')(TemporaryFile())
 
57
        show_tree_status(wt, to_file=tof, revision=revision)
 
58
        tof.seek(0)
 
59
        return tof.read().decode('utf-8')
 
60
 
 
61
    def test_branch_status(self):
 
62
        """Test basic branch status"""
 
63
        wt = self.make_branch_and_tree('.')
 
64
 
 
65
        ignores._set_user_ignores(['./.bazaar'])
 
66
 
 
67
        # status with no commits or files - it must
 
68
        # work and show no output. We do this with no
 
69
        # commits to be sure that it's not going to fail
 
70
        # as a corner case.
 
71
        self.assertStatus([], wt)
 
72
 
 
73
        self.build_tree(['hello.c', 'bye.c'])
 
74
        self.assertStatus([
 
75
                'unknown:\n',
 
76
                '  bye.c\n',
 
77
                '  hello.c\n',
 
78
            ],
 
79
            wt)
 
80
 
 
81
        # add a commit to allow showing pending merges.
 
82
        wt.commit('create a parent to allow testing merge output')
 
83
 
 
84
        wt.add_parent_tree_id('pending@pending-0-0')
 
85
        self.assertStatus([
 
86
                'unknown:\n',
 
87
                '  bye.c\n',
 
88
                '  hello.c\n',
 
89
                'pending merges:\n',
 
90
                '  pending@pending-0-0\n',
 
91
            ],
 
92
            wt)
 
93
 
 
94
    def test_branch_status_revisions(self):
 
95
        """Tests branch status with revisions"""
 
96
        wt = self.make_branch_and_tree('.')
 
97
 
 
98
        ignores._set_user_ignores(['./.bazaar'])
 
99
 
 
100
        self.build_tree(['hello.c', 'bye.c'])
 
101
        wt.add('hello.c')
 
102
        wt.add('bye.c')
 
103
        wt.commit('Test message')
 
104
 
 
105
        revs = [RevisionSpec(0)]
 
106
        self.assertStatus([
 
107
                'added:\n',
 
108
                '  bye.c\n',
 
109
                '  hello.c\n'
 
110
            ],
 
111
            wt,
 
112
            revision=revs)
 
113
 
 
114
        self.build_tree(['more.c'])
 
115
        wt.add('more.c')
 
116
        wt.commit('Another test message')
 
117
        
 
118
        revs.append(RevisionSpec(1))
 
119
        self.assertStatus([
 
120
                'added:\n',
 
121
                '  bye.c\n',
 
122
                '  hello.c\n',
 
123
            ],
 
124
            wt,
 
125
            revision=revs)
 
126
 
 
127
    def test_pending(self):
 
128
        """Pending merges display works, including Unicode"""
 
129
        mkdir("./branch")
 
130
        wt = self.make_branch_and_tree('branch')
 
131
        b = wt.branch
 
132
        wt.commit("Empty commit 1")
 
133
        b_2_dir = b.bzrdir.sprout('./copy')
 
134
        b_2 = b_2_dir.open_branch()
 
135
        wt2 = b_2_dir.open_workingtree()
 
136
        wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
 
137
        merge(["./branch", -1], [None, None], this_dir = './copy')
 
138
        message = self.status_string(wt2)
 
139
        self.assert_(message.startswith("pending merges:\n"))
 
140
        self.assert_(message.endswith("Empty commit 2\n")) 
 
141
        wt2.commit("merged")
 
142
        # must be long to make sure we see elipsis at the end
 
143
        wt.commit("Empty commit 3 " + 
 
144
                   "blah blah blah blah " * 10)
 
145
        merge(["./branch", -1], [None, None], this_dir = './copy')
 
146
        message = self.status_string(wt2)
 
147
        self.assert_(message.startswith("pending merges:\n"))
 
148
        self.assert_("Empty commit 3" in message)
 
149
        self.assert_(message.endswith("...\n")) 
 
150
 
 
151
    def test_branch_status_specific_files(self): 
 
152
        """Tests branch status with given specific files"""
 
153
        wt = self.make_branch_and_tree('.')
 
154
        b = wt.branch
 
155
 
 
156
        ignores._set_user_ignores(['./.bazaar'])
 
157
 
 
158
        self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
 
159
        wt.add('directory')
 
160
        wt.add('test.c')
 
161
        wt.commit('testing')
 
162
        
 
163
        tof = StringIO()
 
164
        show_tree_status(wt, to_file=tof)
 
165
        tof.seek(0)
 
166
        self.assertEquals(tof.readlines(),
 
167
                          ['unknown:\n',
 
168
                           '  bye.c\n',
 
169
                           '  dir2\n',
 
170
                           '  directory/hello.c\n'
 
171
                           ])
 
172
 
 
173
        self.assertRaises(errors.PathsDoNotExist,
 
174
                          show_tree_status,
 
175
                          wt, specific_files=['bye.c','test.c','absent.c'], 
 
176
                          to_file=tof)
 
177
        
 
178
        tof = StringIO()
 
179
        show_tree_status(wt, specific_files=['directory'], to_file=tof)
 
180
        tof.seek(0)
 
181
        self.assertEquals(tof.readlines(),
 
182
                          ['unknown:\n',
 
183
                           '  directory/hello.c\n'
 
184
                           ])
 
185
        tof = StringIO()
 
186
        show_tree_status(wt, specific_files=['dir2'], to_file=tof)
 
187
        tof.seek(0)
 
188
        self.assertEquals(tof.readlines(),
 
189
                          ['unknown:\n',
 
190
                           '  dir2\n'
 
191
                           ])
 
192
 
 
193
    def test_status_nonexistent_file(self):
 
194
        # files that don't exist in either the basis tree or working tree
 
195
        # should give an error
 
196
        wt = self.make_branch_and_tree('.')
 
197
        out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
 
198
        self.assertContainsRe(err, r'do not exist.*does-not-exist')
 
199
 
 
200
 
 
201
class CheckoutStatus(BranchStatus):
 
202
 
 
203
    def setUp(self):
 
204
        super(CheckoutStatus, self).setUp()
 
205
        mkdir('codir')
 
206
        chdir('codir')
 
207
        
 
208
    def make_branch_and_tree(self, relpath):
 
209
        source = self.make_branch(pathjoin('..', relpath))
 
210
        checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
 
211
        bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
 
212
        return checkout.create_workingtree()
 
213
 
 
214
 
 
215
class TestStatus(TestCaseWithTransport):
 
216
 
 
217
    def test_status(self):
 
218
        ignores._set_user_ignores(['./.bazaar'])
 
219
 
 
220
        self.run_bzr("init")
 
221
        self.build_tree(['hello.txt'])
 
222
        result = self.run_bzr("status")[0]
 
223
        self.assert_("unknown:\n  hello.txt\n" in result, result)
 
224
        self.run_bzr("add", "hello.txt")
 
225
        result = self.run_bzr("status")[0]
 
226
        self.assert_("added:\n  hello.txt\n" in result, result)
 
227
        self.run_bzr("commit", "-m", "added")
 
228
        result = self.run_bzr("status", "-r", "0..1")[0]
 
229
        self.assert_("added:\n  hello.txt\n" in result, result)
 
230
        self.build_tree(['world.txt'])
 
231
        result = self.run_bzr("status", "-r", "0")[0]
 
232
        self.assert_("added:\n  hello.txt\n" \
 
233
                     "unknown:\n  world.txt\n" in result, result)
 
234
 
 
235
        result2 = self.run_bzr("status", "-r", "0..")[0]
 
236
        self.assertEquals(result2, result)
 
237
 
 
238
 
 
239
class TestStatusEncodings(TestCaseWithTransport):
 
240
    
 
241
    def setUp(self):
 
242
        TestCaseWithTransport.setUp(self)
 
243
        self.user_encoding = bzrlib.user_encoding
 
244
        self.stdout = sys.stdout
 
245
 
 
246
    def tearDown(self):
 
247
        bzrlib.user_encoding = self.user_encoding
 
248
        sys.stdout = self.stdout
 
249
        TestCaseWithTransport.tearDown(self)
 
250
 
 
251
    def make_uncommitted_tree(self):
 
252
        """Build a branch with uncommitted unicode named changes in the cwd."""
 
253
        working_tree = self.make_branch_and_tree(u'.')
 
254
        filename = u'hell\u00d8'
 
255
        try:
 
256
            self.build_tree_contents([(filename, 'contents of hello')])
 
257
        except UnicodeEncodeError:
 
258
            raise TestSkipped("can't build unicode working tree in "
 
259
                "filesystem encoding %s" % sys.getfilesystemencoding())
 
260
        working_tree.add(filename)
 
261
        return working_tree
 
262
 
 
263
    def test_stdout_ascii(self):
 
264
        sys.stdout = StringIO()
 
265
        bzrlib.user_encoding = 'ascii'
 
266
        working_tree = self.make_uncommitted_tree()
 
267
        stdout, stderr = self.run_bzr("status")
 
268
 
 
269
        self.assertEquals(stdout, """\
 
270
added:
 
271
  hell?
 
272
""")
 
273
 
 
274
    def test_stdout_latin1(self):
 
275
        sys.stdout = StringIO()
 
276
        bzrlib.user_encoding = 'latin-1'
 
277
        working_tree = self.make_uncommitted_tree()
 
278
        stdout, stderr = self.run_bzr('status')
 
279
 
 
280
        self.assertEquals(stdout, u"""\
 
281
added:
 
282
  hell\u00d8
 
283
""".encode('latin-1'))
 
284