~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_log.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-06-21 05:22:37 UTC
  • mfrom: (2490.2.33 graphwalker)
  • Revision ID: pqm@pqm.ubuntu.com-20070621052237-2phm1z5dg4arrwnk
Avoid topological sorting in Repository.get_ancestry where possible

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
from cStringIO import StringIO
19
19
 
20
20
from bzrlib import log
21
 
from bzrlib.tests import TestCaseWithTransport
 
21
from bzrlib.tests import BzrTestBase, TestCaseWithTransport
22
22
from bzrlib.log import (show_log,
23
23
                        get_view_revisions,
24
24
                        LogRevision,
50
50
        self.logs.append(revision)
51
51
 
52
52
 
53
 
class TestShowLog(TestCaseWithTransport):
 
53
class SimpleLogTest(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
 
59
64
            # strip out only the path components
60
65
            got = [x[0] for x in getattr(delta, n)]
61
66
            self.assertEquals(expected, got)
126
131
        eq(logentry.rev.message, 'add one file')
127
132
        d = logentry.delta
128
133
        self.log('log 2 delta: %r' % d)
129
 
        self.checkDelta(d, added=['hello'])
 
134
        # self.checkDelta(d, added=['hello'])
130
135
        
131
136
        # commit a log message with control characters
132
137
        msg = "All 8-bit chars: " +  ''.join([unichr(x) for x in range(256)])
153
158
        self.log("escaped commit message: %r", committed_msg)
154
159
        self.assert_(msg == committed_msg)
155
160
 
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
 
 
220
161
    def test_trailing_newlines(self):
221
162
        wt = self.make_branch_and_tree('.')
222
 
        b = make_commits_with_trailing_newlines(wt)
 
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
 
223
182
        sio = StringIO()
224
183
        lf = ShortLogFormatter(to_file=sio)
225
184
        show_log(b, lf)
237
196
 
238
197
""")
239
198
 
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
 
 
 
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
        
256
228
    def test_verbose_log(self):
257
229
        """Verbose log includes changed files
258
230
        
286
258
  a
287
259
''')
288
260
 
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
 
 
434
261
    def test_line_log(self):
435
262
        """Line log should show revno
436
263
        
484
311
        finally:
485
312
            wt.unlock()
486
313
 
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
 
 
502
314
    def make_tree_with_commits(self):
503
315
        """Create a tree with well-known revision ids"""
504
316
        wt = self.make_branch_and_tree('tree1')
713
525
        self.assertEqual([], delta.removed)
714
526
 
715
527
    def assertAllRevisionsForFileID(self, tree, file_id, revisions):
716
 
        """Make sure _filter_revisions_touching_file_id returns the right values.
 
528
        """Make sure _get_revisions_touching_file_id returns the right values.
717
529
 
718
 
        Get the return value from _filter_revisions_touching_file_id and make
 
530
        Get the return value from _get_revisions_touching_file_id and make
719
531
        sure they are correct.
720
532
        """
721
533
        # The api for _get_revisions_touching_file_id is a little crazy,
725
537
        revnos = dict((rev, idx+1) for idx, rev in enumerate(mainline))
726
538
        view_revs_iter = log.get_view_revisions(mainline, revnos, tree.branch,
727
539
                                                'reverse', True)
728
 
        actual_revs = log._filter_revisions_touching_file_id(
729
 
                            tree.branch, 
730
 
                            file_id,
731
 
                            mainline,
732
 
                            list(view_revs_iter))
 
540
        actual_revs = log._get_revisions_touching_file_id(tree.branch, file_id,
 
541
                                                          mainline,
 
542
                                                          view_revs_iter)
733
543
        self.assertEqual(revisions, [r for r, revno, depth in actual_revs])
734
544
 
735
545
    def test_file_id_f1(self):