47
45
self.build_tree(['branch/a'])
49
wt.commit('a', rev_id=b'r1')
47
wt.commit('a', rev_id='r1')
51
49
self.build_tree(['branch/b'])
53
wt.commit('b', rev_id=b'r2')
51
wt.commit('b', rev_id='r2')
55
self.build_tree_contents([('branch/a', b'new contents\n')])
56
wt.commit(u'\xe52', rev_id=b'r3')
53
self.build_tree_contents([('branch/a', 'new contents\n')])
54
wt.commit(u'\xe52', rev_id='r3')
61
59
wt = self.make_branch_and_tree('branch')
62
60
self.build_tree(['branch/a'])
64
wt.commit('a', rev_id=b'r1')
62
wt.commit('a', rev_id='r1')
66
64
other = wt.controldir.sprout('other').open_workingtree()
67
65
self.build_tree(['other/b.a'])
69
other.commit('b.a', rev_id=b'o2')
67
other.commit('b.a', rev_id='o2')
72
70
self.run_bzr('merge ../other')
73
wt.commit('merge', rev_id=b'merge')
71
wt.commit('merge', rev_id='merge')
75
wt.update(revision=b'o2')
73
wt.update(revision='o2')
134
132
self.assertContainsRe(val, 'id: r2')
135
133
self.assertContainsRe(val, 'message: b')
136
134
self.assertContainsRe(val, 'id: r3')
137
self.assertContainsRe(val, 'message: \xe5')
135
self.assertContainsRe(val, 'message: \xc3\xa52') # utf8 encoding '\xe5'
139
137
def regen(self, wt, **kwargs):
141
139
builder = RioVersionInfoBuilder(wt.branch, working_tree=wt, **kwargs)
142
140
builder.generate(sio)
144
stanzas = list(read_stanzas_unicode(sio))
142
stanzas = list(read_stanzas(sio))
145
143
self.assertEqual(1, len(stanzas))
146
144
return stanzas[0]
171
169
def test_not_clean(self):
172
170
wt = self.create_branch()
173
171
self.build_tree(['branch/c'])
174
stanza = self.regen(wt, check_for_clean=True,
175
include_file_revisions=True)
172
stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
176
173
self.assertEqual(['False'], stanza.get_all('clean'))
178
175
def test_file_revisions(self):
179
176
wt = self.create_branch()
180
177
self.build_tree(['branch/c'])
181
stanza = self.regen(wt, check_for_clean=True,
182
include_file_revisions=True)
178
stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
183
179
# This assumes it's being run against a tree that does not update the
184
180
# root revision on every commit.
185
181
file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
186
182
self.assertEqual(['', 'a', 'b', 'c'], file_rev_stanza.get_all('path'))
187
183
self.assertEqual(['r1', 'r3', 'r2', 'unversioned'],
188
file_rev_stanza.get_all('revision'))
184
file_rev_stanza.get_all('revision'))
190
186
def test_revision_history(self):
191
187
wt = self.create_branch()
192
188
stanza = self.regen(wt, include_revision_history=True)
193
189
revision_stanza = self.get_one_stanza(stanza, 'revisions')
194
190
self.assertEqual(['r1', 'r2', 'r3'], revision_stanza.get_all('id'))
195
self.assertEqual(['a', 'b', u'\xe52'],
196
revision_stanza.get_all('message'))
191
self.assertEqual(['a', 'b', u'\xe52'], revision_stanza.get_all('message'))
197
192
self.assertEqual(3, len(revision_stanza.get_all('date')))
199
194
def test_file_revisions_with_rename(self):
202
197
self.build_tree(['branch/a', 'branch/c'])
204
199
wt.rename_one('b', 'd')
205
stanza = self.regen(wt, check_for_clean=True,
206
include_file_revisions=True)
200
stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
207
201
file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
208
202
self.assertEqual(['', 'a', 'b', 'c', 'd'],
209
file_rev_stanza.get_all('path'))
203
file_rev_stanza.get_all('path'))
210
204
self.assertEqual(['r1', 'modified', 'renamed to d', 'new',
211
205
'renamed from b'],
212
206
file_rev_stanza.get_all('revision'))
218
212
wt.rename_one('b', 'd')
220
wt.commit('modified', rev_id=b'r4')
214
wt.commit('modified', rev_id='r4')
222
216
wt.remove(['c', 'd'])
223
217
os.remove('branch/d')
224
stanza = self.regen(wt, check_for_clean=True,
225
include_file_revisions=True)
218
stanza = self.regen(wt, check_for_clean=True, include_file_revisions=True)
226
219
file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
227
220
self.assertEqual(['', 'a', 'c', 'd'], file_rev_stanza.get_all('path'))
228
221
self.assertEqual(['r1', 'r4', 'unversioned', 'removed'],
235
228
wt.rename_one('b', 'd')
238
wt, check_for_clean=True, include_file_revisions=True,
239
revision_id=wt.last_revision())
230
stanza = self.regen(wt, check_for_clean=True,
231
include_file_revisions=True, revision_id=wt.last_revision())
240
232
file_rev_stanza = self.get_one_stanza(stanza, 'file-revisions')
241
233
self.assertEqual(['', 'a', 'b'], file_rev_stanza.get_all('path'))
242
234
self.assertEqual(['r1', 'r3', 'r2'],
268
260
def regen(self, wt, **kwargs):
269
261
"""Create a test module, import and return it"""
270
builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
273
builder.generate(outf)
275
exec(outf.getvalue(), {}, local_vars)
262
outf = open('test_version_information.py', 'wb')
264
builder = PythonVersionInfoBuilder(wt.branch, working_tree=wt,
266
builder.generate(outf)
269
module_info = imp.find_module('test_version_information',
271
tvi = imp.load_module('tvi', *module_info)
272
# Make sure the module isn't cached
273
sys.modules.pop('tvi', None)
274
sys.modules.pop('test_version_information', None)
275
# Delete the compiled versions, because we are generating
276
# a new file fast enough that python doesn't detect it
277
# needs to recompile, and using sleep() just makes the
279
if os.path.exists('test_version_information.pyc'):
280
os.remove('test_version_information.pyc')
281
if os.path.exists('test_version_information.pyo'):
282
os.remove('test_version_information.pyo')
278
285
def test_python_version(self):
279
286
wt = self.create_branch()
281
288
tvi = self.regen(wt)
282
self.assertEqual('3', tvi['version_info']['revno'])
283
self.assertEqual(b'r3', tvi['version_info']['revision_id'])
284
self.assertTrue('date' in tvi['version_info'])
285
self.assertEqual(None, tvi['version_info']['clean'])
289
self.assertEqual('3', tvi.version_info['revno'])
290
self.assertEqual('r3', tvi.version_info['revision_id'])
291
self.assertTrue('date' in tvi.version_info)
292
self.assertEqual(None, tvi.version_info['clean'])
287
294
tvi = self.regen(wt, check_for_clean=True)
288
self.assertTrue(tvi['version_info']['clean'])
295
self.assertEqual(True, tvi.version_info['clean'])
290
297
self.build_tree(['branch/c'])
291
298
tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
292
self.assertFalse(tvi['version_info']['clean'])
299
self.assertEqual(False, tvi.version_info['clean'])
293
300
self.assertEqual(['', 'a', 'b', 'c'],
294
sorted(tvi['file_revisions'].keys()))
295
self.assertEqual(b'r3', tvi['file_revisions']['a'])
296
self.assertEqual(b'r2', tvi['file_revisions']['b'])
297
self.assertEqual('unversioned', tvi['file_revisions']['c'])
301
sorted(tvi.file_revisions.keys()))
302
self.assertEqual('r3', tvi.file_revisions['a'])
303
self.assertEqual('r2', tvi.file_revisions['b'])
304
self.assertEqual('unversioned', tvi.file_revisions['c'])
298
305
os.remove('branch/c')
300
307
tvi = self.regen(wt, include_revision_history=True)
302
309
rev_info = [(rev, message) for rev, message, timestamp, timezone
304
self.assertEqual([(b'r1', 'a'), (b'r2', 'b'),
305
(b'r3', u'\xe52')], rev_info)
311
self.assertEqual([('r1', 'a'), ('r2', 'b'), ('r3', u'\xe52')], rev_info)
307
313
# a was modified, so it should show up modified again
308
314
self.build_tree(['branch/a', 'branch/c'])
310
316
wt.rename_one('b', 'd')
311
317
tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
312
318
self.assertEqual(['', 'a', 'b', 'c', 'd'],
313
sorted(tvi['file_revisions'].keys()))
314
self.assertEqual('modified', tvi['file_revisions']['a'])
315
self.assertEqual('renamed to d', tvi['file_revisions']['b'])
316
self.assertEqual('new', tvi['file_revisions']['c'])
317
self.assertEqual('renamed from b', tvi['file_revisions']['d'])
319
sorted(tvi.file_revisions.keys()))
320
self.assertEqual('modified', tvi.file_revisions['a'])
321
self.assertEqual('renamed to d', tvi.file_revisions['b'])
322
self.assertEqual('new', tvi.file_revisions['c'])
323
self.assertEqual('renamed from b', tvi.file_revisions['d'])
319
wt.commit('modified', rev_id=b'r4')
325
wt.commit('modified', rev_id='r4')
320
326
wt.remove(['c', 'd'])
321
327
os.remove('branch/d')
322
328
tvi = self.regen(wt, check_for_clean=True, include_file_revisions=True)
323
329
self.assertEqual(['', 'a', 'c', 'd'],
324
sorted(tvi['file_revisions'].keys()))
325
self.assertEqual(b'r4', tvi['file_revisions']['a'])
326
self.assertEqual('unversioned', tvi['file_revisions']['c'])
327
self.assertEqual('removed', tvi['file_revisions']['d'])
330
sorted(tvi.file_revisions.keys()))
331
self.assertEqual('r4', tvi.file_revisions['a'])
332
self.assertEqual('unversioned', tvi.file_revisions['c'])
333
self.assertEqual('removed', tvi.file_revisions['d'])
330
336
class CustomVersionInfoTests(VersionInfoTestCase):
332
338
def test_custom_null(self):
334
340
wt = self.make_branch_and_tree('branch')
335
341
builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
336
template='revno: {revno}')
342
template='revno: {revno}')
337
343
builder.generate(sio)
338
344
self.assertEqual("revno: 0", sio.getvalue())
340
builder = CustomVersionInfoBuilder(
341
wt.branch, working_tree=wt,
346
builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
342
347
template='{revno} revid: {revision_id}')
343
348
# revision_id is not available yet
344
self.assertRaises(MissingTemplateVariable, builder.generate, sio)
349
self.assertRaises(errors.MissingTemplateVariable,
350
builder.generate, sio)
346
352
def test_custom_dotted_revno(self):
348
354
wt = self.create_tree_with_dotted_revno()
349
builder = CustomVersionInfoBuilder(
350
wt.branch, working_tree=wt,
355
builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
351
356
template='{revno} revid: {revision_id}')
352
357
builder.generate(sio)
353
358
self.assertEqual("1.1.1 revid: o2", sio.getvalue())
355
360
def regen(self, wt, tpl, **kwargs):
357
362
builder = CustomVersionInfoBuilder(wt.branch, working_tree=wt,
358
363
template=tpl, **kwargs)
359
364
builder.generate(sio)