1
# Copyright (C) 2005, 2006 Canonical Ltd
1
# Copyright (C) 2005, 2006 by Canonical Ltd
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
5
5
# the Free Software Foundation; either version 2 of the License, or
6
6
# (at your option) any later version.
8
8
# This program is distributed in the hope that it will be useful,
9
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
11
# GNU General Public License for more details.
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
"""Tests of status command.
19
20
Most of these depend on the particular formatting used.
41
44
class BranchStatus(TestCaseWithTransport):
43
def assertStatus(self, expected_lines, working_tree,
44
revision=None, short=False):
45
"""Run status in working_tree and look for output.
47
:param expected_lines: The lines to look for.
48
:param working_tree: The tree to run status in.
50
output_string = self.status_string(working_tree, revision, short)
51
self.assertEqual(expected_lines, output_string.splitlines(True))
53
def status_string(self, wt, revision=None, short=False):
54
# use a real file rather than StringIO because it doesn't handle
56
tof = codecs.getwriter('utf-8')(TemporaryFile())
57
show_tree_status(wt, to_file=tof, revision=revision, short=short)
59
return tof.read().decode('utf-8')
61
def test_branch_status(self):
46
def test_branch_status(self):
62
47
"""Test basic branch status"""
63
48
wt = self.make_branch_and_tree('.')
65
# status with no commits or files - it must
66
# work and show no output. We do this with no
67
# commits to be sure that it's not going to fail
69
self.assertStatus([], wt)
53
show_tree_status(wt, to_file=tof)
54
self.assertEquals(tof.getvalue(), "")
71
57
self.build_tree(['hello.c', 'bye.c'])
84
# add a commit to allow showing pending merges.
85
wt.commit('create a parent to allow testing merge output')
87
wt.add_parent_tree_id('pending@pending-0-0')
93
' pending@pending-0-0\n',
99
'P pending@pending-0-0\n',
58
wt.add_pending_merge('pending@pending-0-0')
59
show_tree_status(wt, to_file=tof)
61
self.assertEquals(tof.readlines(),
66
' pending@pending-0-0\n'
103
69
def test_branch_status_revisions(self):
104
70
"""Tests branch status with revisions"""
105
71
wt = self.make_branch_and_tree('.')
107
75
self.build_tree(['hello.c', 'bye.c'])
110
78
wt.commit('Test message')
112
revs = [RevisionSpec.from_string('0')]
82
revs.append(RevisionSpec(0))
84
show_tree_status(wt, to_file=tof, revision=revs)
87
self.assertEquals(tof.readlines(),
121
92
self.build_tree(['more.c'])
123
94
wt.commit('Another test message')
125
revs.append(RevisionSpec.from_string('1'))
97
revs.append(RevisionSpec(1))
99
show_tree_status(wt, to_file=tof, revision=revs)
102
self.assertEquals(tof.readlines(),
107
def status_string(self, wt):
108
# use a real file rather than StringIO because it doesn't handle
110
tof = codecs.getwriter('utf-8')(TemporaryFile())
111
show_tree_status(wt, to_file=tof)
113
return tof.read().decode('utf-8')
134
115
def test_pending(self):
135
116
"""Pending merges display works, including Unicode"""
143
124
wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
144
125
merge(["./branch", -1], [None, None], this_dir = './copy')
145
126
message = self.status_string(wt2)
146
self.assertStartsWith(message, "pending merges:\n")
147
self.assertEndsWith(message, "Empty commit 2\n")
127
self.assert_(message.startswith("pending merges:\n"))
128
self.assert_(message.endswith("Empty commit 2\n"))
148
129
wt2.commit("merged")
149
130
# must be long to make sure we see elipsis at the end
150
wt.commit("Empty commit 3 " +
151
"blah blah blah blah " * 100)
131
wt.commit("Empty commit 3 " +
132
"blah blah blah blah " * 10)
152
133
merge(["./branch", -1], [None, None], this_dir = './copy')
153
134
message = self.status_string(wt2)
154
self.assertStartsWith(message, "pending merges:\n")
135
self.assert_(message.startswith("pending merges:\n"))
155
136
self.assert_("Empty commit 3" in message)
156
self.assertEndsWith(message, "...\n")
158
def test_tree_status_ignores(self):
159
"""Tests branch status with ignores"""
160
wt = self.make_branch_and_tree('.')
161
self.run_bzr('ignore', '*~')
162
wt.commit('commit .bzrignore')
163
self.build_tree(['foo.c', 'foo.c~'])
174
def test_tree_status_specific_files(self):
137
self.assert_(message.endswith("...\n"))
139
def test_branch_status_specific_files(self):
175
140
"""Tests branch status with given specific files"""
176
141
wt = self.make_branch_and_tree('.')
234
183
out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
235
184
self.assertContainsRe(err, r'do not exist.*does-not-exist')
237
def test_status_out_of_date(self):
238
"""Simulate status of out-of-date tree after remote push"""
239
tree = self.make_branch_and_tree('.')
240
self.build_tree_contents([('a', 'foo\n')])
244
tree.commit('add test file')
245
# simulate what happens after a remote push
246
tree.set_last_revision("0")
248
# before run another commands we should unlock tree
250
out, err = self.run_bzr('status')
251
self.assertEqual("working tree is out of date, run 'bzr update'\n",
255
187
class CheckoutStatus(BranchStatus):
269
201
class TestStatus(TestCaseWithTransport):
271
def test_status_plain(self):
203
def test_status(self):
272
204
self.run_bzr("init")
274
205
self.build_tree(['hello.txt'])
275
206
result = self.run_bzr("status")[0]
276
self.assertContainsRe(result, "unknown:\n hello.txt\n")
207
self.assert_("unknown:\n hello.txt\n" in result, result)
278
208
self.run_bzr("add", "hello.txt")
279
209
result = self.run_bzr("status")[0]
280
self.assertContainsRe(result, "added:\n hello.txt\n")
210
self.assert_("added:\n hello.txt\n" in result, result)
282
211
self.run_bzr("commit", "-m", "added")
283
212
result = self.run_bzr("status", "-r", "0..1")[0]
284
self.assertContainsRe(result, "added:\n hello.txt\n")
213
self.assert_("added:\n hello.txt\n" in result, result)
286
214
self.build_tree(['world.txt'])
287
215
result = self.run_bzr("status", "-r", "0")[0]
288
self.assertContainsRe(result, "added:\n hello.txt\n" \
289
"unknown:\n world.txt\n")
216
self.assert_("added:\n hello.txt\n" \
217
"unknown:\n world.txt\n" in result, result)
290
219
result2 = self.run_bzr("status", "-r", "0..")[0]
291
220
self.assertEquals(result2, result)
293
def test_status_short(self):
296
self.build_tree(['hello.txt'])
297
result = self.run_bzr("status","--short")[0]
298
self.assertContainsRe(result, "[?] hello.txt\n")
300
self.run_bzr("add", "hello.txt")
301
result = self.run_bzr("status","--short")[0]
302
self.assertContainsRe(result, "[+]N hello.txt\n")
304
self.run_bzr("commit", "-m", "added")
305
result = self.run_bzr("status", "--short", "-r", "0..1")[0]
306
self.assertContainsRe(result, "[+]N hello.txt\n")
308
self.build_tree(['world.txt'])
309
result = self.run_bzr("status", "--short", "-r", "0")[0]
310
self.assertContainsRe(result, "[+]N hello.txt\n" \
312
result2 = self.run_bzr("status", "--short", "-r", "0..")[0]
313
self.assertEquals(result2, result)
315
def test_status_versioned(self):
318
self.build_tree(['hello.txt'])
319
result = self.run_bzr("status", "--versioned")[0]
320
self.assertNotContainsRe(result, "unknown:\n hello.txt\n")
322
self.run_bzr("add", "hello.txt")
323
result = self.run_bzr("status", "--versioned")[0]
324
self.assertContainsRe(result, "added:\n hello.txt\n")
326
self.run_bzr("commit", "-m", "added")
327
result = self.run_bzr("status", "--versioned", "-r", "0..1")[0]
328
self.assertContainsRe(result, "added:\n hello.txt\n")
330
self.build_tree(['world.txt'])
331
result = self.run_bzr("status", "--versioned", "-r", "0")[0]
332
self.assertContainsRe(result, "added:\n hello.txt\n")
333
self.assertNotContainsRe(result, "unknown:\n world.txt\n")
334
result2 = self.run_bzr("status", "--versioned", "-r", "0..")[0]
335
self.assertEquals(result2, result)
337
def assertStatusContains(self, pattern):
338
"""Run status, and assert it contains the given pattern"""
339
result = self.run_bzr("status", "--short")[0]
340
self.assertContainsRe(result, pattern)
342
def test_kind_change_short(self):
343
tree = self.make_branch_and_tree('.')
344
self.build_tree(['file'])
346
tree.commit('added file')
348
self.build_tree(['file/'])
349
self.assertStatusContains('K file => file/')
350
tree.rename_one('file', 'directory')
351
self.assertStatusContains('RK file => directory/')
353
self.assertStatusContains('RD file => directory')
356
223
class TestStatusEncodings(TestCaseWithTransport):