~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_annotate.py

  • Committer: Robert Collins
  • Date: 2010-06-25 20:34:05 UTC
  • mto: This revision was merged to the branch mainline in revision 5324.
  • Revision ID: robertc@robertcollins.net-20100625203405-c74lxd3enklhaqf9
``bzrlib.osutils.get_terminal_encoding`` will now only mutter its
selection when explicitly requested; this avoids many duplicate calls
being logged when helpers, wrappers and older code that manually calls
it are executed it is now logged deliberately by the ui setup code.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
176
176
         |
177
177
        rev-3
178
178
        """
179
 
 
180
 
        tree1 = self.make_branch_and_tree('tree1')
181
 
        self.build_tree_contents([('tree1/a', 'first\n')])
182
 
        tree1.add(['a'], ['a-id'])
183
 
        tree1.commit('a', rev_id='rev-1',
184
 
                     committer="joe@foo.com",
185
 
                     timestamp=1166046000.00, timezone=0)
186
 
 
187
 
        tree2 = tree1.bzrdir.sprout('tree2').open_workingtree()
188
 
 
189
 
        self.build_tree_contents([('tree1/a', 'first\nsecond\n')])
190
 
        tree1.commit('b', rev_id='rev-2',
191
 
                     committer='joe@foo.com',
192
 
                     timestamp=1166046001.00, timezone=0)
193
 
 
194
 
        self.build_tree_contents([('tree2/a', 'first\nthird\n')])
195
 
        tree2.commit('c', rev_id='rev-1_1_1',
196
 
                     committer="barry@foo.com",
197
 
                     timestamp=1166046002.00, timezone=0)
198
 
 
199
 
        num_conflicts = tree1.merge_from_branch(tree2.branch)
200
 
        self.assertEqual(1, num_conflicts)
201
 
 
202
 
        self.build_tree_contents([('tree1/a',
203
 
                                 'first\nsecond\nthird\n')])
204
 
        tree1.set_conflicts(conflicts.ConflictList())
205
 
        tree1.commit('merge 2', rev_id='rev-3',
206
 
                     committer='sal@foo.com',
207
 
                     timestamp=1166046003.00, timezone=0)
208
 
        tree1.lock_read()
209
 
        self.addCleanup(tree1.unlock)
210
 
        return tree1, tree2
 
179
        builder = self.make_branch_builder('branch')
 
180
        builder.start_series()
 
181
        self.addCleanup(builder.finish_series)
 
182
        builder.build_snapshot('rev-1', None, [
 
183
            ('add', ('', 'root-id', 'directory', None)),
 
184
            ('add', ('a', 'a-id', 'file', 'first\n')),
 
185
            ], timestamp=1166046000.00, timezone=0, committer="joe@foo.com")
 
186
        builder.build_snapshot('rev-2', ['rev-1'], [
 
187
            ('modify', ('a-id', 'first\nsecond\n')),
 
188
            ], timestamp=1166046001.00, timezone=0, committer="joe@foo.com")
 
189
        builder.build_snapshot('rev-1_1_1', ['rev-1'], [
 
190
            ('modify', ('a-id', 'first\nthird\n')),
 
191
            ], timestamp=1166046002.00, timezone=0, committer="barry@foo.com")
 
192
        builder.build_snapshot('rev-3', ['rev-2', 'rev-1_1_1'], [
 
193
            ('modify', ('a-id', 'first\nsecond\nthird\n')),
 
194
            ], timestamp=1166046003.00, timezone=0, committer="sal@foo.com")
 
195
        return builder
211
196
 
212
197
    def create_deeply_merged_trees(self):
213
198
        """Create some trees with a more complex merge history.
232
217
         |
233
218
        rev-6
234
219
        """
235
 
        tree1, tree2 = self.create_merged_trees()
236
 
        tree1.unlock()
237
 
 
238
 
        tree3 = tree2.bzrdir.sprout('tree3').open_workingtree()
239
 
 
240
 
        tree2.commit('noop', rev_id='rev-1_1_2')
241
 
        self.assertEqual(0, tree1.merge_from_branch(tree2.branch))
242
 
        tree1.commit('noop merge', rev_id='rev-4')
243
 
 
244
 
        self.build_tree_contents([('tree3/a', 'first\nthird\nfourth\n')])
245
 
        tree3.commit('four', rev_id='rev-1_2_1',
246
 
                     committer='jerry@foo.com',
247
 
                     timestamp=1166046003.00, timezone=0)
248
 
 
249
 
        tree4 = tree3.bzrdir.sprout('tree4').open_workingtree()
250
 
 
251
 
        tree3.commit('noop', rev_id='rev-1_2_2',
252
 
                     committer='jerry@foo.com',
253
 
                     timestamp=1166046004.00, timezone=0)
254
 
        self.assertEqual(0, tree1.merge_from_branch(tree3.branch))
255
 
        tree1.commit('merge four', rev_id='rev-5')
256
 
 
257
 
        self.build_tree_contents([('tree4/a',
258
 
                                   'first\nthird\nfourth\nfifth\nsixth\n')])
259
 
        tree4.commit('five and six', rev_id='rev-1_3_1',
260
 
                     committer='george@foo.com',
261
 
                     timestamp=1166046005.00, timezone=0)
262
 
        self.assertEqual(0, tree1.merge_from_branch(tree4.branch))
263
 
        tree1.commit('merge five and six', rev_id='rev-6')
264
 
        tree1.lock_read()
265
 
        return tree1
 
220
        builder = self.create_merged_trees()
 
221
        builder.build_snapshot('rev-1_1_2', ['rev-1_1_1'], [])
 
222
        builder.build_snapshot('rev-4', ['rev-3', 'rev-1_1_2'], [])
 
223
        builder.build_snapshot('rev-1_2_1', ['rev-1_1_1'], [
 
224
            ('modify', ('a-id', 'first\nthird\nfourth\n')),
 
225
            ], timestamp=1166046003.00, timezone=0, committer="jerry@foo.com")
 
226
        builder.build_snapshot('rev-1_2_2', ['rev-1_2_1'], [],
 
227
            timestamp=1166046004.00, timezone=0, committer="jerry@foo.com")
 
228
        builder.build_snapshot('rev-5', ['rev-4', 'rev-1_2_2'], [
 
229
            ('modify', ('a-id', 'first\nsecond\nthird\nfourth\n')),
 
230
            ], timestamp=1166046004.00, timezone=0, committer="jerry@foo.com")
 
231
        builder.build_snapshot('rev-1_3_1', ['rev-1_2_1'], [
 
232
            ('modify', ('a-id', 'first\nthird\nfourth\nfifth\nsixth\n')),
 
233
            ], timestamp=1166046005.00, timezone=0, committer="george@foo.com")
 
234
        builder.build_snapshot('rev-6', ['rev-5', 'rev-1_3_1'], [
 
235
            ('modify', ('a-id',
 
236
                        'first\nsecond\nthird\nfourth\nfifth\nsixth\n')),
 
237
            ])
 
238
        return builder
266
239
 
267
240
    def create_duplicate_lines_tree(self):
268
 
        tree1 = self.make_branch_and_tree('tree1')
 
241
        builder = self.make_branch_builder('branch')
 
242
        builder.start_series()
 
243
        self.addCleanup(builder.finish_series)
269
244
        base_text = ''.join(l for r, l in duplicate_base)
270
245
        a_text = ''.join(l for r, l in duplicate_A)
271
246
        b_text = ''.join(l for r, l in duplicate_B)
272
247
        c_text = ''.join(l for r, l in duplicate_C)
273
248
        d_text = ''.join(l for r, l in duplicate_D)
274
249
        e_text = ''.join(l for r, l in duplicate_E)
275
 
        self.build_tree_contents([('tree1/file', base_text)])
276
 
        tree1.add(['file'], ['file-id'])
277
 
        tree1.commit('base', rev_id='rev-base')
278
 
        tree2 = tree1.bzrdir.sprout('tree2').open_workingtree()
279
 
 
280
 
        self.build_tree_contents([('tree1/file', a_text),
281
 
                                  ('tree2/file', b_text)])
282
 
        tree1.commit('A', rev_id='rev-A')
283
 
        tree2.commit('B', rev_id='rev-B')
284
 
 
285
 
        tree2.merge_from_branch(tree1.branch)
286
 
        conflicts.resolve(tree2, None) # Resolve the conflicts
287
 
        self.build_tree_contents([('tree2/file', d_text)])
288
 
        tree2.commit('D', rev_id='rev-D')
289
 
 
290
 
        self.build_tree_contents([('tree1/file', c_text)])
291
 
        tree1.commit('C', rev_id='rev-C')
292
 
 
293
 
        tree1.merge_from_branch(tree2.branch)
294
 
        conflicts.resolve(tree1, None) # Resolve the conflicts
295
 
        self.build_tree_contents([('tree1/file', e_text)])
296
 
        tree1.commit('E', rev_id='rev-E')
297
 
        return tree1
 
250
        builder.build_snapshot('rev-base', None, [
 
251
            ('add', ('', 'root-id', 'directory', None)),
 
252
            ('add', ('file', 'file-id', 'file', base_text)),
 
253
            ])
 
254
        builder.build_snapshot('rev-A', ['rev-base'], [
 
255
            ('modify', ('file-id', a_text))])
 
256
        builder.build_snapshot('rev-B', ['rev-base'], [
 
257
            ('modify', ('file-id', b_text))])
 
258
        builder.build_snapshot('rev-C', ['rev-A'], [
 
259
            ('modify', ('file-id', c_text))])
 
260
        builder.build_snapshot('rev-D', ['rev-B', 'rev-A'], [
 
261
            ('modify', ('file-id', d_text))])
 
262
        builder.build_snapshot('rev-E', ['rev-C', 'rev-D'], [
 
263
            ('modify', ('file-id', e_text))])
 
264
        return builder
298
265
 
299
266
    def assertRepoAnnotate(self, expected, repo, file_id, revision_id):
300
267
        """Assert that the revision is properly annotated."""
307
274
 
308
275
    def test_annotate_duplicate_lines(self):
309
276
        # XXX: Should this be a per_repository test?
310
 
        tree1 = self.create_duplicate_lines_tree()
311
 
        repo = tree1.branch.repository
 
277
        builder = self.create_duplicate_lines_tree()
 
278
        repo = builder.get_branch().repository
312
279
        repo.lock_read()
313
280
        self.addCleanup(repo.unlock)
314
281
        self.assertRepoAnnotate(duplicate_base, repo, 'file-id', 'rev-base')
319
286
        self.assertRepoAnnotate(duplicate_E, repo, 'file-id', 'rev-E')
320
287
 
321
288
    def test_annotate_shows_dotted_revnos(self):
322
 
        tree1, tree2 = self.create_merged_trees()
 
289
        builder = self.create_merged_trees()
323
290
 
324
291
        sio = StringIO()
325
 
        annotate.annotate_file(tree1.branch, 'rev-3', 'a-id',
 
292
        annotate.annotate_file(builder.get_branch(), 'rev-3', 'a-id',
326
293
                               to_file=sio)
327
294
        self.assertEqualDiff('1     joe@foo | first\n'
328
295
                             '2     joe@foo | second\n'
331
298
 
332
299
    def test_annotate_limits_dotted_revnos(self):
333
300
        """Annotate should limit dotted revnos to a depth of 12"""
334
 
        tree1 = self.create_deeply_merged_trees()
 
301
        builder = self.create_deeply_merged_trees()
335
302
 
336
303
        sio = StringIO()
337
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
304
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
338
305
                               to_file=sio, verbose=False, full=False)
339
306
        self.assertEqualDiff('1     joe@foo | first\n'
340
307
                             '2     joe@foo | second\n'
345
312
                             sio.getvalue())
346
313
 
347
314
        sio = StringIO()
348
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
315
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
349
316
                               to_file=sio, verbose=False, full=True)
350
317
        self.assertEqualDiff('1     joe@foo | first\n'
351
318
                             '2     joe@foo | second\n'
357
324
 
358
325
        # verbose=True shows everything, the full revno, user id, and date
359
326
        sio = StringIO()
360
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
327
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
361
328
                               to_file=sio, verbose=True, full=False)
362
329
        self.assertEqualDiff('1     joe@foo.com    20061213 | first\n'
363
330
                             '2     joe@foo.com    20061213 | second\n'
368
335
                             sio.getvalue())
369
336
 
370
337
        sio = StringIO()
371
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
338
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
372
339
                               to_file=sio, verbose=True, full=True)
373
340
        self.assertEqualDiff('1     joe@foo.com    20061213 | first\n'
374
341
                             '2     joe@foo.com    20061213 | second\n'
384
351
        When annotating a non-mainline revision, the annotation should still
385
352
        use dotted revnos from the mainline.
386
353
        """
387
 
        tree1 = self.create_deeply_merged_trees()
 
354
        builder = self.create_deeply_merged_trees()
388
355
 
389
356
        sio = StringIO()
390
 
        annotate.annotate_file(tree1.branch, 'rev-1_3_1', 'a-id',
 
357
        annotate.annotate_file(builder.get_branch(), 'rev-1_3_1', 'a-id',
391
358
                               to_file=sio, verbose=False, full=False)
392
359
        self.assertEqualDiff('1     joe@foo | first\n'
393
360
                             '1.1.1 barry@f | third\n'
397
364
                             sio.getvalue())
398
365
 
399
366
    def test_annotate_show_ids(self):
400
 
        tree1 = self.create_deeply_merged_trees()
 
367
        builder = self.create_deeply_merged_trees()
401
368
 
402
369
        sio = StringIO()
403
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
370
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
404
371
                               to_file=sio, show_ids=True, full=False)
405
372
 
406
373
        # It looks better with real revision ids :)
413
380
                             sio.getvalue())
414
381
 
415
382
        sio = StringIO()
416
 
        annotate.annotate_file(tree1.branch, 'rev-6', 'a-id',
 
383
        annotate.annotate_file(builder.get_branch(), 'rev-6', 'a-id',
417
384
                               to_file=sio, show_ids=True, full=True)
418
385
 
419
386
        self.assertEqualDiff('    rev-1 | first\n'