18
18
"""Tests of status command.
20
20
Most of these depend on the particular formatting used.
21
As such they really are blackbox tests even though some of the
22
tests are not using self.capture. If we add tests for the programmatic
23
interface later, they will be non blackbox tests.
24
27
from cStringIO import StringIO
28
from os import mkdir, chdir
26
29
from tempfile import TemporaryFile
29
from bzrlib.tests import TestCaseInTempDir
33
from bzrlib.builtins import merge
34
import bzrlib.bzrdir as bzrdir
35
import bzrlib.errors as errors
36
from bzrlib.osutils import pathjoin
30
37
from bzrlib.revisionspec import RevisionSpec
31
from bzrlib.merge import merge
32
from bzrlib.status import show_status
33
from bzrlib.branch import Branch
34
from bzrlib.clone import copy_branch
36
class BranchStatus(TestCaseInTempDir):
38
from bzrlib.status import show_tree_status
39
from bzrlib.tests import TestCaseWithTransport
40
from bzrlib.workingtree import WorkingTree
43
class BranchStatus(TestCaseWithTransport):
38
45
def test_branch_status(self):
39
46
"""Test basic branch status"""
40
from bzrlib.status import show_status
41
from bzrlib.branch import Branch
43
b = Branch.initialize(u'.')
47
wt = self.make_branch_and_tree('.')
45
50
# status with nothing
47
show_status(b, to_file=tof)
52
show_tree_status(wt, to_file=tof)
48
53
self.assertEquals(tof.getvalue(), "")
51
56
self.build_tree(['hello.c', 'bye.c'])
52
b.working_tree().add_pending_merge('pending@pending-0-0')
53
show_status(b, to_file=tof)
57
wt.add_pending_merge('pending@pending-0-0')
58
show_tree_status(wt, to_file=tof)
55
60
self.assertEquals(tof.readlines(),
63
68
def test_branch_status_revisions(self):
64
69
"""Tests branch status with revisions"""
66
b = Branch.initialize(u'.')
70
wt = self.make_branch_and_tree('.')
69
74
self.build_tree(['hello.c', 'bye.c'])
70
b.working_tree().add('hello.c')
71
b.working_tree().add('bye.c')
72
b.working_tree().commit('Test message')
77
wt.commit('Test message')
76
81
revs.append(RevisionSpec(0))
78
show_status(b, to_file=tof, revision=revs)
83
show_tree_status(wt, to_file=tof, revision=revs)
81
86
self.assertEquals(tof.readlines(),
86
91
self.build_tree(['more.c'])
87
b.working_tree().add('more.c')
88
b.working_tree().commit('Another test message')
93
wt.commit('Another test message')
91
96
revs.append(RevisionSpec(1))
93
show_status(b, to_file=tof, revision=revs)
98
show_tree_status(wt, to_file=tof, revision=revs)
96
101
self.assertEquals(tof.readlines(),
101
def status_string(self, branch):
106
def status_string(self, wt):
102
107
# use a real file rather than StringIO because it doesn't handle
103
108
# Unicode very well.
104
109
tof = codecs.getwriter('utf-8')(TemporaryFile())
105
show_status(branch, to_file=tof)
110
show_tree_status(wt, to_file=tof)
107
112
return tof.read().decode('utf-8')
109
114
def test_pending(self):
110
115
"""Pending merges display works, including Unicode"""
111
116
mkdir("./branch")
112
b = Branch.initialize('./branch')
113
b.working_tree().commit("Empty commit 1")
114
b_2 = copy_branch(b, './copy')
115
b.working_tree().commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
117
wt = self.make_branch_and_tree('branch')
119
wt.commit("Empty commit 1")
120
b_2_dir = b.bzrdir.sprout('./copy')
121
b_2 = b_2_dir.open_branch()
122
wt2 = b_2_dir.open_workingtree()
123
wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
116
124
merge(["./branch", -1], [None, None], this_dir = './copy')
117
message = self.status_string(b_2)
125
message = self.status_string(wt2)
118
126
self.assert_(message.startswith("pending merges:\n"))
119
127
self.assert_(message.endswith("Empty commit 2\n"))
120
b_2.working_tree().commit("merged")
121
129
# must be long to make sure we see elipsis at the end
122
b.working_tree().commit("Empty commit 3 " +
123
"blah blah blah blah " * 10)
130
wt.commit("Empty commit 3 " +
131
"blah blah blah blah " * 10)
124
132
merge(["./branch", -1], [None, None], this_dir = './copy')
125
message = self.status_string(b_2)
133
message = self.status_string(wt2)
126
134
self.assert_(message.startswith("pending merges:\n"))
127
135
self.assert_("Empty commit 3" in message)
128
136
self.assert_(message.endswith("...\n"))
130
138
def test_branch_status_specific_files(self):
131
139
"""Tests branch status with given specific files"""
132
from cStringIO import StringIO
133
from bzrlib.status import show_status
134
from bzrlib.branch import Branch
136
b = Branch.initialize(u'.')
140
wt = self.make_branch_and_tree('.')
138
143
self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
139
b.working_tree().add('directory')
140
b.working_tree().add('test.c')
141
b.working_tree().commit('testing')
144
show_status(b, to_file=tof)
149
show_tree_status(wt, to_file=tof)
146
151
self.assertEquals(tof.readlines(),
150
155
' directory/hello.c\n'
154
show_status(b, specific_files=['bye.c','test.c','absent.c'], to_file=tof)
156
self.assertEquals(tof.readlines(),
158
self.assertRaises(errors.PathsDoNotExist,
160
wt, specific_files=['bye.c','test.c','absent.c'],
162
show_status(b, specific_files=['directory'], to_file=tof)
164
show_tree_status(wt, specific_files=['directory'], to_file=tof)
164
166
self.assertEquals(tof.readlines(),
166
168
' directory/hello.c\n'
169
show_status(b, specific_files=['dir2'], to_file=tof)
171
show_tree_status(wt, specific_files=['dir2'], to_file=tof)
171
173
self.assertEquals(tof.readlines(),
178
def test_status_nonexistent_file(self):
179
# files that don't exist in either the basis tree or working tree
180
# should give an error
181
wt = self.make_branch_and_tree('.')
182
out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
183
self.assertContainsRe(err, r'do not exist.*does-not-exist')
186
class CheckoutStatus(BranchStatus):
189
super(CheckoutStatus, self).setUp()
193
def make_branch_and_tree(self, relpath):
194
source = self.make_branch(pathjoin('..', relpath))
195
checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
196
bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
197
return checkout.create_workingtree()
200
class TestStatus(TestCaseWithTransport):
202
def test_status(self):
204
self.build_tree(['hello.txt'])
205
result = self.run_bzr("status")[0]
206
self.assert_("unknown:\n hello.txt\n" in result, result)
207
self.run_bzr("add", "hello.txt")
208
result = self.run_bzr("status")[0]
209
self.assert_("added:\n hello.txt\n" in result, result)
210
self.run_bzr("commit", "-m", "added")
211
result = self.run_bzr("status", "-r", "0..1")[0]
212
self.assert_("added:\n hello.txt\n" in result, result)
213
self.build_tree(['world.txt'])
214
result = self.run_bzr("status", "-r", "0")[0]
215
self.assert_("added:\n hello.txt\n" \
216
"unknown:\n world.txt\n" in result, result)
218
result2 = self.run_bzr("status", "-r", "0..")[0]
219
self.assertEquals(result2, result)