44
41
class BranchStatus(TestCaseWithTransport):
46
def assertStatus(self, expected_lines, working_tree,
47
revision=None, short=False):
48
"""Run status in working_tree and look for output.
50
:param expected_lines: The lines to look for.
51
:param working_tree: The tree to run status in.
53
output_string = self.status_string(working_tree, revision, short)
54
self.assertEqual(expected_lines, output_string.splitlines(True))
56
def status_string(self, wt, revision=None, short=False):
57
# use a real file rather than StringIO because it doesn't handle
59
tof = codecs.getwriter('utf-8')(TemporaryFile())
60
show_tree_status(wt, to_file=tof, revision=revision, short=short)
62
return tof.read().decode('utf-8')
64
43
def test_branch_status(self):
65
44
"""Test basic branch status"""
66
45
wt = self.make_branch_and_tree('.')
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
72
self.assertStatus([], wt)
48
ignores._set_user_ignores(['./.bazaar'])
52
show_tree_status(wt, to_file=tof)
53
self.assertEquals(tof.getvalue(), "")
74
56
self.build_tree(['hello.c', 'bye.c'])
87
# add a commit to allow showing pending merges.
88
wt.commit('create a parent to allow testing merge output')
90
wt.add_parent_tree_id('pending@pending-0-0')
96
' pending@pending-0-0\n',
102
'P pending@pending-0-0\n',
57
wt.add_pending_merge('pending@pending-0-0')
58
show_tree_status(wt, to_file=tof)
60
self.assertEquals(tof.readlines(),
65
' pending@pending-0-0\n'
106
68
def test_branch_status_revisions(self):
107
69
"""Tests branch status with revisions"""
108
70
wt = self.make_branch_and_tree('.')
73
ignores._set_user_ignores(['./.bazaar'])
110
76
self.build_tree(['hello.c', 'bye.c'])
113
79
wt.commit('Test message')
115
revs = [RevisionSpec.from_string('0')]
83
revs.append(RevisionSpec(0))
85
show_tree_status(wt, to_file=tof, revision=revs)
88
self.assertEquals(tof.readlines(),
124
93
self.build_tree(['more.c'])
126
95
wt.commit('Another test message')
128
revs.append(RevisionSpec.from_string('1'))
98
revs.append(RevisionSpec(1))
100
show_tree_status(wt, to_file=tof, revision=revs)
103
self.assertEquals(tof.readlines(),
108
def status_string(self, wt):
109
# use a real file rather than StringIO because it doesn't handle
111
tof = codecs.getwriter('utf-8')(TemporaryFile())
112
show_tree_status(wt, to_file=tof)
114
return tof.read().decode('utf-8')
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")
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~'])
177
def test_tree_status_specific_files(self):
138
self.assert_(message.endswith("...\n"))
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('.')
145
ignores._set_user_ignores(['./.bazaar'])
182
147
self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
183
148
wt.add('directory')
185
150
wt.commit('testing')
191
' directory/hello.c\n'
198
'? directory/hello.c\n'
153
show_tree_status(wt, to_file=tof)
155
self.assertEquals(tof.readlines(),
159
' directory/hello.c\n'
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'
216
show_tree_status(wt, specific_files=['directory'], to_file=tof,
219
self.assertEquals(tof.readlines(), ['? directory/hello.c\n'])
222
175
show_tree_status(wt, specific_files=['dir2'], to_file=tof)
224
177
self.assertEquals(tof.readlines(),
229
show_tree_status(wt, specific_files=['dir2'], to_file=tof, short=True)
231
self.assertEquals(tof.readlines(), ['? dir2/\n'])
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)
238
self.assertEquals(tof.readlines(), ['+N test.c\n'])
240
def test_specific_files_conflicts(self):
241
tree = self.make_branch_and_tree('.')
242
self.build_tree(['dir2/'])
244
tree.commit('added dir2')
245
tree.set_conflicts(conflicts.ConflictList(
246
[conflicts.ContentsConflict('foo')]))
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')]))
253
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
254
self.assertEqualDiff('conflicts:\n Contents conflict in dir2\n',
257
tree.set_conflicts(conflicts.ConflictList(
258
[conflicts.ContentsConflict('dir2/file1')]))
260
show_tree_status(tree, specific_files=['dir2'], to_file=tof)
261
self.assertEqualDiff('conflicts:\n Contents conflict in dir2/file1\n',
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')
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')])
278
tree.commit('add test file')
279
# simulate what happens after a remote push
280
tree.set_last_revision("0")
282
# before run another commands we should unlock tree
284
out, err = self.run_bzr('status')
285
self.assertEqual("working tree is out of date, run 'bzr update'\n",
289
190
class CheckoutStatus(BranchStatus):
303
204
class TestStatus(TestCaseWithTransport):
305
def test_status_plain(self):
306
tree = self.make_branch_and_tree('.')
308
self.build_tree(['hello.txt'])
309
result = self.run_bzr("status")[0]
310
self.assertContainsRe(result, "unknown:\n hello.txt\n")
312
tree.add("hello.txt")
313
result = self.run_bzr("status")[0]
314
self.assertContainsRe(result, "added:\n hello.txt\n")
316
tree.commit(message="added")
317
result = self.run_bzr("status -r 0..1")[0]
318
self.assertContainsRe(result, "added:\n hello.txt\n")
320
result = self.run_bzr("status -c 1")[0]
321
self.assertContainsRe(result, "added:\n hello.txt\n")
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)
330
def test_status_short(self):
331
tree = self.make_branch_and_tree('.')
333
self.build_tree(['hello.txt'])
334
result = self.run_bzr("status --short")[0]
335
self.assertContainsRe(result, "[?] hello.txt\n")
337
tree.add("hello.txt")
338
result = self.run_bzr("status --short")[0]
339
self.assertContainsRe(result, "[+]N hello.txt\n")
341
tree.commit(message="added")
342
result = self.run_bzr("status --short -r 0..1")[0]
343
self.assertContainsRe(result, "[+]N hello.txt\n")
345
self.build_tree(['world.txt'])
346
result = self.run_bzr("status --short -r 0")[0]
347
self.assertContainsRe(result, "[+]N hello.txt\n" \
349
result2 = self.run_bzr("status --short -r 0..")[0]
350
self.assertEquals(result2, result)
352
def test_status_versioned(self):
353
tree = self.make_branch_and_tree('.')
355
self.build_tree(['hello.txt'])
356
result = self.run_bzr("status --versioned")[0]
357
self.assertNotContainsRe(result, "unknown:\n hello.txt\n")
359
tree.add("hello.txt")
360
result = self.run_bzr("status --versioned")[0]
361
self.assertContainsRe(result, "added:\n hello.txt\n")
364
result = self.run_bzr("status --versioned -r 0..1")[0]
365
self.assertContainsRe(result, "added:\n hello.txt\n")
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)
374
def test_status_SV(self):
375
tree = self.make_branch_and_tree('.')
377
self.build_tree(['hello.txt'])
378
result = self.run_bzr("status -SV")[0]
379
self.assertNotContainsRe(result, "hello.txt")
381
tree.add("hello.txt")
382
result = self.run_bzr("status -SV")[0]
383
self.assertContainsRe(result, "[+]N hello.txt\n")
385
tree.commit(message="added")
386
result = self.run_bzr("status -SV -r 0..1")[0]
387
self.assertContainsRe(result, "[+]N hello.txt\n")
389
self.build_tree(['world.txt'])
390
result = self.run_bzr("status -SV -r 0")[0]
391
self.assertContainsRe(result, "[+]N hello.txt\n")
393
result2 = self.run_bzr("status -SV -r 0..")[0]
394
self.assertEquals(result2, result)
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)
401
def test_kind_change_short(self):
402
tree = self.make_branch_and_tree('.')
403
self.build_tree(['file'])
405
tree.commit('added file')
407
self.build_tree(['file/'])
408
self.assertStatusContains('K file => file/')
409
tree.rename_one('file', 'directory')
410
self.assertStatusContains('RK file => directory/')
412
self.assertStatusContains('RD file => directory')
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'])
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)
224
result2 = self.run_bzr("status", "-r", "0..")[0]
225
self.assertEquals(result2, result)
419
228
class TestStatusEncodings(TestCaseWithTransport):