41
45
class BranchStatus(TestCaseWithTransport):
43
def assertStatus(self, output_lines, working_tree,
44
revision=None, short=False):
47
def assertStatus(self, expected_lines, working_tree,
48
revision=None, short=False, pending=True, verbose=False):
45
49
"""Run status in working_tree and look for output.
47
:param output_lines: The lines to look for.
51
:param expected_lines: The lines to look for.
48
52
:param working_tree: The tree to run status in.
50
output_string = self.status_string(working_tree, revision, short)
51
self.assertEqual(output_lines, output_string.splitlines(True))
54
output_string = self.status_string(working_tree, revision, short,
56
self.assertEqual(expected_lines, output_string.splitlines(True))
53
def status_string(self, wt, revision=None, short=False):
58
def status_string(self, wt, revision=None, short=False, pending=True,
54
60
# use a real file rather than StringIO because it doesn't handle
55
61
# Unicode very well.
56
62
tof = codecs.getwriter('utf-8')(TemporaryFile())
57
show_tree_status(wt, to_file=tof, revision=revision, short=short)
63
show_tree_status(wt, to_file=tof, revision=revision, short=short,
64
show_pending=pending, verbose=verbose)
59
66
return tof.read().decode('utf-8')
141
167
b_2 = b_2_dir.open_branch()
142
168
wt2 = b_2_dir.open_workingtree()
143
169
wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
144
merge(["./branch", -1], [None, None], this_dir = './copy')
145
message = self.status_string(wt2)
170
wt2.merge_from_branch(wt.branch)
171
message = self.status_string(wt2, verbose=True)
146
172
self.assertStartsWith(message, "pending merges:\n")
147
173
self.assertEndsWith(message, "Empty commit 2\n")
148
174
wt2.commit("merged")
149
175
# must be long to make sure we see elipsis at the end
150
176
wt.commit("Empty commit 3 " +
151
177
"blah blah blah blah " * 100)
152
merge(["./branch", -1], [None, None], this_dir = './copy')
153
message = self.status_string(wt2)
178
wt2.merge_from_branch(wt.branch)
179
message = self.status_string(wt2, verbose=True)
154
180
self.assertStartsWith(message, "pending merges:\n")
155
181
self.assert_("Empty commit 3" in message)
156
182
self.assertEndsWith(message, "...\n")
158
def test_branch_status_specific_files(self):
184
def test_tree_status_ignores(self):
185
"""Tests branch status with ignores"""
186
wt = self.make_branch_and_tree('.')
187
self.run_bzr('ignore *~')
188
wt.commit('commit .bzrignore')
189
self.build_tree(['foo.c', 'foo.c~'])
200
def test_tree_status_specific_files(self):
159
201
"""Tests branch status with given specific files"""
160
202
wt = self.make_branch_and_tree('.')
205
247
self.assertEquals(tof.readlines(),
210
252
show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
212
self.assertEquals(tof.readlines(), ['? dir2\n'])
254
self.assertEquals(tof.readlines(), ['? dir2/\n'])
257
revs = [RevisionSpec.from_string('0'), RevisionSpec.from_string('1')]
258
show_tree_status(wt, specific_files=['test.c'], to_file=tof,
259
short=True, revision=revs)
261
self.assertEquals(tof.readlines(), ['+N test.c\n'])
263
def test_specific_files_conflicts(self):
264
tree = self.make_branch_and_tree('.')
265
self.build_tree(['dir2/'])
267
tree.commit('added dir2')
268
tree.set_conflicts(conflicts.ConflictList(
269
[conflicts.ContentsConflict('foo')]))
271
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
272
self.assertEqualDiff('', tof.getvalue())
273
tree.set_conflicts(conflicts.ConflictList(
274
[conflicts.ContentsConflict('dir2')]))
276
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
277
self.assertEqualDiff('conflicts:\n Contents conflict in dir2\n',
280
tree.set_conflicts(conflicts.ConflictList(
281
[conflicts.ContentsConflict('dir2/file1')]))
283
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
284
self.assertEqualDiff('conflicts:\n Contents conflict in dir2/file1\n',
214
287
def test_status_nonexistent_file(self):
215
288
# files that don't exist in either the basis tree or working tree
216
289
# should give an error
217
290
wt = self.make_branch_and_tree('.')
218
out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
291
out, err = self.run_bzr('status does-not-exist', retcode=3)
219
292
self.assertContainsRe(err, r'do not exist.*does-not-exist')
221
294
def test_status_out_of_date(self):
228
301
tree.commit('add test file')
229
302
# simulate what happens after a remote push
230
303
tree.set_last_revision("0")
231
out, err = self.run_bzr('status')
232
self.assertEqual("working tree is out of date, run 'bzr update'\n",
305
# before run another commands we should unlock tree
307
out, err = self.run_bzr('status')
308
self.assertEqual("working tree is out of date, run 'bzr update'\n",
311
def test_status_write_lock(self):
312
"""Test that status works without fetching history and
315
See https://bugs.launchpad.net/bzr/+bug/149270
318
wt = self.make_branch_and_tree('branch1')
320
wt.commit('Empty commit 1')
321
wt2 = b.bzrdir.sprout('branch2').open_workingtree()
322
wt2.commit('Empty commit 2')
323
out, err = self.run_bzr('status branch1 -rbranch:branch2')
324
self.assertEqual('', out)
238
327
class CheckoutStatus(BranchStatus):
252
341
class TestStatus(TestCaseWithTransport):
254
def test_status(self):
343
def test_status_plain(self):
344
tree = self.make_branch_and_tree('.')
257
346
self.build_tree(['hello.txt'])
258
347
result = self.run_bzr("status")[0]
259
self.assert_("unknown:\n hello.txt\n" in result, result)
260
result = self.run_bzr("status","--short")[0]
261
self.assertContainsRe(result, "[?] hello.txt\n")
348
self.assertContainsRe(result, "unknown:\n hello.txt\n")
263
self.run_bzr("add", "hello.txt")
350
tree.add("hello.txt")
264
351
result = self.run_bzr("status")[0]
265
352
self.assertContainsRe(result, "added:\n hello.txt\n")
266
result = self.run_bzr("status","--short")[0]
267
self.assertContainsRe(result, "[+]N hello.txt\n")
269
self.run_bzr("commit", "-m", "added")
270
result = self.run_bzr("status", "-r", "0..1")[0]
271
self.assertContainsRe(result, "added:\n hello.txt\n")
272
result = self.run_bzr("status", "--short", "-r", "0..1")[0]
273
self.assertContainsRe(result, "[+]N hello.txt\n")
354
tree.commit(message="added")
355
result = self.run_bzr("status -r 0..1")[0]
356
self.assertContainsRe(result, "added:\n hello.txt\n")
358
result = self.run_bzr("status -c 1")[0]
359
self.assertContainsRe(result, "added:\n hello.txt\n")
275
361
self.build_tree(['world.txt'])
276
result = self.run_bzr("status", "-r", "0")[0]
362
result = self.run_bzr("status -r 0")[0]
277
363
self.assertContainsRe(result, "added:\n hello.txt\n" \
278
364
"unknown:\n world.txt\n")
279
result2 = self.run_bzr("status", "-r", "0..")[0]
365
result2 = self.run_bzr("status -r 0..")[0]
280
366
self.assertEquals(result2, result)
281
result = self.run_bzr("status", "--short", "-r", "0")[0]
368
def test_status_short(self):
369
tree = self.make_branch_and_tree('.')
371
self.build_tree(['hello.txt'])
372
result = self.run_bzr("status --short")[0]
373
self.assertContainsRe(result, "[?] hello.txt\n")
375
tree.add("hello.txt")
376
result = self.run_bzr("status --short")[0]
377
self.assertContainsRe(result, "[+]N hello.txt\n")
379
tree.commit(message="added")
380
result = self.run_bzr("status --short -r 0..1")[0]
381
self.assertContainsRe(result, "[+]N hello.txt\n")
383
self.build_tree(['world.txt'])
384
result = self.run_bzr("status --short -r 0")[0]
282
385
self.assertContainsRe(result, "[+]N hello.txt\n" \
283
386
"[?] world.txt\n")
284
result2 = self.run_bzr("status", "--short", "-r", "0..")[0]
387
result2 = self.run_bzr("status --short -r 0..")[0]
388
self.assertEquals(result2, result)
390
def test_status_versioned(self):
391
tree = self.make_branch_and_tree('.')
393
self.build_tree(['hello.txt'])
394
result = self.run_bzr("status --versioned")[0]
395
self.assertNotContainsRe(result, "unknown:\n hello.txt\n")
397
tree.add("hello.txt")
398
result = self.run_bzr("status --versioned")[0]
399
self.assertContainsRe(result, "added:\n hello.txt\n")
402
result = self.run_bzr("status --versioned -r 0..1")[0]
403
self.assertContainsRe(result, "added:\n hello.txt\n")
405
self.build_tree(['world.txt'])
406
result = self.run_bzr("status --versioned -r 0")[0]
407
self.assertContainsRe(result, "added:\n hello.txt\n")
408
self.assertNotContainsRe(result, "unknown:\n world.txt\n")
409
result2 = self.run_bzr("status --versioned -r 0..")[0]
410
self.assertEquals(result2, result)
412
def test_status_SV(self):
413
tree = self.make_branch_and_tree('.')
415
self.build_tree(['hello.txt'])
416
result = self.run_bzr("status -SV")[0]
417
self.assertNotContainsRe(result, "hello.txt")
419
tree.add("hello.txt")
420
result = self.run_bzr("status -SV")[0]
421
self.assertContainsRe(result, "[+]N hello.txt\n")
423
tree.commit(message="added")
424
result = self.run_bzr("status -SV -r 0..1")[0]
425
self.assertContainsRe(result, "[+]N hello.txt\n")
427
self.build_tree(['world.txt'])
428
result = self.run_bzr("status -SV -r 0")[0]
429
self.assertContainsRe(result, "[+]N hello.txt\n")
431
result2 = self.run_bzr("status -SV -r 0..")[0]
285
432
self.assertEquals(result2, result)
287
434
def assertStatusContains(self, pattern):
288
435
"""Run status, and assert it contains the given pattern"""
289
result = self.run_bzr("status", "--short")[0]
436
result = self.run_bzr("status --short")[0]
290
437
self.assertContainsRe(result, pattern)
292
439
def test_kind_change_short(self):
302
449
rmdir('directory')
303
450
self.assertStatusContains('RD file => directory')
452
def test_status_illegal_revision_specifiers(self):
453
out, err = self.run_bzr('status -r 1..23..123', retcode=3)
454
self.assertContainsRe(err, 'one or two revision specifiers')
456
def test_status_no_pending(self):
457
a_tree = self.make_branch_and_tree('a')
458
self.build_tree(['a/a'])
461
b_tree = a_tree.bzrdir.sprout('b').open_workingtree()
462
self.build_tree(['b/b'])
466
self.run_bzr('merge ../b', working_dir='a')
467
out, err = self.run_bzr('status --no-pending', working_dir='a')
468
self.assertEquals(out, "added:\n b\n")
470
def test_pending_specific_files(self):
471
"""With a specific file list, pending merges are not shown."""
472
tree = self.make_branch_and_tree('tree')
473
self.build_tree_contents([('tree/a', 'content of a\n')])
475
r1_id = tree.commit('one')
476
alt = tree.bzrdir.sprout('alt').open_workingtree()
477
self.build_tree_contents([('alt/a', 'content of a\nfrom alt\n')])
478
alt_id = alt.commit('alt')
479
tree.merge_from_branch(alt.branch)
480
output = self.make_utf8_encoded_stringio()
481
show_tree_status(tree, to_file=output)
482
self.assertContainsRe(output.getvalue(), 'pending merge')
483
out, err = self.run_bzr('status tree/a')
484
self.assertNotContainsRe(out, 'pending merge')
306
487
class TestStatusEncodings(TestCaseWithTransport):
309
490
TestCaseWithTransport.setUp(self)
310
self.user_encoding = bzrlib.user_encoding
491
self.user_encoding = osutils._cached_user_encoding
311
492
self.stdout = sys.stdout
313
494
def tearDown(self):