~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_log.py

  • Committer: Robert Collins
  • Date: 2007-03-08 04:06:06 UTC
  • mfrom: (2323.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 2442.
  • Revision ID: robertc@robertcollins.net-20070308040606-84gsniv56huiyjt4
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
2
2
# -*- coding: utf-8 -*-
3
 
 
 
3
#
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
8
 
 
 
8
#
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
12
# GNU General Public License for more details.
13
 
 
 
13
#
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
20
 
21
21
import os
22
22
 
 
23
import bzrlib
23
24
from bzrlib.tests.blackbox import ExternalBase
 
25
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
24
26
 
25
27
 
26
28
class TestLog(ExternalBase):
87
89
        log = self.runbzr("log -r 1..3")[0]
88
90
        self.assertEquals(self.full_log, log)
89
91
 
 
92
    def test_log_revno_n_path(self):
 
93
        os.mkdir('branch1')
 
94
        os.chdir('branch1')
 
95
        self._prepare()
 
96
        os.chdir('..')
 
97
        os.mkdir('branch2')
 
98
        os.chdir('branch2')
 
99
        self._prepare()
 
100
        os.chdir('..')
 
101
        log = self.runbzr("log -r revno:2:branch1..revno:3:branch2",
 
102
                          retcode=3)[0]
 
103
        log = self.runbzr("log -r revno:1:branch2..revno:3:branch2")[0]
 
104
        self.assertEquals(self.full_log, log)
 
105
        log = self.runbzr("log -r revno:1:branch2")[0]
 
106
        self.assertTrue('revno: 1\n' in log)
 
107
        self.assertTrue('revno: 2\n' not in log)
 
108
        self.assertTrue('branch nick: branch2\n' in log)
 
109
        self.assertTrue('branch nick: branch1\n' not in log)
 
110
        
 
111
    def test_log_nonexistent_file(self):
 
112
        # files that don't exist in either the basis tree or working tree
 
113
        # should give an error
 
114
        wt = self.make_branch_and_tree('.')
 
115
        out, err = self.run_bzr('log', 'does-not-exist', retcode=3)
 
116
        self.assertContainsRe(
 
117
            err, 'Path does not have any revision history: does-not-exist')
90
118
 
91
119
class TestLogMerges(ExternalBase):
92
120
 
115
143
#message:
116
144
#  merge branch 1
117
145
#    ------------------------------------------------------------
 
146
#    revno: 1.1.2  
118
147
#    merged: foo@example.com-20060328113140-91f43cfb46dc2863
119
148
#    committer: Robert Collins <foo@example.com>
120
149
#    branch nick: child
122
151
#    message:
123
152
#      merge branch 2
124
153
#        ------------------------------------------------------------
 
154
#        revno: 1.1.1.1
125
155
#        merged: foo@example.com-20060328113140-1ba24f850a0ef573
126
156
#        committer: Robert Collins <foo@example.com>
127
157
#        branch nick: smallerchild
129
159
#        message:
130
160
#          branch 2
131
161
#    ------------------------------------------------------------
 
162
#    revno: 1.1.1
132
163
#    merged: foo@example.com-20060328113140-5749a4757a8ac792
133
164
#    committer: Robert Collins <foo@example.com>
134
165
#    branch nick: child
144
175
#  first post
145
176
#""", out)
146
177
        # but we dont have a nice pattern matcher hooked up yet, so:
147
 
        # we check for the indenting of the commit message:
 
178
        # we check for the indenting of the commit message and the 
 
179
        # revision numbers 
 
180
        self.assertTrue('revno: 2' in out)
148
181
        self.assertTrue('  merge branch 1' in out)
 
182
        self.assertTrue('    revno: 1.1.2' in out)
149
183
        self.assertTrue('      merge branch 2' in out)
 
184
        self.assertTrue('        revno: 1.1.1.1' in out)
150
185
        self.assertTrue('          branch 2' in out)
 
186
        self.assertTrue('    revno: 1.1.1' in out)
151
187
        self.assertTrue('      branch 1' in out)
 
188
        self.assertTrue('revno: 1' in out)
152
189
        self.assertTrue('  first post' in out)
153
190
        self.assertEqual('', err)
 
191
 
 
192
 
 
193
class TestLogEncodings(TestCaseInTempDir):
 
194
 
 
195
    _mu = u'\xb5'
 
196
    _message = u'Message with \xb5'
 
197
 
 
198
    # Encodings which can encode mu
 
199
    good_encodings = [
 
200
        'utf-8',
 
201
        'latin-1',
 
202
        'iso-8859-1',
 
203
        'cp437', # Common windows encoding
 
204
        'cp1251', # Alexander Belchenko's windows encoding
 
205
        'cp1258', # Common windows encoding
 
206
    ]
 
207
    # Encodings which cannot encode mu
 
208
    bad_encodings = [
 
209
        'ascii',
 
210
        'iso-8859-2',
 
211
        'koi8_r',
 
212
    ]
 
213
 
 
214
    def setUp(self):
 
215
        TestCaseInTempDir.setUp(self)
 
216
        self.user_encoding = bzrlib.user_encoding
 
217
 
 
218
    def tearDown(self):
 
219
        bzrlib.user_encoding = self.user_encoding
 
220
        TestCaseInTempDir.tearDown(self)
 
221
 
 
222
    def create_branch(self):
 
223
        bzr = self.run_bzr
 
224
        bzr('init')
 
225
        open('a', 'wb').write('some stuff\n')
 
226
        bzr('add', 'a')
 
227
        bzr('commit', '-m', self._message)
 
228
 
 
229
    def try_encoding(self, encoding, fail=False):
 
230
        bzr = self.run_bzr
 
231
        if fail:
 
232
            self.assertRaises(UnicodeEncodeError,
 
233
                self._mu.encode, encoding)
 
234
            encoded_msg = self._message.encode(encoding, 'replace')
 
235
        else:
 
236
            encoded_msg = self._message.encode(encoding)
 
237
 
 
238
        old_encoding = bzrlib.user_encoding
 
239
        # This test requires that 'run_bzr' uses the current
 
240
        # bzrlib, because we override user_encoding, and expect
 
241
        # it to be used
 
242
        try:
 
243
            bzrlib.user_encoding = 'ascii'
 
244
            # We should be able to handle any encoding
 
245
            out, err = bzr('log', encoding=encoding)
 
246
            if not fail:
 
247
                # Make sure we wrote mu as we expected it to exist
 
248
                self.assertNotEqual(-1, out.find(encoded_msg))
 
249
                out_unicode = out.decode(encoding)
 
250
                self.assertNotEqual(-1, out_unicode.find(self._message))
 
251
            else:
 
252
                self.assertNotEqual(-1, out.find('Message with ?'))
 
253
        finally:
 
254
            bzrlib.user_encoding = old_encoding
 
255
 
 
256
    def test_log_handles_encoding(self):
 
257
        self.create_branch()
 
258
 
 
259
        for encoding in self.good_encodings:
 
260
            self.try_encoding(encoding)
 
261
 
 
262
    def test_log_handles_bad_encoding(self):
 
263
        self.create_branch()
 
264
 
 
265
        for encoding in self.bad_encodings:
 
266
            self.try_encoding(encoding, fail=True)
 
267
 
 
268
    def test_stdout_encoding(self):
 
269
        bzr = self.run_bzr
 
270
        bzrlib.user_encoding = "cp1251"
 
271
 
 
272
        bzr('init')
 
273
        self.build_tree(['a'])
 
274
        bzr('add', 'a')
 
275
        bzr('commit', '-m', u'\u0422\u0435\u0441\u0442')
 
276
        stdout, stderr = self.run_bzr('log', encoding='cp866')
 
277
 
 
278
        message = stdout.splitlines()[-1]
 
279
 
 
280
        # explanation of the check:
 
281
        # u'\u0422\u0435\u0441\u0442' is word 'Test' in russian
 
282
        # in cp866  encoding this is string '\x92\xa5\xe1\xe2'
 
283
        # in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
 
284
        # This test should check that output of log command
 
285
        # encoded to sys.stdout.encoding
 
286
        test_in_cp866 = '\x92\xa5\xe1\xe2'
 
287
        test_in_cp1251 = '\xd2\xe5\xf1\xf2'
 
288
        # Make sure the log string is encoded in cp866
 
289
        self.assertEquals(test_in_cp866, message[2:])
 
290
        # Make sure the cp1251 string is not found anywhere
 
291
        self.assertEquals(-1, stdout.find(test_in_cp1251))
 
292
 
 
293
 
 
294
class TestLogFile(TestCaseWithTransport):
 
295
 
 
296
    def test_log_local_branch_file(self):
 
297
        """We should be able to log files in local treeless branches"""
 
298
        tree = self.make_branch_and_tree('tree')
 
299
        self.build_tree(['tree/file'])
 
300
        tree.add('file')
 
301
        tree.commit('revision 1')
 
302
        tree.bzrdir.destroy_workingtree()
 
303
        self.run_bzr('log', 'tree/file')