~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_log.py

  • Committer: John Arbash Meinel
  • Date: 2007-07-13 02:23:34 UTC
  • mfrom: (2592 +trunk) (2612 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2614.
  • Revision ID: john@arbash-meinel.com-20070713022334-qb6ewgo6v4251yd9
[merge] bzr.dev 2612

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
        self.logs.append(revision)
51
51
 
52
52
 
53
 
class SimpleLogTest(TestCaseWithTransport):
 
53
class TestShowLog(TestCaseWithTransport):
54
54
 
55
55
    def checkDelta(self, delta, **kw):
56
56
        """Check the filenames touched by a delta are as expected."""
57
57
        for n in 'added', 'removed', 'renamed', 'modified', 'unchanged':
58
58
            expected = kw.get(n, [])
59
 
 
60
 
            # tests are written with unix paths; fix them up for windows
61
 
            #if os.sep != '/':
62
 
            #    expected = [x.replace('/', os.sep) for x in expected]
63
 
 
64
59
            # strip out only the path components
65
60
            got = [x[0] for x in getattr(delta, n)]
66
61
            self.assertEquals(expected, got)
131
126
        eq(logentry.rev.message, 'add one file')
132
127
        d = logentry.delta
133
128
        self.log('log 2 delta: %r' % d)
134
 
        # self.checkDelta(d, added=['hello'])
 
129
        self.checkDelta(d, added=['hello'])
135
130
        
136
131
        # commit a log message with control characters
137
132
        msg = "All 8-bit chars: " +  ''.join([unichr(x) for x in range(256)])
158
153
        self.log("escaped commit message: %r", committed_msg)
159
154
        self.assert_(msg == committed_msg)
160
155
 
 
156
    def test_deltas_in_merge_revisions(self):
 
157
        """Check deltas created for both mainline and merge revisions"""
 
158
        eq = self.assertEquals
 
159
        wt = self.make_branch_and_tree('parent')
 
160
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
 
161
        wt.add('file1')
 
162
        wt.add('file2')
 
163
        wt.commit(message='add file1 and file2')
 
164
        self.run_bzr('branch parent child')
 
165
        os.unlink('child/file1')
 
166
        print >> file('child/file2', 'wb'), 'hello'
 
167
        self.run_bzr(['commit', '-m', 'remove file1 and modify file2',
 
168
            'child'])
 
169
        os.chdir('parent')
 
170
        self.run_bzr('merge ../child')
 
171
        wt.commit('merge child branch')
 
172
        os.chdir('..')
 
173
        b = wt.branch
 
174
        lf = LogCatcher()
 
175
        lf.supports_merge_revisions = True
 
176
        show_log(b, lf, verbose=True)
 
177
        eq(len(lf.logs),3)
 
178
        logentry = lf.logs[0]
 
179
        eq(logentry.revno, '2')
 
180
        eq(logentry.rev.message, 'merge child branch')
 
181
        d = logentry.delta
 
182
        self.checkDelta(d, removed=['file1'], modified=['file2'])
 
183
        logentry = lf.logs[1]
 
184
        eq(logentry.revno, '1.1.1')
 
185
        eq(logentry.rev.message, 'remove file1 and modify file2')
 
186
        d = logentry.delta
 
187
        self.checkDelta(d, removed=['file1'], modified=['file2'])
 
188
        logentry = lf.logs[2]
 
189
        eq(logentry.revno, '1')
 
190
        eq(logentry.rev.message, 'add file1 and file2')
 
191
        d = logentry.delta
 
192
        self.checkDelta(d, added=['file1', 'file2'])
 
193
 
 
194
 
 
195
def make_commits_with_trailing_newlines(wt):
 
196
    """Helper method for LogFormatter tests"""    
 
197
    b = wt.branch
 
198
    b.nick='test'
 
199
    open('a', 'wb').write('hello moto\n')
 
200
    wt.add('a')
 
201
    wt.commit('simple log message', rev_id='a1'
 
202
            , timestamp=1132586655.459960938, timezone=-6*3600
 
203
            , committer='Joe Foo <joe@foo.com>')
 
204
    open('b', 'wb').write('goodbye\n')
 
205
    wt.add('b')
 
206
    wt.commit('multiline\nlog\nmessage\n', rev_id='a2'
 
207
            , timestamp=1132586842.411175966, timezone=-6*3600
 
208
            , committer='Joe Foo <joe@foo.com>')
 
209
 
 
210
    open('c', 'wb').write('just another manic monday\n')
 
211
    wt.add('c')
 
212
    wt.commit('single line with trailing newline\n', rev_id='a3'
 
213
            , timestamp=1132587176.835228920, timezone=-6*3600
 
214
            , committer = 'Joe Foo <joe@foo.com>')
 
215
    return b
 
216
 
 
217
 
 
218
class TestShortLogFormatter(TestCaseWithTransport):
 
219
 
161
220
    def test_trailing_newlines(self):
162
221
        wt = self.make_branch_and_tree('.')
163
 
        b = wt.branch
164
 
        b.nick='test'
165
 
        open('a', 'wb').write('hello moto\n')
166
 
        wt.add('a')
167
 
        wt.commit('simple log message', rev_id='a1'
168
 
                , timestamp=1132586655.459960938, timezone=-6*3600
169
 
                , committer='Joe Foo <joe@foo.com>')
170
 
        open('b', 'wb').write('goodbye\n')
171
 
        wt.add('b')
172
 
        wt.commit('multiline\nlog\nmessage\n', rev_id='a2'
173
 
                , timestamp=1132586842.411175966, timezone=-6*3600
174
 
                , committer='Joe Foo <joe@foo.com>')
175
 
 
176
 
        open('c', 'wb').write('just another manic monday\n')
177
 
        wt.add('c')
178
 
        wt.commit('single line with trailing newline\n', rev_id='a3'
179
 
                , timestamp=1132587176.835228920, timezone=-6*3600
180
 
                , committer = 'Joe Foo <joe@foo.com>')
181
 
 
 
222
        b = make_commits_with_trailing_newlines(wt)
182
223
        sio = StringIO()
183
224
        lf = ShortLogFormatter(to_file=sio)
184
225
        show_log(b, lf)
196
237
 
197
238
""")
198
239
 
199
 
        sio = StringIO()
200
 
        lf = LongLogFormatter(to_file=sio)
201
 
        show_log(b, lf)
202
 
        self.assertEquals(sio.getvalue(), """\
203
 
------------------------------------------------------------
204
 
revno: 3
205
 
committer: Joe Foo <joe@foo.com>
206
 
branch nick: test
207
 
timestamp: Mon 2005-11-21 09:32:56 -0600
208
 
message:
209
 
  single line with trailing newline
210
 
------------------------------------------------------------
211
 
revno: 2
212
 
committer: Joe Foo <joe@foo.com>
213
 
branch nick: test
214
 
timestamp: Mon 2005-11-21 09:27:22 -0600
215
 
message:
216
 
  multiline
217
 
  log
218
 
  message
219
 
------------------------------------------------------------
220
 
revno: 1
221
 
committer: Joe Foo <joe@foo.com>
222
 
branch nick: test
223
 
timestamp: Mon 2005-11-21 09:24:15 -0600
224
 
message:
225
 
  simple log message
226
 
""")
227
 
        
 
240
 
 
241
class TestLongLogFormatter(TestCaseWithTransport):
 
242
 
 
243
    def normalize_log(self,log):
 
244
        """Replaces the variable lines of logs with fixed lines"""
 
245
        committer = 'committer: Lorem Ipsum <test@example.com>'
 
246
        lines = log.splitlines(True)
 
247
        for idx,line in enumerate(lines):
 
248
            stripped_line = line.lstrip()
 
249
            indent = ' ' * (len(line) - len(stripped_line))
 
250
            if stripped_line.startswith('committer:'):
 
251
                lines[idx] = indent + committer + '\n'
 
252
            if stripped_line.startswith('timestamp:'):
 
253
                lines[idx] = indent + 'timestamp: Just now\n'
 
254
        return ''.join(lines)
 
255
 
228
256
    def test_verbose_log(self):
229
257
        """Verbose log includes changed files
230
258
        
258
286
  a
259
287
''')
260
288
 
 
289
    def test_merges_are_indented_by_level(self):
 
290
        wt = self.make_branch_and_tree('parent')
 
291
        wt.commit('first post')
 
292
        self.run_bzr('branch parent child')
 
293
        self.run_bzr(['commit', '-m', 'branch 1', '--unchanged', 'child'])
 
294
        self.run_bzr('branch child smallerchild')
 
295
        self.run_bzr(['commit', '-m', 'branch 2', '--unchanged',
 
296
            'smallerchild'])
 
297
        os.chdir('child')
 
298
        self.run_bzr('merge ../smallerchild')
 
299
        self.run_bzr(['commit', '-m', 'merge branch 2'])
 
300
        os.chdir('../parent')
 
301
        self.run_bzr('merge ../child')
 
302
        wt.commit('merge branch 1')
 
303
        b = wt.branch
 
304
        sio = StringIO()
 
305
        lf = LongLogFormatter(to_file=sio)
 
306
        show_log(b, lf, verbose=True)
 
307
        log = self.normalize_log(sio.getvalue())
 
308
        self.assertEqualDiff("""\
 
309
------------------------------------------------------------
 
310
revno: 2
 
311
committer: Lorem Ipsum <test@example.com>
 
312
branch nick: parent
 
313
timestamp: Just now
 
314
message:
 
315
  merge branch 1
 
316
    ------------------------------------------------------------
 
317
    revno: 1.1.2
 
318
    committer: Lorem Ipsum <test@example.com>
 
319
    branch nick: child
 
320
    timestamp: Just now
 
321
    message:
 
322
      merge branch 2
 
323
        ------------------------------------------------------------
 
324
        revno: 1.1.1.1.1
 
325
        committer: Lorem Ipsum <test@example.com>
 
326
        branch nick: smallerchild
 
327
        timestamp: Just now
 
328
        message:
 
329
          branch 2
 
330
    ------------------------------------------------------------
 
331
    revno: 1.1.1
 
332
    committer: Lorem Ipsum <test@example.com>
 
333
    branch nick: child
 
334
    timestamp: Just now
 
335
    message:
 
336
      branch 1
 
337
------------------------------------------------------------
 
338
revno: 1
 
339
committer: Lorem Ipsum <test@example.com>
 
340
branch nick: parent
 
341
timestamp: Just now
 
342
message:
 
343
  first post
 
344
""", log)
 
345
 
 
346
    def test_verbose_merge_revisions_contain_deltas(self):
 
347
        wt = self.make_branch_and_tree('parent')
 
348
        self.build_tree(['parent/f1', 'parent/f2'])
 
349
        wt.add(['f1','f2'])
 
350
        wt.commit('first post')
 
351
        self.run_bzr('branch parent child')
 
352
        os.unlink('child/f1')
 
353
        print >> file('child/f2', 'wb'), 'hello'
 
354
        self.run_bzr(['commit', '-m', 'removed f1 and modified f2',
 
355
            'child'])
 
356
        os.chdir('parent')
 
357
        self.run_bzr('merge ../child')
 
358
        wt.commit('merge branch 1')
 
359
        b = wt.branch
 
360
        sio = StringIO()
 
361
        lf = LongLogFormatter(to_file=sio)
 
362
        show_log(b, lf, verbose=True)
 
363
        log = self.normalize_log(sio.getvalue())
 
364
        self.assertEqualDiff("""\
 
365
------------------------------------------------------------
 
366
revno: 2
 
367
committer: Lorem Ipsum <test@example.com>
 
368
branch nick: parent
 
369
timestamp: Just now
 
370
message:
 
371
  merge branch 1
 
372
removed:
 
373
  f1
 
374
modified:
 
375
  f2
 
376
    ------------------------------------------------------------
 
377
    revno: 1.1.1
 
378
    committer: Lorem Ipsum <test@example.com>
 
379
    branch nick: child
 
380
    timestamp: Just now
 
381
    message:
 
382
      removed f1 and modified f2
 
383
    removed:
 
384
      f1
 
385
    modified:
 
386
      f2
 
387
------------------------------------------------------------
 
388
revno: 1
 
389
committer: Lorem Ipsum <test@example.com>
 
390
branch nick: parent
 
391
timestamp: Just now
 
392
message:
 
393
  first post
 
394
added:
 
395
  f1
 
396
  f2
 
397
""", log)
 
398
 
 
399
    def test_trailing_newlines(self):
 
400
        wt = self.make_branch_and_tree('.')
 
401
        b = make_commits_with_trailing_newlines(wt)
 
402
        sio = StringIO()
 
403
        lf = LongLogFormatter(to_file=sio)
 
404
        show_log(b, lf)
 
405
        self.assertEqualDiff(sio.getvalue(), """\
 
406
------------------------------------------------------------
 
407
revno: 3
 
408
committer: Joe Foo <joe@foo.com>
 
409
branch nick: test
 
410
timestamp: Mon 2005-11-21 09:32:56 -0600
 
411
message:
 
412
  single line with trailing newline
 
413
------------------------------------------------------------
 
414
revno: 2
 
415
committer: Joe Foo <joe@foo.com>
 
416
branch nick: test
 
417
timestamp: Mon 2005-11-21 09:27:22 -0600
 
418
message:
 
419
  multiline
 
420
  log
 
421
  message
 
422
------------------------------------------------------------
 
423
revno: 1
 
424
committer: Joe Foo <joe@foo.com>
 
425
branch nick: test
 
426
timestamp: Mon 2005-11-21 09:24:15 -0600
 
427
message:
 
428
  simple log message
 
429
""")
 
430
 
 
431
 
 
432
class TestLineLogFormatter(TestCaseWithTransport):
 
433
 
261
434
    def test_line_log(self):
262
435
        """Line log should show revno
263
436
        
311
484
        finally:
312
485
            wt.unlock()
313
486
 
 
487
    def test_trailing_newlines(self):
 
488
        wt = self.make_branch_and_tree('.')
 
489
        b = make_commits_with_trailing_newlines(wt)
 
490
        sio = StringIO()
 
491
        lf = LineLogFormatter(to_file=sio)
 
492
        show_log(b, lf)
 
493
        self.assertEqualDiff(sio.getvalue(), """\
 
494
3: Joe Foo 2005-11-21 single line with trailing newline
 
495
2: Joe Foo 2005-11-21 multiline
 
496
1: Joe Foo 2005-11-21 simple log message
 
497
""")
 
498
 
 
499
 
 
500
class TestGetViewRevisions(TestCaseWithTransport):
 
501
 
314
502
    def make_tree_with_commits(self):
315
503
        """Create a tree with well-known revision ids"""
316
504
        wt = self.make_branch_and_tree('tree1')
525
713
        self.assertEqual([], delta.removed)
526
714
 
527
715
    def assertAllRevisionsForFileID(self, tree, file_id, revisions):
528
 
        """Make sure _get_revisions_touching_file_id returns the right values.
 
716
        """Make sure _filter_revisions_touching_file_id returns the right values.
529
717
 
530
 
        Get the return value from _get_revisions_touching_file_id and make
 
718
        Get the return value from _filter_revisions_touching_file_id and make
531
719
        sure they are correct.
532
720
        """
533
721
        # The api for _get_revisions_touching_file_id is a little crazy,
537
725
        revnos = dict((rev, idx+1) for idx, rev in enumerate(mainline))
538
726
        view_revs_iter = log.get_view_revisions(mainline, revnos, tree.branch,
539
727
                                                'reverse', True)
540
 
        actual_revs = log._get_revisions_touching_file_id(tree.branch, file_id,
541
 
                                                          mainline,
542
 
                                                          view_revs_iter)
 
728
        actual_revs = log._filter_revisions_touching_file_id(
 
729
                            tree.branch, 
 
730
                            file_id,
 
731
                            mainline,
 
732
                            list(view_revs_iter))
543
733
        self.assertEqual(revisions, [r for r, revno, depth in actual_revs])
544
734
 
545
735
    def test_file_id_f1(self):