~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_version_info.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-09-01 08:02:42 UTC
  • mfrom: (5390.3.3 faster-revert-593560)
  • Revision ID: pqm@pqm.ubuntu.com-20100901080242-esg62ody4frwmy66
(spiv) Avoid repeatedly calling self.target.all_file_ids() in
 InterTree.iter_changes. (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2012, 2016 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
2
#
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
24
24
from bzrlib import (
25
25
    errors,
26
26
    registry,
 
27
    symbol_versioning,
27
28
    tests,
28
29
    version_info_formats,
29
30
    )
35
36
from bzrlib.version_info_formats.format_python import PythonVersionInfoBuilder
36
37
 
37
38
 
38
 
class VersionInfoTestCase(TestCaseWithTransport):
 
39
class TestVersionInfo(TestCaseWithTransport):
39
40
 
40
41
    def create_branch(self):
41
42
        wt = self.make_branch_and_tree('branch')
53
54
 
54
55
        return wt
55
56
 
56
 
    def create_tree_with_dotted_revno(self):
57
 
        wt = self.make_branch_and_tree('branch')
58
 
        self.build_tree(['branch/a'])
59
 
        wt.add('a')
60
 
        wt.commit('a', rev_id='r1')
61
 
 
62
 
        other = wt.bzrdir.sprout('other').open_workingtree()
63
 
        self.build_tree(['other/b.a'])
64
 
        other.add(['b.a'])
65
 
        other.commit('b.a', rev_id='o2')
66
 
 
67
 
        os.chdir('branch')
68
 
        self.run_bzr('merge ../other')
69
 
        wt.commit('merge', rev_id='merge')
70
 
 
71
 
        wt.update(revision='o2')
72
 
 
73
 
        return wt
74
 
 
75
 
 
76
 
class TestVersionInfoRio(VersionInfoTestCase):
77
 
 
78
57
    def test_rio_null(self):
79
58
        wt = self.make_branch_and_tree('branch')
80
59
 
85
64
        self.assertContainsRe(val, 'build-date:')
86
65
        self.assertContainsRe(val, 'revno: 0')
87
66
 
88
 
    def test_rio_dotted_revno(self):
89
 
        wt = self.create_tree_with_dotted_revno()
90
 
 
91
 
        sio = StringIO()
92
 
        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt)
93
 
        builder.generate(sio)
94
 
        val = sio.getvalue()
95
 
        self.assertContainsRe(val, 'revno: 1.1.1')
96
 
 
97
 
    def regen_text(self, wt, **kwargs):
98
 
        sio = StringIO()
99
 
        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt, **kwargs)
100
 
        builder.generate(sio)
101
 
        val = sio.getvalue()
102
 
        return val
103
 
 
104
 
    def test_simple(self):
 
67
    def test_rio_version_text(self):
105
68
        wt = self.create_branch()
106
69
 
107
 
        val = self.regen_text(wt)
 
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()
108
79
        self.assertContainsRe(val, 'build-date:')
109
80
        self.assertContainsRe(val, 'date:')
110
81
        self.assertContainsRe(val, 'revno: 3')
111
82
        self.assertContainsRe(val, 'revision-id: r3')
112
83
 
113
 
    def test_clean(self):
114
 
        wt = self.create_branch()
115
 
        val = self.regen_text(wt, check_for_clean=True)
 
84
        val = regen(check_for_clean=True)
116
85
        self.assertContainsRe(val, 'clean: True')
117
86
 
118
 
    def test_no_clean(self):
119
 
        wt = self.create_branch()
120
87
        self.build_tree(['branch/c'])
121
 
        val = self.regen_text(wt, check_for_clean=True)
 
88
        val = regen(check_for_clean=True)
122
89
        self.assertContainsRe(val, 'clean: False')
123
 
 
124
 
    def test_history(self):
125
 
        wt = self.create_branch()
126
 
 
127
 
        val = self.regen_text(wt, include_revision_history=True)
 
90
        os.remove('branch/c')
 
91
 
 
92
        val = regen(include_revision_history=True)
128
93
        self.assertContainsRe(val, 'id: r1')
129
94
        self.assertContainsRe(val, 'message: a')
130
95
        self.assertContainsRe(val, 'id: r2')
132
97
        self.assertContainsRe(val, 'id: r3')
133
98
        self.assertContainsRe(val, 'message: \xc3\xa52') # utf8 encoding '\xe5'
134
99
 
135
 
    def regen(self, wt, **kwargs):
136
 
        sio = StringIO()
137
 
        builder = RioVersionInfoBuilder(wt.branch, working_tree=wt, **kwargs)
138
 
        builder.generate(sio)
139
 
        sio.seek(0)
140
 
        stanzas = list(read_stanzas(sio))
141
 
        self.assertEqual(1, len(stanzas))
142
 
        return stanzas[0]
143
 
 
144
100
    def test_rio_version_hook(self):
145
101
        def update_stanza(rev, stanza):
146
102
            stanza.add('bla', 'bloe')
148
104
            'revision', update_stanza, None)
149
105
        wt = self.create_branch()
150
106
 
151
 
        stanza = self.regen(wt)
 
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()
152
118
        self.assertEqual(['bloe'], stanza.get_all('bla'))
153
119
 
154
 
    def get_one_stanza(self, stanza, key):
155
 
        new_stanzas = list(read_stanzas(StringIO(stanza[key].encode('utf8'))))
156
 
        self.assertEqual(1, len(new_stanzas))
157
 
        return new_stanzas[0]
158
 
 
159
 
    def test_build_date(self):
 
120
    def test_rio_version(self):
160
121
        wt = self.create_branch()
161
 
        stanza = self.regen(wt)
162
 
        self.assertTrue('date' in stanza)
163
 
        self.assertTrue('build-date' in stanza)
 
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)
164
142
        self.assertEqual(['3'], stanza.get_all('revno'))
165
143
        self.assertEqual(['r3'], stanza.get_all('revision-id'))
166
144
 
167
 
    def test_not_clean(self):
168
 
        wt = self.create_branch()
 
145
        stanza = regen(check_for_clean=True)
 
146
        self.assertEqual(['True'], stanza.get_all('clean'))
 
147
 
169
148
        self.build_tree(['branch/c'])
170
 
        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
 
149
        stanza = regen(check_for_clean=True, include_file_revisions=True)
171
150
        self.assertEqual(['False'], stanza.get_all('clean'))
172
151
 
173
 
    def test_file_revisions(self):
174
 
        wt = self.create_branch()
175
 
        self.build_tree(['branch/c'])
176
 
        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
177
152
        # This assumes it's being run against a tree that does not update the
178
153
        # root revision on every commit.
179
 
        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
 
154
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
180
155
        self.assertEqual(['', 'a', 'b', 'c'], file_rev_stanza.get_all('path'))
181
156
        self.assertEqual(['r1', 'r3', 'r2', 'unversioned'],
182
157
            file_rev_stanza.get_all('revision'))
 
158
        os.remove('branch/c')
183
159
 
184
 
    def test_revision_history(self):
185
 
        wt = self.create_branch()
186
 
        stanza = self.regen(wt, include_revision_history=True)
187
 
        revision_stanza = self.get_one_stanza(stanza, 'revisions')
 
160
        stanza = regen(include_revision_history=True)
 
161
        revision_stanza = get_one_stanza(stanza, 'revisions')
188
162
        self.assertEqual(['r1', 'r2', 'r3'], revision_stanza.get_all('id'))
189
163
        self.assertEqual(['a', 'b', u'\xe52'], revision_stanza.get_all('message'))
190
164
        self.assertEqual(3, len(revision_stanza.get_all('date')))
191
165
 
192
 
    def test_file_revisions_with_rename(self):
193
166
        # a was modified, so it should show up modified again
194
 
        wt = self.create_branch()
195
167
        self.build_tree(['branch/a', 'branch/c'])
196
168
        wt.add('c')
197
169
        wt.rename_one('b', 'd')
198
 
        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
199
 
        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
 
170
        stanza = regen(check_for_clean=True, include_file_revisions=True)
 
171
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
200
172
        self.assertEqual(['', 'a', 'b', 'c', 'd'],
201
173
                          file_rev_stanza.get_all('path'))
202
174
        self.assertEqual(['r1', 'modified', 'renamed to d', 'new',
203
175
                          'renamed from b'],
204
176
                         file_rev_stanza.get_all('revision'))
205
177
 
206
 
    def test_file_revisions_with_removal(self):
207
 
        wt = self.create_branch()
208
 
        self.build_tree(['branch/a', 'branch/c'])
209
 
        wt.add('c')
210
 
        wt.rename_one('b', 'd')
211
 
 
212
178
        wt.commit('modified', rev_id='r4')
213
 
 
214
179
        wt.remove(['c', 'd'])
215
180
        os.remove('branch/d')
216
 
        stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
217
 
        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
 
181
        stanza = regen(check_for_clean=True, include_file_revisions=True)
 
182
        file_rev_stanza = get_one_stanza(stanza, 'file-revisions')
218
183
        self.assertEqual(['', 'a', 'c', 'd'], file_rev_stanza.get_all('path'))
219
184
        self.assertEqual(['r1', 'r4', 'unversioned', 'removed'],
220
185
                         file_rev_stanza.get_all('revision'))
221
186
 
222
 
    def test_revision(self):
223
 
        wt = self.create_branch()
224
 
        self.build_tree(['branch/a', 'branch/c'])
225
 
        wt.add('c')
226
 
        wt.rename_one('b', 'd')
227
 
 
228
 
        stanza = self.regen(wt, check_for_clean=True,
229
 
            include_file_revisions=True, revision_id=wt.last_revision())
230
 
        file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
231
 
        self.assertEqual(['', 'a', 'b'], file_rev_stanza.get_all('path'))
232
 
        self.assertEqual(['r1', 'r3', 'r2'],
233
 
                         file_rev_stanza.get_all('revision'))
234
 
 
235
 
 
236
 
class PythonVersionInfoTests(VersionInfoTestCase):
237
 
 
238
187
    def test_python_null(self):
239
188
        wt = self.make_branch_and_tree('branch')
240
189
 
243
192
        builder.generate(sio)
244
193
        val = sio.getvalue()
245
194
        self.assertContainsRe(val, "'revision_id': None")
246
 
        self.assertContainsRe(val, "'revno': '0'")
247
 
        self.assertNotContainsString(val, '\n\n\n\n')
248
 
 
249
 
    def test_python_dotted_revno(self):
250
 
        wt = self.create_tree_with_dotted_revno()
251
 
 
252
 
        sio = StringIO()
253
 
        builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt)
254
 
        builder.generate(sio)
255
 
        val = sio.getvalue()
256
 
        self.assertContainsRe(val, "'revno': '1.1.1'")
257
 
 
258
 
    def regen(self, wt, **kwargs):
259
 
        """Create a test module, import and return it"""
260
 
        outf = open('test_version_information.py', 'wb')
261
 
        try:
262
 
            builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
263
 
                                               **kwargs)
264
 
            builder.generate(outf)
265
 
        finally:
266
 
            outf.close()
267
 
        module_info = imp.find_module('test_version_information',
268
 
                                      [os.getcwdu()])
269
 
        tvi = imp.load_module('tvi', *module_info)
270
 
        # Make sure the module isn't cached
271
 
        sys.modules.pop('tvi', None)
272
 
        sys.modules.pop('test_version_information', None)
273
 
        # Delete the compiled versions, because we are generating
274
 
        # a new file fast enough that python doesn't detect it
275
 
        # needs to recompile, and using sleep() just makes the
276
 
        # test slow
277
 
        if os.path.exists('test_version_information.pyc'):
278
 
            os.remove('test_version_information.pyc')
279
 
        if os.path.exists('test_version_information.pyo'):
280
 
            os.remove('test_version_information.pyo')
281
 
        return tvi
 
195
        self.assertContainsRe(val, "'revno': 0")
282
196
 
283
197
    def test_python_version(self):
284
198
        wt = self.create_branch()
285
199
 
286
 
        tvi = self.regen(wt)
287
 
        self.assertEqual('3', tvi.version_info['revno'])
 
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'])
288
227
        self.assertEqual('r3', tvi.version_info['revision_id'])
289
 
        self.assertTrue(tvi.version_info.has_key('date'))
 
228
        self.failUnless(tvi.version_info.has_key('date'))
290
229
        self.assertEqual(None, tvi.version_info['clean'])
291
230
 
292
 
        tvi = self.regen(wt, check_for_clean=True)
 
231
        tvi = regen(check_for_clean=True)
293
232
        self.assertEqual(True, tvi.version_info['clean'])
294
233
 
295
234
        self.build_tree(['branch/c'])
296
 
        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
 
235
        tvi = regen(check_for_clean=True, include_file_revisions=True)
297
236
        self.assertEqual(False, tvi.version_info['clean'])
298
237
        self.assertEqual(['', 'a', 'b', 'c'],
299
238
                         sorted(tvi.file_revisions.keys()))
302
241
        self.assertEqual('unversioned', tvi.file_revisions['c'])
303
242
        os.remove('branch/c')
304
243
 
305
 
        tvi = self.regen(wt, include_revision_history=True)
 
244
        tvi = regen(include_revision_history=True)
306
245
 
307
246
        rev_info = [(rev, message) for rev, message, timestamp, timezone
308
247
                                   in tvi.revisions]
312
251
        self.build_tree(['branch/a', 'branch/c'])
313
252
        wt.add('c')
314
253
        wt.rename_one('b', 'd')
315
 
        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
 
254
        tvi = regen(check_for_clean=True, include_file_revisions=True)
316
255
        self.assertEqual(['', 'a', 'b', 'c', 'd'],
317
256
                          sorted(tvi.file_revisions.keys()))
318
257
        self.assertEqual('modified', tvi.file_revisions['a'])
323
262
        wt.commit('modified', rev_id='r4')
324
263
        wt.remove(['c', 'd'])
325
264
        os.remove('branch/d')
326
 
        tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
 
265
        tvi = regen(check_for_clean=True, include_file_revisions=True)
327
266
        self.assertEqual(['', 'a', 'c', 'd'],
328
267
                          sorted(tvi.file_revisions.keys()))
329
268
        self.assertEqual('r4', tvi.file_revisions['a'])
330
269
        self.assertEqual('unversioned', tvi.file_revisions['c'])
331
270
        self.assertEqual('removed', tvi.file_revisions['d'])
332
271
 
333
 
 
334
 
class CustomVersionInfoTests(VersionInfoTestCase):
335
 
 
336
272
    def test_custom_null(self):
337
273
        sio = StringIO()
338
274
        wt = self.make_branch_and_tree('branch')
339
275
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
340
276
            template='revno: {revno}')
341
277
        builder.generate(sio)
342
 
        self.assertEqual("revno: 0", sio.getvalue())
 
278
        self.assertEquals("revno: 0", sio.getvalue())
343
279
 
344
280
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt, 
345
281
            template='{revno} revid: {revision_id}')
347
283
        self.assertRaises(errors.MissingTemplateVariable, 
348
284
            builder.generate, sio)
349
285
 
350
 
    def test_custom_dotted_revno(self):
351
 
        sio = StringIO()
352
 
        wt = self.create_tree_with_dotted_revno()
353
 
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt, 
354
 
            template='{revno} revid: {revision_id}')
355
 
        builder.generate(sio)
356
 
        self.assertEqual("1.1.1 revid: o2", sio.getvalue())
357
 
 
358
 
    def regen(self, wt, tpl, **kwargs):
359
 
        sio = StringIO()
360
 
        builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
361
 
                                           template=tpl, **kwargs)
362
 
        builder.generate(sio)
363
 
        val = sio.getvalue()
364
 
        return val
365
 
 
366
 
    def test_build_date(self):
 
286
    def test_custom_version_text(self):
367
287
        wt = self.create_branch()
368
288
 
369
 
        val = self.regen(wt, 'build-date: "{build_date}"\ndate: "{date}"')
 
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}"')
370
298
        self.assertContainsRe(val, 'build-date: "[0-9-+: ]+"')
371
299
        self.assertContainsRe(val, 'date: "[0-9-+: ]+"')
372
300
 
373
 
    def test_revno(self):
374
 
        wt = self.create_branch()
375
 
        val = self.regen(wt, 'revno: {revno}')
 
301
        val = regen('revno: {revno}')
376
302
        self.assertEqual(val, 'revno: 3')
377
303
 
378
 
    def test_revision_id(self):
379
 
        wt = self.create_branch()
380
 
        val = self.regen(wt, 'revision-id: {revision_id}')
 
304
        val = regen('revision-id: {revision_id}')
381
305
        self.assertEqual(val, 'revision-id: r3')
382
306
 
383
 
    def test_clean(self):
384
 
        wt = self.create_branch()
385
 
        val = self.regen(wt, 'clean: {clean}', check_for_clean=True)
 
307
        val = regen('clean: {clean}', check_for_clean=True)
386
308
        self.assertEqual(val, 'clean: 1')
387
309
 
388
 
    def test_not_clean(self):
389
 
        wt = self.create_branch()
390
 
 
391
310
        self.build_tree(['branch/c'])
392
 
        val = self.regen(wt, 'clean: {clean}', check_for_clean=True)
 
311
        val = regen('clean: {clean}', check_for_clean=True)
393
312
        self.assertEqual(val, 'clean: 0')
394
313
        os.remove('branch/c')
395
314