~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-08-17 13:49:05 UTC
  • mfrom: (1711.2.129 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20060817134905-0dec610d2fcd6663
(bialix) 'make html-docs' produces html documentation

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 by Canonical Ltd
2
2
#
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
24
24
 
25
25
from cStringIO import StringIO
26
26
import codecs
27
 
from os import mkdir, chdir, rmdir, unlink
 
27
from os import mkdir, chdir
28
28
import sys
29
29
from tempfile import TemporaryFile
30
30
 
31
 
from bzrlib import (
32
 
    bzrdir,
33
 
    conflicts,
34
 
    errors,
35
 
    )
 
31
from bzrlib import bzrdir, errors, ignores
36
32
import bzrlib.branch
 
33
from bzrlib.builtins import merge
37
34
from bzrlib.osutils import pathjoin
38
35
from bzrlib.revisionspec import RevisionSpec
39
36
from bzrlib.status import show_tree_status
43
40
 
44
41
class BranchStatus(TestCaseWithTransport):
45
42
    
46
 
    def assertStatus(self, expected_lines, working_tree,
47
 
        revision=None, short=False):
48
 
        """Run status in working_tree and look for output.
49
 
        
50
 
        :param expected_lines: The lines to look for.
51
 
        :param working_tree: The tree to run status in.
52
 
        """
53
 
        output_string = self.status_string(working_tree, revision, short)
54
 
        self.assertEqual(expected_lines, output_string.splitlines(True))
55
 
    
56
 
    def status_string(self, wt, revision=None, short=False):
57
 
        # use a real file rather than StringIO because it doesn't handle
58
 
        # Unicode very well.
59
 
        tof = codecs.getwriter('utf-8')(TemporaryFile())
60
 
        show_tree_status(wt, to_file=tof, revision=revision, short=short)
61
 
        tof.seek(0)
62
 
        return tof.read().decode('utf-8')
63
 
 
64
43
    def test_branch_status(self):
65
44
        """Test basic branch status"""
66
45
        wt = self.make_branch_and_tree('.')
67
 
 
68
 
        # status with no commits or files - it must
69
 
        # work and show no output. We do this with no
70
 
        # commits to be sure that it's not going to fail
71
 
        # as a corner case.
72
 
        self.assertStatus([], wt)
73
 
 
 
46
        b = wt.branch
 
47
 
 
48
        ignores._set_user_ignores(['./.bazaar'])
 
49
 
 
50
        # status with nothing
 
51
        tof = StringIO()
 
52
        show_tree_status(wt, to_file=tof)
 
53
        self.assertEquals(tof.getvalue(), "")
 
54
 
 
55
        tof = StringIO()
74
56
        self.build_tree(['hello.c', 'bye.c'])
75
 
        self.assertStatus([
76
 
                'unknown:\n',
77
 
                '  bye.c\n',
78
 
                '  hello.c\n',
79
 
            ],
80
 
            wt)
81
 
        self.assertStatus([
82
 
                '?   bye.c\n',
83
 
                '?   hello.c\n',
84
 
            ],
85
 
            wt, short=True)
86
 
 
87
 
        # add a commit to allow showing pending merges.
88
 
        wt.commit('create a parent to allow testing merge output')
89
 
 
90
 
        wt.add_parent_tree_id('pending@pending-0-0')
91
 
        self.assertStatus([
92
 
                'unknown:\n',
93
 
                '  bye.c\n',
94
 
                '  hello.c\n',
95
 
                'pending merges:\n',
96
 
                '  pending@pending-0-0\n',
97
 
            ],
98
 
            wt)
99
 
        self.assertStatus([
100
 
                '?   bye.c\n',
101
 
                '?   hello.c\n',
102
 
                'P   pending@pending-0-0\n',
103
 
            ],
104
 
            wt, short=True)
 
57
        wt.add_pending_merge('pending@pending-0-0')
 
58
        show_tree_status(wt, to_file=tof)
 
59
        tof.seek(0)
 
60
        self.assertEquals(tof.readlines(),
 
61
                          ['unknown:\n',
 
62
                           '  bye.c\n',
 
63
                           '  hello.c\n',
 
64
                           'pending merges:\n',
 
65
                           '  pending@pending-0-0\n'
 
66
                           ])
105
67
 
106
68
    def test_branch_status_revisions(self):
107
69
        """Tests branch status with revisions"""
108
70
        wt = self.make_branch_and_tree('.')
109
 
 
 
71
        b = wt.branch
 
72
 
 
73
        ignores._set_user_ignores(['./.bazaar'])
 
74
 
 
75
        tof = StringIO()
110
76
        self.build_tree(['hello.c', 'bye.c'])
111
77
        wt.add('hello.c')
112
78
        wt.add('bye.c')
113
79
        wt.commit('Test message')
114
80
 
115
 
        revs = [RevisionSpec.from_string('0')]
116
 
        self.assertStatus([
117
 
                'added:\n',
118
 
                '  bye.c\n',
119
 
                '  hello.c\n'
120
 
            ],
121
 
            wt,
122
 
            revision=revs)
 
81
        tof = StringIO()
 
82
        revs =[]
 
83
        revs.append(RevisionSpec(0))
 
84
        
 
85
        show_tree_status(wt, to_file=tof, revision=revs)
 
86
        
 
87
        tof.seek(0)
 
88
        self.assertEquals(tof.readlines(),
 
89
                          ['added:\n',
 
90
                           '  bye.c\n',
 
91
                           '  hello.c\n'])
123
92
 
124
93
        self.build_tree(['more.c'])
125
94
        wt.add('more.c')
126
95
        wt.commit('Another test message')
127
96
        
128
 
        revs.append(RevisionSpec.from_string('1'))
129
 
        self.assertStatus([
130
 
                'added:\n',
131
 
                '  bye.c\n',
132
 
                '  hello.c\n',
133
 
            ],
134
 
            wt,
135
 
            revision=revs)
 
97
        tof = StringIO()
 
98
        revs.append(RevisionSpec(1))
 
99
        
 
100
        show_tree_status(wt, to_file=tof, revision=revs)
 
101
        
 
102
        tof.seek(0)
 
103
        self.assertEquals(tof.readlines(),
 
104
                          ['added:\n',
 
105
                           '  bye.c\n',
 
106
                           '  hello.c\n'])
 
107
 
 
108
    def status_string(self, wt):
 
109
        # use a real file rather than StringIO because it doesn't handle
 
110
        # Unicode very well.
 
111
        tof = codecs.getwriter('utf-8')(TemporaryFile())
 
112
        show_tree_status(wt, to_file=tof)
 
113
        tof.seek(0)
 
114
        return tof.read().decode('utf-8')
136
115
 
137
116
    def test_pending(self):
138
117
        """Pending merges display works, including Unicode"""
144
123
        b_2 = b_2_dir.open_branch()
145
124
        wt2 = b_2_dir.open_workingtree()
146
125
        wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
147
 
        wt2.merge_from_branch(wt.branch)
 
126
        merge(["./branch", -1], [None, None], this_dir = './copy')
148
127
        message = self.status_string(wt2)
149
 
        self.assertStartsWith(message, "pending merges:\n")
150
 
        self.assertEndsWith(message, "Empty commit 2\n")
 
128
        self.assert_(message.startswith("pending merges:\n"))
 
129
        self.assert_(message.endswith("Empty commit 2\n")) 
151
130
        wt2.commit("merged")
152
131
        # must be long to make sure we see elipsis at the end
153
 
        wt.commit("Empty commit 3 " +
154
 
                   "blah blah blah blah " * 100)
155
 
        wt2.merge_from_branch(wt.branch)
 
132
        wt.commit("Empty commit 3 " + 
 
133
                   "blah blah blah blah " * 10)
 
134
        merge(["./branch", -1], [None, None], this_dir = './copy')
156
135
        message = self.status_string(wt2)
157
 
        self.assertStartsWith(message, "pending merges:\n")
 
136
        self.assert_(message.startswith("pending merges:\n"))
158
137
        self.assert_("Empty commit 3" in message)
159
 
        self.assertEndsWith(message, "...\n")
160
 
 
161
 
    def test_tree_status_ignores(self):
162
 
        """Tests branch status with ignores"""
163
 
        wt = self.make_branch_and_tree('.')
164
 
        self.run_bzr('ignore *~')
165
 
        wt.commit('commit .bzrignore')
166
 
        self.build_tree(['foo.c', 'foo.c~'])
167
 
        self.assertStatus([
168
 
                'unknown:\n',
169
 
                '  foo.c\n',
170
 
                ],
171
 
                wt)
172
 
        self.assertStatus([
173
 
                '?   foo.c\n',
174
 
                ],
175
 
                wt, short=True)
176
 
 
177
 
    def test_tree_status_specific_files(self):
 
138
        self.assert_(message.endswith("...\n")) 
 
139
 
 
140
    def test_branch_status_specific_files(self): 
178
141
        """Tests branch status with given specific files"""
179
142
        wt = self.make_branch_and_tree('.')
180
143
        b = wt.branch
181
144
 
 
145
        ignores._set_user_ignores(['./.bazaar'])
 
146
 
182
147
        self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
183
148
        wt.add('directory')
184
149
        wt.add('test.c')
185
150
        wt.commit('testing')
186
151
        
187
 
        self.assertStatus([
188
 
                'unknown:\n',
189
 
                '  bye.c\n',
190
 
                '  dir2/\n',
191
 
                '  directory/hello.c\n'
192
 
                ],
193
 
                wt)
194
 
 
195
 
        self.assertStatus([
196
 
                '?   bye.c\n',
197
 
                '?   dir2/\n',
198
 
                '?   directory/hello.c\n'
199
 
                ],
200
 
                wt, short=True)
201
 
 
202
152
        tof = StringIO()
 
153
        show_tree_status(wt, to_file=tof)
 
154
        tof.seek(0)
 
155
        self.assertEquals(tof.readlines(),
 
156
                          ['unknown:\n',
 
157
                           '  bye.c\n',
 
158
                           '  dir2\n',
 
159
                           '  directory/hello.c\n'
 
160
                           ])
 
161
 
203
162
        self.assertRaises(errors.PathsDoNotExist,
204
163
                          show_tree_status,
205
164
                          wt, specific_files=['bye.c','test.c','absent.c'], 
213
172
                           '  directory/hello.c\n'
214
173
                           ])
215
174
        tof = StringIO()
216
 
        show_tree_status(wt, specific_files=['directory'], to_file=tof,
217
 
                         short=True)
218
 
        tof.seek(0)
219
 
        self.assertEquals(tof.readlines(), ['?   directory/hello.c\n'])
220
 
 
221
 
        tof = StringIO()
222
175
        show_tree_status(wt, specific_files=['dir2'], to_file=tof)
223
176
        tof.seek(0)
224
177
        self.assertEquals(tof.readlines(),
225
178
                          ['unknown:\n',
226
 
                           '  dir2/\n'
 
179
                           '  dir2\n'
227
180
                           ])
228
 
        tof = StringIO()
229
 
        show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
230
 
        tof.seek(0)
231
 
        self.assertEquals(tof.readlines(), ['?   dir2/\n'])
232
 
 
233
 
        tof = StringIO()
234
 
        revs = [RevisionSpec.from_string('0'), RevisionSpec.from_string('1')]
235
 
        show_tree_status(wt, specific_files=['test.c'], to_file=tof,
236
 
                         short=True, revision=revs)
237
 
        tof.seek(0)
238
 
        self.assertEquals(tof.readlines(), ['+N  test.c\n'])
239
 
 
240
 
    def test_specific_files_conflicts(self):
241
 
        tree = self.make_branch_and_tree('.')
242
 
        self.build_tree(['dir2/'])
243
 
        tree.add('dir2')
244
 
        tree.commit('added dir2')
245
 
        tree.set_conflicts(conflicts.ConflictList(
246
 
            [conflicts.ContentsConflict('foo')]))
247
 
        tof = StringIO()
248
 
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
249
 
        self.assertEqualDiff('', tof.getvalue())
250
 
        tree.set_conflicts(conflicts.ConflictList(
251
 
            [conflicts.ContentsConflict('dir2')]))
252
 
        tof = StringIO()
253
 
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
254
 
        self.assertEqualDiff('conflicts:\n  Contents conflict in dir2\n',
255
 
                             tof.getvalue())
256
 
 
257
 
        tree.set_conflicts(conflicts.ConflictList(
258
 
            [conflicts.ContentsConflict('dir2/file1')]))
259
 
        tof = StringIO()
260
 
        show_tree_status(tree, specific_files=['dir2'], to_file=tof)
261
 
        self.assertEqualDiff('conflicts:\n  Contents conflict in dir2/file1\n',
262
 
                             tof.getvalue())
263
181
 
264
182
    def test_status_nonexistent_file(self):
265
183
        # files that don't exist in either the basis tree or working tree
266
184
        # should give an error
267
185
        wt = self.make_branch_and_tree('.')
268
 
        out, err = self.run_bzr('status does-not-exist', retcode=3)
 
186
        out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
269
187
        self.assertContainsRe(err, r'do not exist.*does-not-exist')
270
188
 
271
 
    def test_status_out_of_date(self):
272
 
        """Simulate status of out-of-date tree after remote push"""
273
 
        tree = self.make_branch_and_tree('.')
274
 
        self.build_tree_contents([('a', 'foo\n')])
275
 
        tree.lock_write()
276
 
        try:
277
 
            tree.add(['a'])
278
 
            tree.commit('add test file')
279
 
            # simulate what happens after a remote push
280
 
            tree.set_last_revision("0")
281
 
        finally:
282
 
            # before run another commands we should unlock tree
283
 
            tree.unlock()
284
 
        out, err = self.run_bzr('status')
285
 
        self.assertEqual("working tree is out of date, run 'bzr update'\n",
286
 
                         err)
287
 
 
288
189
 
289
190
class CheckoutStatus(BranchStatus):
290
191
 
302
203
 
303
204
class TestStatus(TestCaseWithTransport):
304
205
 
305
 
    def test_status_plain(self):
306
 
        tree = self.make_branch_and_tree('.')
307
 
 
308
 
        self.build_tree(['hello.txt'])
309
 
        result = self.run_bzr("status")[0]
310
 
        self.assertContainsRe(result, "unknown:\n  hello.txt\n")
311
 
 
312
 
        tree.add("hello.txt")
313
 
        result = self.run_bzr("status")[0]
314
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
315
 
 
316
 
        tree.commit(message="added")
317
 
        result = self.run_bzr("status -r 0..1")[0]
318
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
319
 
 
320
 
        result = self.run_bzr("status -c 1")[0]
321
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
322
 
 
323
 
        self.build_tree(['world.txt'])
324
 
        result = self.run_bzr("status -r 0")[0]
325
 
        self.assertContainsRe(result, "added:\n  hello.txt\n" \
326
 
                                      "unknown:\n  world.txt\n")
327
 
        result2 = self.run_bzr("status -r 0..")[0]
328
 
        self.assertEquals(result2, result)
329
 
 
330
 
    def test_status_short(self):
331
 
        tree = self.make_branch_and_tree('.')
332
 
 
333
 
        self.build_tree(['hello.txt'])
334
 
        result = self.run_bzr("status --short")[0]
335
 
        self.assertContainsRe(result, "[?]   hello.txt\n")
336
 
 
337
 
        tree.add("hello.txt")
338
 
        result = self.run_bzr("status --short")[0]
339
 
        self.assertContainsRe(result, "[+]N  hello.txt\n")
340
 
 
341
 
        tree.commit(message="added")
342
 
        result = self.run_bzr("status --short -r 0..1")[0]
343
 
        self.assertContainsRe(result, "[+]N  hello.txt\n")
344
 
 
345
 
        self.build_tree(['world.txt'])
346
 
        result = self.run_bzr("status --short -r 0")[0]
347
 
        self.assertContainsRe(result, "[+]N  hello.txt\n" \
348
 
                                      "[?]   world.txt\n")
349
 
        result2 = self.run_bzr("status --short -r 0..")[0]
350
 
        self.assertEquals(result2, result)
351
 
 
352
 
    def test_status_versioned(self):
353
 
        tree = self.make_branch_and_tree('.')
354
 
 
355
 
        self.build_tree(['hello.txt'])
356
 
        result = self.run_bzr("status --versioned")[0]
357
 
        self.assertNotContainsRe(result, "unknown:\n  hello.txt\n")
358
 
 
359
 
        tree.add("hello.txt")
360
 
        result = self.run_bzr("status --versioned")[0]
361
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
362
 
 
363
 
        tree.commit("added")
364
 
        result = self.run_bzr("status --versioned -r 0..1")[0]
365
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
366
 
 
367
 
        self.build_tree(['world.txt'])
368
 
        result = self.run_bzr("status --versioned -r 0")[0]
369
 
        self.assertContainsRe(result, "added:\n  hello.txt\n")
370
 
        self.assertNotContainsRe(result, "unknown:\n  world.txt\n")
371
 
        result2 = self.run_bzr("status --versioned -r 0..")[0]
372
 
        self.assertEquals(result2, result)
373
 
 
374
 
    def test_status_SV(self):
375
 
        tree = self.make_branch_and_tree('.')
376
 
 
377
 
        self.build_tree(['hello.txt'])
378
 
        result = self.run_bzr("status -SV")[0]
379
 
        self.assertNotContainsRe(result, "hello.txt")
380
 
 
381
 
        tree.add("hello.txt")
382
 
        result = self.run_bzr("status -SV")[0]
383
 
        self.assertContainsRe(result, "[+]N  hello.txt\n")
384
 
 
385
 
        tree.commit(message="added")
386
 
        result = self.run_bzr("status -SV -r 0..1")[0]
387
 
        self.assertContainsRe(result, "[+]N  hello.txt\n")
388
 
 
389
 
        self.build_tree(['world.txt'])
390
 
        result = self.run_bzr("status -SV -r 0")[0]
391
 
        self.assertContainsRe(result, "[+]N  hello.txt\n")
392
 
 
393
 
        result2 = self.run_bzr("status -SV -r 0..")[0]
394
 
        self.assertEquals(result2, result)
395
 
 
396
 
    def assertStatusContains(self, pattern):
397
 
        """Run status, and assert it contains the given pattern"""
398
 
        result = self.run_bzr("status --short")[0]
399
 
        self.assertContainsRe(result, pattern)
400
 
 
401
 
    def test_kind_change_short(self):
402
 
        tree = self.make_branch_and_tree('.')
403
 
        self.build_tree(['file'])
404
 
        tree.add('file')
405
 
        tree.commit('added file')
406
 
        unlink('file')
407
 
        self.build_tree(['file/'])
408
 
        self.assertStatusContains('K  file => file/')
409
 
        tree.rename_one('file', 'directory')
410
 
        self.assertStatusContains('RK  file => directory/')
411
 
        rmdir('directory')
412
 
        self.assertStatusContains('RD  file => directory')
413
 
 
414
 
    def test_status_illegal_revision_specifiers(self):
415
 
        out, err = self.run_bzr('status -r 1..23..123', retcode=3)
416
 
        self.assertContainsRe(err, 'one or two revision specifiers')
 
206
    def test_status(self):
 
207
        ignores._set_user_ignores(['./.bazaar'])
 
208
 
 
209
        self.run_bzr("init")
 
210
        self.build_tree(['hello.txt'])
 
211
        result = self.run_bzr("status")[0]
 
212
        self.assert_("unknown:\n  hello.txt\n" in result, result)
 
213
        self.run_bzr("add", "hello.txt")
 
214
        result = self.run_bzr("status")[0]
 
215
        self.assert_("added:\n  hello.txt\n" in result, result)
 
216
        self.run_bzr("commit", "-m", "added")
 
217
        result = self.run_bzr("status", "-r", "0..1")[0]
 
218
        self.assert_("added:\n  hello.txt\n" in result, result)
 
219
        self.build_tree(['world.txt'])
 
220
        result = self.run_bzr("status", "-r", "0")[0]
 
221
        self.assert_("added:\n  hello.txt\n" \
 
222
                     "unknown:\n  world.txt\n" in result, result)
 
223
 
 
224
        result2 = self.run_bzr("status", "-r", "0..")[0]
 
225
        self.assertEquals(result2, result)
417
226
 
418
227
 
419
228
class TestStatusEncodings(TestCaseWithTransport):