1
# Copyright (C) 2005 by 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
18
17
"""Tests of status command.
20
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.
25
from cStringIO import StringIO
27
from os import mkdir, chdir
29
from tempfile import TemporaryFile
24
from bzrlib.selftest import TestCaseInTempDir
31
from bzrlib import bzrdir, errors, ignores
33
from bzrlib.builtins import merge
34
from bzrlib.osutils import pathjoin
25
35
from bzrlib.revisionspec import RevisionSpec
26
from bzrlib.merge import merge
27
from cStringIO import StringIO
28
from bzrlib.status import show_status
29
from bzrlib.branch import Branch
31
from bzrlib.clone import copy_branch
33
class BranchStatus(TestCaseInTempDir):
36
from bzrlib.status import show_tree_status
37
from bzrlib.tests import TestCaseWithTransport, TestSkipped
38
from bzrlib.workingtree import WorkingTree
41
class BranchStatus(TestCaseWithTransport):
35
def test_branch_status(self):
43
def test_branch_status(self):
36
44
"""Test basic branch status"""
37
from cStringIO import StringIO
38
from bzrlib.status import show_status
39
from bzrlib.branch import Branch
41
b = Branch.initialize('.')
45
wt = self.make_branch_and_tree('.')
48
ignores._set_user_ignores(['./.bazaar'])
43
50
# status with nothing
45
show_status(b, to_file=tof)
52
show_tree_status(wt, to_file=tof)
46
53
self.assertEquals(tof.getvalue(), "")
49
56
self.build_tree(['hello.c', 'bye.c'])
50
b.add_pending_merge('pending@pending-0-0')
51
show_status(b, to_file=tof)
57
wt.add_pending_merge('pending@pending-0-0')
58
show_tree_status(wt, to_file=tof)
53
60
self.assertEquals(tof.readlines(),
61
68
def test_branch_status_revisions(self):
62
69
"""Tests branch status with revisions"""
64
b = Branch.initialize('.')
70
wt = self.make_branch_and_tree('.')
73
ignores._set_user_ignores(['./.bazaar'])
67
76
self.build_tree(['hello.c', 'bye.c'])
70
b.commit('Test message')
79
wt.commit('Test message')
74
83
revs.append(RevisionSpec(0))
76
show_status(b, to_file=tof, revision=revs)
85
show_tree_status(wt, to_file=tof, revision=revs)
79
88
self.assertEquals(tof.readlines(),
99
def status_string(self, branch):
101
show_status(branch, to_file=tof)
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)
103
return tof.getvalue()
114
return tof.read().decode('utf-8')
105
116
def test_pending(self):
106
"""Pending merges display works"""
117
"""Pending merges display works, including Unicode"""
107
118
mkdir("./branch")
108
b = Branch.initialize('./branch')
109
b.commit("Empty commit 1")
110
b_2 = copy_branch(b, './copy')
111
b.commit("Empty commit 2")
112
merge(["./branch", -1], [None, None], this_dir = './copy')
113
message = self.status_string(b_2)
114
assert (message.startswith("pending merges:\n")), message
115
assert (message.endswith("Empty commit 2\n")), message
117
b.commit("Empty commit 3 blah blah blah blah blah blah blah blah blah")
118
merge(["./branch", -1], [None, None], this_dir = './copy')
119
message = self.status_string(b_2)
120
assert (message.startswith("pending merges:\n")), message
121
assert ("Empty commit 3" in message), message
122
assert (message.endswith("...\n")), message
119
wt = self.make_branch_and_tree('branch')
121
wt.commit("Empty commit 1")
122
b_2_dir = b.bzrdir.sprout('./copy')
123
b_2 = b_2_dir.open_branch()
124
wt2 = b_2_dir.open_workingtree()
125
wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
126
merge(["./branch", -1], [None, None], this_dir = './copy')
127
message = self.status_string(wt2)
128
self.assert_(message.startswith("pending merges:\n"))
129
self.assert_(message.endswith("Empty commit 2\n"))
131
# must be long to make sure we see elipsis at the end
132
wt.commit("Empty commit 3 " +
133
"blah blah blah blah " * 10)
134
merge(["./branch", -1], [None, None], this_dir = './copy')
135
message = self.status_string(wt2)
136
self.assert_(message.startswith("pending merges:\n"))
137
self.assert_("Empty commit 3" in message)
138
self.assert_(message.endswith("...\n"))
124
140
def test_branch_status_specific_files(self):
125
141
"""Tests branch status with given specific files"""
126
from cStringIO import StringIO
127
from bzrlib.status import show_status
128
from bzrlib.branch import Branch
130
b = Branch.initialize('.')
142
wt = self.make_branch_and_tree('.')
145
ignores._set_user_ignores(['./.bazaar'])
132
147
self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
138
show_status(b, to_file=tof)
153
show_tree_status(wt, to_file=tof)
140
155
self.assertEquals(tof.readlines(),
144
159
' directory/hello.c\n'
148
show_status(b, specific_files=['bye.c','test.c','absent.c'], to_file=tof)
150
self.assertEquals(tof.readlines(),
162
self.assertRaises(errors.PathsDoNotExist,
164
wt, specific_files=['bye.c','test.c','absent.c'],
156
show_status(b, specific_files=['directory'], to_file=tof)
168
show_tree_status(wt, specific_files=['directory'], to_file=tof)
158
170
self.assertEquals(tof.readlines(),
160
172
' directory/hello.c\n'
163
show_status(b, specific_files=['dir2'], to_file=tof)
175
show_tree_status(wt, specific_files=['dir2'], to_file=tof)
165
177
self.assertEquals(tof.readlines(),
182
def test_status_nonexistent_file(self):
183
# files that don't exist in either the basis tree or working tree
184
# should give an error
185
wt = self.make_branch_and_tree('.')
186
out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
187
self.assertContainsRe(err, r'do not exist.*does-not-exist')
190
class CheckoutStatus(BranchStatus):
193
super(CheckoutStatus, self).setUp()
197
def make_branch_and_tree(self, relpath):
198
source = self.make_branch(pathjoin('..', relpath))
199
checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
200
bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
201
return checkout.create_workingtree()
204
class TestStatus(TestCaseWithTransport):
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)
228
class TestStatusEncodings(TestCaseWithTransport):
231
TestCaseWithTransport.setUp(self)
232
self.user_encoding = bzrlib.user_encoding
233
self.stdout = sys.stdout
236
bzrlib.user_encoding = self.user_encoding
237
sys.stdout = self.stdout
238
TestCaseWithTransport.tearDown(self)
240
def make_uncommitted_tree(self):
241
"""Build a branch with uncommitted unicode named changes in the cwd."""
242
working_tree = self.make_branch_and_tree(u'.')
243
filename = u'hell\u00d8'
245
self.build_tree_contents([(filename, 'contents of hello')])
246
except UnicodeEncodeError:
247
raise TestSkipped("can't build unicode working tree in "
248
"filesystem encoding %s" % sys.getfilesystemencoding())
249
working_tree.add(filename)
252
def test_stdout_ascii(self):
253
sys.stdout = StringIO()
254
bzrlib.user_encoding = 'ascii'
255
working_tree = self.make_uncommitted_tree()
256
stdout, stderr = self.run_bzr("status")
258
self.assertEquals(stdout, """\
263
def test_stdout_latin1(self):
264
sys.stdout = StringIO()
265
bzrlib.user_encoding = 'latin-1'
266
working_tree = self.make_uncommitted_tree()
267
stdout, stderr = self.run_bzr('status')
269
self.assertEquals(stdout, u"""\
272
""".encode('latin-1'))