/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1662.1.13 by Martin Pool
Fix up blackbox test for error on status of nonexistent files
1
# Copyright (C) 2005, 2006 by Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
915 by Martin Pool
- add simple test case for bzr status
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
915 by Martin Pool
- add simple test case for bzr status
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
915 by Martin Pool
- add simple test case for bzr status
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Tests of status command.
18
19
Most of these depend on the particular formatting used.
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
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.
915 by Martin Pool
- add simple test case for bzr status
23
"""
24
1185.33.71 by Martin Pool
Status tests include unicode character.
25
from cStringIO import StringIO
1685.1.80 by Wouter van Heyst
more code cleanup
26
import codecs
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
27
from os import mkdir, chdir
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
28
import sys
1185.33.71 by Martin Pool
Status tests include unicode character.
29
from tempfile import TemporaryFile
30
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
31
from bzrlib import bzrdir, errors, ignores
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
32
import bzrlib.branch
1534.4.28 by Robert Collins
first cut at merge from integration.
33
from bzrlib.builtins import merge
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
34
from bzrlib.osutils import pathjoin
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
35
from bzrlib.revisionspec import RevisionSpec
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
36
from bzrlib.status import show_tree_status
1685.1.75 by Wouter van Heyst
more tests handle LANG=C
37
from bzrlib.tests import TestCaseWithTransport, TestSkipped
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
38
from bzrlib.workingtree import WorkingTree
39
915 by Martin Pool
- add simple test case for bzr status
40
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
41
class BranchStatus(TestCaseWithTransport):
1102 by Martin Pool
- merge test refactoring from robertc
42
    
1927.2.3 by Robert Collins
review comment application - paired with Martin.
43
    def assertStatus(self, output_lines, working_tree,
44
        revision=None):
45
        """Run status in working_tree and look for output.
46
        
47
        :param output_lines: The lines to look for.
48
        :param working_tree: The tree to run status in.
49
        """
50
        output_string = self.status_string(working_tree, revision)
51
        self.assertEqual(output_lines, output_string.splitlines(True))
52
    
53
    def status_string(self, wt, revision=None):
54
        # use a real file rather than StringIO because it doesn't handle
55
        # Unicode very well.
56
        tof = codecs.getwriter('utf-8')(TemporaryFile())
57
        show_tree_status(wt, to_file=tof, revision=revision)
58
        tof.seek(0)
59
        return tof.read().decode('utf-8')
60
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
61
    def test_branch_status(self):
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
62
        """Test basic branch status"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
63
        wt = self.make_branch_and_tree('.')
1927.2.3 by Robert Collins
review comment application - paired with Martin.
64
65
        ignores._set_user_ignores(['./.bazaar'])
66
67
        # status with no commits or files - it must
68
        # work and show no output. We do this with no
69
        # commits to be sure that it's not going to fail
70
        # as a corner case.
71
        self.assertStatus([], wt)
72
73
        self.build_tree(['hello.c', 'bye.c'])
74
        self.assertStatus([
75
                'unknown:\n',
76
                '  bye.c\n',
77
                '  hello.c\n',
78
            ],
79
            wt)
80
81
        # add a commit to allow showing pending merges.
1927.2.1 by Robert Collins
Alter set_pending_merges to shove the left most merge into the trees last-revision if that is not set. Related bugfixes include basis_tree handling ghosts, de-duping the merges with the last-revision and update changing where and how it adds its pending merge.
82
        wt.commit('create a parent to allow testing merge output')
915 by Martin Pool
- add simple test case for bzr status
83
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
84
        wt.add_pending_merge('pending@pending-0-0')
1927.2.3 by Robert Collins
review comment application - paired with Martin.
85
        self.assertStatus([
86
                'unknown:\n',
87
                '  bye.c\n',
88
                '  hello.c\n',
89
                'pending merges:\n',
90
                '  pending@pending-0-0\n',
91
            ],
92
            wt)
915 by Martin Pool
- add simple test case for bzr status
93
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
94
    def test_branch_status_revisions(self):
95
        """Tests branch status with revisions"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
96
        wt = self.make_branch_and_tree('.')
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
97
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
98
        ignores._set_user_ignores(['./.bazaar'])
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
99
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
100
        self.build_tree(['hello.c', 'bye.c'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
101
        wt.add('hello.c')
102
        wt.add('bye.c')
103
        wt.commit('Test message')
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
104
1927.2.3 by Robert Collins
review comment application - paired with Martin.
105
        revs = [RevisionSpec(0)]
106
        self.assertStatus([
107
                'added:\n',
108
                '  bye.c\n',
109
                '  hello.c\n'
110
            ],
111
            wt,
112
            revision=revs)
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
113
114
        self.build_tree(['more.c'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
115
        wt.add('more.c')
116
        wt.commit('Another test message')
1185.1.35 by Robert Collins
Heikki Paajanen's status -r patch
117
        
118
        revs.append(RevisionSpec(1))
1927.2.3 by Robert Collins
review comment application - paired with Martin.
119
        self.assertStatus([
120
                'added:\n',
121
                '  bye.c\n',
122
                '  hello.c\n',
123
            ],
124
            wt,
125
            revision=revs)
1185.12.27 by Aaron Bentley
Use line log for pending merges
126
127
    def test_pending(self):
1185.33.71 by Martin Pool
Status tests include unicode character.
128
        """Pending merges display works, including Unicode"""
1185.12.27 by Aaron Bentley
Use line log for pending merges
129
        mkdir("./branch")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
130
        wt = self.make_branch_and_tree('branch')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
131
        b = wt.branch
132
        wt.commit("Empty commit 1")
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
133
        b_2_dir = b.bzrdir.sprout('./copy')
134
        b_2 = b_2_dir.open_branch()
135
        wt2 = b_2_dir.open_workingtree()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
136
        wt.commit(u"\N{TIBETAN DIGIT TWO} Empty commit 2")
1185.12.27 by Aaron Bentley
Use line log for pending merges
137
        merge(["./branch", -1], [None, None], this_dir = './copy')
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
138
        message = self.status_string(wt2)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
139
        self.assert_(message.startswith("pending merges:\n"))
140
        self.assert_(message.endswith("Empty commit 2\n")) 
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
141
        wt2.commit("merged")
1185.16.88 by mbp at sourcefrog
Make commit message long enough in test for pending merges
142
        # must be long to make sure we see elipsis at the end
1534.4.36 by Robert Collins
Finish deprecating Branch.working_tree()
143
        wt.commit("Empty commit 3 " + 
144
                   "blah blah blah blah " * 10)
1185.12.27 by Aaron Bentley
Use line log for pending merges
145
        merge(["./branch", -1], [None, None], this_dir = './copy')
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
146
        message = self.status_string(wt2)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
147
        self.assert_(message.startswith("pending merges:\n"))
148
        self.assert_("Empty commit 3" in message)
149
        self.assert_(message.endswith("...\n")) 
1185.12.27 by Aaron Bentley
Use line log for pending merges
150
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
151
    def test_branch_status_specific_files(self): 
152
        """Tests branch status with given specific files"""
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
153
        wt = self.make_branch_and_tree('.')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
154
        b = wt.branch
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
155
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
156
        ignores._set_user_ignores(['./.bazaar'])
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
157
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
158
        self.build_tree(['directory/','directory/hello.c', 'bye.c','test.c','dir2/'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
159
        wt.add('directory')
160
        wt.add('test.c')
161
        wt.commit('testing')
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
162
        
163
        tof = StringIO()
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
164
        show_tree_status(wt, to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
165
        tof.seek(0)
166
        self.assertEquals(tof.readlines(),
167
                          ['unknown:\n',
168
                           '  bye.c\n',
169
                           '  dir2\n',
170
                           '  directory/hello.c\n'
171
                           ])
172
1662.1.13 by Martin Pool
Fix up blackbox test for error on status of nonexistent files
173
        self.assertRaises(errors.PathsDoNotExist,
174
                          show_tree_status,
175
                          wt, specific_files=['bye.c','test.c','absent.c'], 
176
                          to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
177
        
178
        tof = StringIO()
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
179
        show_tree_status(wt, specific_files=['directory'], to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
180
        tof.seek(0)
181
        self.assertEquals(tof.readlines(),
182
                          ['unknown:\n',
183
                           '  directory/hello.c\n'
184
                           ])
185
        tof = StringIO()
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
186
        show_tree_status(wt, specific_files=['dir2'], to_file=tof)
1399 by Robert Collins
Patch from Heikki Paajanen testing status on specific files
187
        tof.seek(0)
188
        self.assertEquals(tof.readlines(),
189
                          ['unknown:\n',
190
                           '  dir2\n'
191
                           ])
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
192
1662.1.9 by Martin Pool
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)
193
    def test_status_nonexistent_file(self):
194
        # files that don't exist in either the basis tree or working tree
195
        # should give an error
196
        wt = self.make_branch_and_tree('.')
197
        out, err = self.run_bzr('status', 'does-not-exist', retcode=3)
198
        self.assertContainsRe(err, r'do not exist.*does-not-exist')
199
200
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
201
class CheckoutStatus(BranchStatus):
1551.2.12 by Aaron Bentley
whitespace fixups
202
1551.2.9 by Aaron Bentley
Fix status to work with checkouts
203
    def setUp(self):
204
        super(CheckoutStatus, self).setUp()
205
        mkdir('codir')
206
        chdir('codir')
207
        
208
    def make_branch_and_tree(self, relpath):
209
        source = self.make_branch(pathjoin('..', relpath))
210
        checkout = bzrdir.BzrDirMetaFormat1().initialize(relpath)
211
        bzrlib.branch.BranchReferenceFormat().initialize(checkout, source)
212
        return checkout.create_workingtree()
213
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
214
1534.4.54 by Robert Collins
Merge from integration.
215
class TestStatus(TestCaseWithTransport):
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
216
217
    def test_status(self):
1836.1.31 by John Arbash Meinel
Make set_user_ignores a private function, and update the doc string to recommend it isn't used.
218
        ignores._set_user_ignores(['./.bazaar'])
1836.1.16 by John Arbash Meinel
Cleanup some tests which don't expect .bazaar/ to show up. Some still fail.
219
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
220
        self.run_bzr("init")
221
        self.build_tree(['hello.txt'])
222
        result = self.run_bzr("status")[0]
223
        self.assert_("unknown:\n  hello.txt\n" in result, result)
1185.50.70 by John Arbash Meinel
Found a bug in my test_status.py cleanup
224
        self.run_bzr("add", "hello.txt")
1185.50.69 by John Arbash Meinel
[merge] bzr.robey, small fixes (--lsprof-file, log, status, http parsing, parmiko)
225
        result = self.run_bzr("status")[0]
226
        self.assert_("added:\n  hello.txt\n" in result, result)
227
        self.run_bzr("commit", "-m", "added")
228
        result = self.run_bzr("status", "-r", "0..1")[0]
229
        self.assert_("added:\n  hello.txt\n" in result, result)
230
        self.build_tree(['world.txt'])
231
        result = self.run_bzr("status", "-r", "0")[0]
232
        self.assert_("added:\n  hello.txt\n" \
233
                     "unknown:\n  world.txt\n" in result, result)
234
235
        result2 = self.run_bzr("status", "-r", "0..")[0]
236
        self.assertEquals(result2, result)
237
238
1685.1.6 by John Arbash Meinel
Merged test_status.py.moved into test_status.py
239
class TestStatusEncodings(TestCaseWithTransport):
240
    
241
    def setUp(self):
242
        TestCaseWithTransport.setUp(self)
243
        self.user_encoding = bzrlib.user_encoding
244
        self.stdout = sys.stdout
245
246
    def tearDown(self):
247
        bzrlib.user_encoding = self.user_encoding
248
        sys.stdout = self.stdout
249
        TestCaseWithTransport.tearDown(self)
250
251
    def make_uncommitted_tree(self):
252
        """Build a branch with uncommitted unicode named changes in the cwd."""
253
        working_tree = self.make_branch_and_tree(u'.')
254
        filename = u'hell\u00d8'
255
        try:
256
            self.build_tree_contents([(filename, 'contents of hello')])
257
        except UnicodeEncodeError:
258
            raise TestSkipped("can't build unicode working tree in "
259
                "filesystem encoding %s" % sys.getfilesystemencoding())
260
        working_tree.add(filename)
261
        return working_tree
262
263
    def test_stdout_ascii(self):
264
        sys.stdout = StringIO()
265
        bzrlib.user_encoding = 'ascii'
266
        working_tree = self.make_uncommitted_tree()
267
        stdout, stderr = self.run_bzr("status")
268
269
        self.assertEquals(stdout, """\
270
added:
271
  hell?
272
""")
273
274
    def test_stdout_latin1(self):
275
        sys.stdout = StringIO()
276
        bzrlib.user_encoding = 'latin-1'
277
        working_tree = self.make_uncommitted_tree()
278
        stdout, stderr = self.run_bzr('status')
279
280
        self.assertEquals(stdout, u"""\
281
added:
282
  hell\u00d8
283
""".encode('latin-1'))
284