/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_version_info.py

  • Committer: Michael Ellerman
  • Date: 2006-05-31 08:44:29 UTC
  • mto: (1711.2.63 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1792.
  • Revision ID: michael@ellerman.id.au-20060531084429-35e5429abda9f560
Add optional location to ancestry and fix behaviour for checkouts.

This adds an optional location parameter to the ancestry command. It also
changes the behaviour of ancestry on checkouts such that if they have
been created with a subset of the branch history, only the subset is
shown by 'bzr ancestry'. Tests for all of that as well.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
2
 
#
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.
7
 
#
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.
12
 
#
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
 
 
17
 
"""Tests for version_info"""
18
 
 
19
 
from cStringIO import StringIO
20
 
import imp
21
 
import os
22
 
import sys
23
 
 
24
 
from bzrlib import (
25
 
    errors,
26
 
    registry,
27
 
    symbol_versioning,
28
 
    tests,
29
 
    version_info_formats,
30
 
    )
31
 
from bzrlib.tests import TestCaseWithTransport
32
 
from bzrlib.rio import read_stanzas
33
 
 
34
 
from bzrlib.version_info_formats.format_custom import CustomVersionInfoBuilder
35
 
from bzrlib.version_info_formats.format_rio import RioVersionInfoBuilder
36
 
from bzrlib.version_info_formats.format_python import PythonVersionInfoBuilder
37
 
 
38
 
 
39
 
class TestVersionInfo(TestCaseWithTransport):
40
 
 
41
 
    def create_branch(self):
42
 
        wt = self.make_branch_and_tree('branch')
43
 
 
44
 
        self.build_tree(['branch/a'])
45
 
        wt.add('a')
46
 
        wt.commit('a', rev_id='r1')
47
 
 
48
 
        self.build_tree(['branch/b'])
49
 
        wt.add('b')
50
 
        wt.commit('b', rev_id='r2')
51
 
 
52
 
        self.build_tree_contents([('branch/a', 'new contents\n')])
53
 
        wt.commit(u'\xe52', rev_id='r3')
54
 
 
55
 
        return wt
56
 
 
57
 
    def test_rio_null(self):
58
 
        wt = self.make_branch_and_tree('branch')
59
 
 
60
 
        sio = StringIO()
61
 
        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt)
62
 
        builder.generate(sio)
63
 
        val = sio.getvalue()
64
 
        self.assertContainsRe(val, 'build-date:')
65
 
        self.assertContainsRe(val, 'revno: 0')
66
 
 
67
 
    def test_rio_version_text(self):
68
 
        wt = self.create_branch()
69
 
 
70
 
        def regen(**kwargs):
71
 
            sio = StringIO()
72
 
            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
73
 
                                            **kwargs)
74
 
            builder.generate(sio)
75
 
            val = sio.getvalue()
76
 
            return val
77
 
 
78
 
        val = regen()
79
 
        self.assertContainsRe(val, 'build-date:')
80
 
        self.assertContainsRe(val, 'date:')
81
 
        self.assertContainsRe(val, 'revno: 3')
82
 
        self.assertContainsRe(val, 'revision-id: r3')
83
 
 
84
 
        val = regen(check_for_clean=True)
85
 
        self.assertContainsRe(val, 'clean: True')
86
 
 
87
 
        self.build_tree(['branch/c'])
88
 
        val = regen(check_for_clean=True)
89
 
        self.assertContainsRe(val, 'clean: False')
90
 
        os.remove('branch/c')
91
 
 
92
 
        val = regen(include_revision_history=True)
93
 
        self.assertContainsRe(val, 'id: r1')
94
 
        self.assertContainsRe(val, 'message: a')
95
 
        self.assertContainsRe(val, 'id: r2')
96
 
        self.assertContainsRe(val, 'message: b')
97
 
        self.assertContainsRe(val, 'id: r3')
98
 
        self.assertContainsRe(val, 'message: \xc3\xa52') # utf8 encoding '\xe5'
99
 
 
100
 
    def test_rio_version_hook(self):
101
 
        def update_stanza(rev, stanza):
102
 
            stanza.add('bla', 'bloe')
103
 
        RioVersionInfoBuilder.hooks.install_named_hook(
104
 
            'revision', update_stanza, None)
105
 
        wt = self.create_branch()
106
 
 
107
 
        def regen(**kwargs):
108
 
            sio = StringIO()
109
 
            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
110
 
                                            **kwargs)
111
 
            builder.generate(sio)
112
 
            sio.seek(0)
113
 
            stanzas = list(read_stanzas(sio))
114
 
            self.assertEqual(1, len(stanzas))
115
 
            return stanzas[0]
116
 
 
117
 
        stanza = regen()
118
 
        self.assertEqual(['bloe'], stanza.get_all('bla'))
119
 
 
120
 
    def test_rio_version(self):
121
 
        wt = self.create_branch()
122
 
 
123
 
        def regen(**kwargs):
124
 
            sio = StringIO()
125
 
            builder = RioVersionInfoBuilder(wt.branch, working_tree=wt,
126
 
                                            **kwargs)
127
 
            builder.generate(sio)
128
 
            sio.seek(0)
129
 
            stanzas = list(read_stanzas(sio))
130
 
            self.assertEqual(1, len(stanzas))
131
 
            return stanzas[0]
132
 
 
133
 
        def get_one_stanza(stanza, key):
134
 
            new_stanzas = list(read_stanzas(
135
 
                                StringIO(stanza[key].encode('utf8'))))
136
 
            self.assertEqual(1, len(new_stanzas))
137
 
            return new_stanzas[0]
138
 
 
139
 
        stanza = regen()
140
 
        self.failUnless('date' in stanza)
141
 
        self.failUnless('build-date' in stanza)
142
 
        self.assertEqual(['3'], stanza.get_all('revno'))
143
 
        self.assertEqual(['r3'], stanza.get_all('revision-id'))
144
 
 
145
 
        stanza = regen(check_for_clean=True)
146
 
        self.assertEqual(['True'], stanza.get_all('clean'))
147
 
 
148
 
        self.build_tree(['branch/c'])
149
 
        stanza = regen(check_for_clean=True, include_file_revisions=True)
150
 
        self.assertEqual(['False'], stanza.get_all('clean'))
151
 
 
152
 
        # This assumes it's being run against a tree that does not update the
153
 
        # root revision on every commit.
154
 
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
155
 
        self.assertEqual(['', 'a', 'b', 'c'], file_rev_stanza.get_all('path'))
156
 
        self.assertEqual(['r1', 'r3', 'r2', 'unversioned'],
157
 
            file_rev_stanza.get_all('revision'))
158
 
        os.remove('branch/c')
159
 
 
160
 
        stanza = regen(include_revision_history=True)
161
 
        revision_stanza = get_one_stanza(stanza, 'revisions')
162
 
        self.assertEqual(['r1', 'r2', 'r3'], revision_stanza.get_all('id'))
163
 
        self.assertEqual(['a', 'b', u'\xe52'], revision_stanza.get_all('message'))
164
 
        self.assertEqual(3, len(revision_stanza.get_all('date')))
165
 
 
166
 
        # a was modified, so it should show up modified again
167
 
        self.build_tree(['branch/a', 'branch/c'])
168
 
        wt.add('c')
169
 
        wt.rename_one('b', 'd')
170
 
        stanza = regen(check_for_clean=True, include_file_revisions=True)
171
 
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
172
 
        self.assertEqual(['', 'a', 'b', 'c', 'd'],
173
 
                          file_rev_stanza.get_all('path'))
174
 
        self.assertEqual(['r1', 'modified', 'renamed to d', 'new',
175
 
                          'renamed from b'],
176
 
                         file_rev_stanza.get_all('revision'))
177
 
 
178
 
        wt.commit('modified', rev_id='r4')
179
 
        wt.remove(['c', 'd'])
180
 
        os.remove('branch/d')
181
 
        stanza = regen(check_for_clean=True, include_file_revisions=True)
182
 
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
183
 
        self.assertEqual(['', 'a', 'c', 'd'], file_rev_stanza.get_all('path'))
184
 
        self.assertEqual(['r1', 'r4', 'unversioned', 'removed'],
185
 
                         file_rev_stanza.get_all('revision'))
186
 
 
187
 
    def test_python_null(self):
188
 
        wt = self.make_branch_and_tree('branch')
189
 
 
190
 
        sio = StringIO()
191
 
        builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt)
192
 
        builder.generate(sio)
193
 
        val = sio.getvalue()
194
 
        self.assertContainsRe(val, "'revision_id': None")
195
 
        self.assertContainsRe(val, "'revno': 0")
196
 
 
197
 
    def test_python_version(self):
198
 
        wt = self.create_branch()
199
 
 
200
 
        def regen(**kwargs):
201
 
            """Create a test module, import and return it"""
202
 
            outf = open('test_version_information.py', 'wb')
203
 
            try:
204
 
                builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
205
 
                                                   **kwargs)
206
 
                builder.generate(outf)
207
 
            finally:
208
 
                outf.close()
209
 
            module_info = imp.find_module('test_version_information',
210
 
                                          [os.getcwdu()])
211
 
            tvi = imp.load_module('tvi', *module_info)
212
 
            # Make sure the module isn't cached
213
 
            sys.modules.pop('tvi', None)
214
 
            sys.modules.pop('test_version_information', None)
215
 
            # Delete the compiled versions, because we are generating
216
 
            # a new file fast enough that python doesn't detect it
217
 
            # needs to recompile, and using sleep() just makes the
218
 
            # test slow
219
 
            if os.path.exists('test_version_information.pyc'):
220
 
                os.remove('test_version_information.pyc')
221
 
            if os.path.exists('test_version_information.pyo'):
222
 
                os.remove('test_version_information.pyo')
223
 
            return tvi
224
 
 
225
 
        tvi = regen()
226
 
        self.assertEqual(3, tvi.version_info['revno'])
227
 
        self.assertEqual('r3', tvi.version_info['revision_id'])
228
 
        self.failUnless(tvi.version_info.has_key('date'))
229
 
        self.assertEqual(None, tvi.version_info['clean'])
230
 
 
231
 
        tvi = regen(check_for_clean=True)
232
 
        self.assertEqual(True, tvi.version_info['clean'])
233
 
 
234
 
        self.build_tree(['branch/c'])
235
 
        tvi = regen(check_for_clean=True, include_file_revisions=True)
236
 
        self.assertEqual(False, tvi.version_info['clean'])
237
 
        self.assertEqual(['', 'a', 'b', 'c'],
238
 
                         sorted(tvi.file_revisions.keys()))
239
 
        self.assertEqual('r3', tvi.file_revisions['a'])
240
 
        self.assertEqual('r2', tvi.file_revisions['b'])
241
 
        self.assertEqual('unversioned', tvi.file_revisions['c'])
242
 
        os.remove('branch/c')
243
 
 
244
 
        tvi = regen(include_revision_history=True)
245
 
 
246
 
        rev_info = [(rev, message) for rev, message, timestamp, timezone
247
 
                                   in tvi.revisions]
248
 
        self.assertEqual([('r1', 'a'), ('r2', 'b'), ('r3', u'\xe52')], rev_info)
249
 
 
250
 
        # a was modified, so it should show up modified again
251
 
        self.build_tree(['branch/a', 'branch/c'])
252
 
        wt.add('c')
253
 
        wt.rename_one('b', 'd')
254
 
        tvi = regen(check_for_clean=True, include_file_revisions=True)
255
 
        self.assertEqual(['', 'a', 'b', 'c', 'd'],
256
 
                          sorted(tvi.file_revisions.keys()))
257
 
        self.assertEqual('modified', tvi.file_revisions['a'])
258
 
        self.assertEqual('renamed to d', tvi.file_revisions['b'])
259
 
        self.assertEqual('new', tvi.file_revisions['c'])
260
 
        self.assertEqual('renamed from b', tvi.file_revisions['d'])
261
 
 
262
 
        wt.commit('modified', rev_id='r4')
263
 
        wt.remove(['c', 'd'])
264
 
        os.remove('branch/d')
265
 
        tvi = regen(check_for_clean=True, include_file_revisions=True)
266
 
        self.assertEqual(['', 'a', 'c', 'd'],
267
 
                          sorted(tvi.file_revisions.keys()))
268
 
        self.assertEqual('r4', tvi.file_revisions['a'])
269
 
        self.assertEqual('unversioned', tvi.file_revisions['c'])
270
 
        self.assertEqual('removed', tvi.file_revisions['d'])
271
 
 
272
 
    def test_custom_null(self):
273
 
        sio = StringIO()
274
 
        wt = self.make_branch_and_tree('branch')
275
 
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
276
 
            template='revno: {revno}')
277
 
        builder.generate(sio)
278
 
        self.assertEquals("revno: 0", sio.getvalue())
279
 
 
280
 
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt, 
281
 
            template='{revno} revid: {revision_id}')
282
 
        # revision_id is not available yet
283
 
        self.assertRaises(errors.MissingTemplateVariable, 
284
 
            builder.generate, sio)
285
 
 
286
 
    def test_custom_version_text(self):
287
 
        wt = self.create_branch()
288
 
 
289
 
        def regen(tpl, **kwargs):
290
 
            sio = StringIO()
291
 
            builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
292
 
                                               template=tpl, **kwargs)
293
 
            builder.generate(sio)
294
 
            val = sio.getvalue()
295
 
            return val
296
 
 
297
 
        val = regen('build-date: "{build_date}"\ndate: "{date}"')
298
 
        self.assertContainsRe(val, 'build-date: "[0-9-+: ]+"')
299
 
        self.assertContainsRe(val, 'date: "[0-9-+: ]+"')
300
 
 
301
 
        val = regen('revno: {revno}')
302
 
        self.assertEqual(val, 'revno: 3')
303
 
 
304
 
        val = regen('revision-id: {revision_id}')
305
 
        self.assertEqual(val, 'revision-id: r3')
306
 
 
307
 
        val = regen('clean: {clean}', check_for_clean=True)
308
 
        self.assertEqual(val, 'clean: 1')
309
 
 
310
 
        self.build_tree(['branch/c'])
311
 
        val = regen('clean: {clean}', check_for_clean=True)
312
 
        self.assertEqual(val, 'clean: 0')
313
 
        os.remove('branch/c')
314
 
 
315
 
    def test_custom_without_template(self):
316
 
        builder = CustomVersionInfoBuilder(None)
317
 
        sio = StringIO()
318
 
        self.assertRaises(errors.NoTemplate, builder.generate, sio)
319
 
 
320
 
 
321
 
class TestBuilder(version_info_formats.VersionInfoBuilder):
322
 
    pass
323
 
 
324
 
 
325
 
class TestVersionInfoFormatRegistry(tests.TestCase):
326
 
 
327
 
    def setUp(self):
328
 
        super(TestVersionInfoFormatRegistry, self).setUp()
329
 
        self.overrideAttr(version_info_formats,
330
 
                          'format_registry', registry.Registry())
331
 
 
332
 
    def test_register_remove(self):
333
 
        registry = version_info_formats.format_registry
334
 
        registry.register('testbuilder',
335
 
            TestBuilder, 'a simple test builder')
336
 
        self.assertIs(TestBuilder, registry.get('testbuilder'))
337
 
        self.assertEqual('a simple test builder',
338
 
                         registry.get_help('testbuilder'))
339
 
        registry.remove('testbuilder')
340
 
        self.assertRaises(KeyError, registry.get, 'testbuilder')