~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-02 15:01:18 UTC
  • mfrom: (2466.11.2 merge_deltas)
  • mto: This revision was merged to the branch mainline in revision 2570.
  • Revision ID: john@arbash-meinel.com-20070702150118-ypa1als5c0dx61ll
(Kent Gibson) 'bzr log --verbose' shows deltas for merged revisions.

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', 'child')
 
168
        os.chdir('parent')
 
169
        self.run_bzr('merge', '../child')
 
170
        wt.commit('merge child branch')
 
171
        os.chdir('..')
 
172
        b = wt.branch
 
173
        lf = LogCatcher()
 
174
        lf.supports_merge_revisions = True
 
175
        show_log(b, lf, verbose=True)
 
176
        eq(len(lf.logs),3)
 
177
        logentry = lf.logs[0]
 
178
        eq(logentry.revno, '2')
 
179
        eq(logentry.rev.message, 'merge child branch')
 
180
        d = logentry.delta
 
181
        self.checkDelta(d, removed=['file1'], modified=['file2'])
 
182
        logentry = lf.logs[1]
 
183
        eq(logentry.revno, '1.1.1')
 
184
        eq(logentry.rev.message, 'remove file1 and modify file2')
 
185
        d = logentry.delta
 
186
        self.checkDelta(d, removed=['file1'], modified=['file2'])
 
187
        logentry = lf.logs[2]
 
188
        eq(logentry.revno, '1')
 
189
        eq(logentry.rev.message, 'add file1 and file2')
 
190
        d = logentry.delta
 
191
        self.checkDelta(d, added=['file1', 'file2'])
 
192
 
 
193
 
 
194
def make_commits_with_trailing_newlines(wt):
 
195
    """Helper method for LogFormatter tests"""    
 
196
    b = wt.branch
 
197
    b.nick='test'
 
198
    open('a', 'wb').write('hello moto\n')
 
199
    wt.add('a')
 
200
    wt.commit('simple log message', rev_id='a1'
 
201
            , timestamp=1132586655.459960938, timezone=-6*3600
 
202
            , committer='Joe Foo <joe@foo.com>')
 
203
    open('b', 'wb').write('goodbye\n')
 
204
    wt.add('b')
 
205
    wt.commit('multiline\nlog\nmessage\n', rev_id='a2'
 
206
            , timestamp=1132586842.411175966, timezone=-6*3600
 
207
            , committer='Joe Foo <joe@foo.com>')
 
208
 
 
209
    open('c', 'wb').write('just another manic monday\n')
 
210
    wt.add('c')
 
211
    wt.commit('single line with trailing newline\n', rev_id='a3'
 
212
            , timestamp=1132587176.835228920, timezone=-6*3600
 
213
            , committer = 'Joe Foo <joe@foo.com>')
 
214
    return b
 
215
 
 
216
 
 
217
class TestShortLogFormatter(TestCaseWithTransport):
 
218
 
161
219
    def test_trailing_newlines(self):
162
220
        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
 
 
 
221
        b = make_commits_with_trailing_newlines(wt)
182
222
        sio = StringIO()
183
223
        lf = ShortLogFormatter(to_file=sio)
184
224
        show_log(b, lf)
196
236
 
197
237
""")
198
238
 
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
 
        
 
239
 
 
240
class TestLongLogFormatter(TestCaseWithTransport):
 
241
 
 
242
    def normalize_log(self,log):
 
243
        """Replaces the variable lines of logs with fixed lines"""
 
244
        committer = 'committer: Lorem Ipsum <test@example.com>'
 
245
        lines = log.splitlines(True)
 
246
        for idx,line in enumerate(lines):
 
247
            stripped_line = line.lstrip()
 
248
            indent = ' ' * (len(line) - len(stripped_line))
 
249
            if stripped_line.startswith('committer:'):
 
250
                lines[idx] = indent + committer + '\n'
 
251
            if stripped_line.startswith('timestamp:'):
 
252
                lines[idx] = indent + 'timestamp: Just now\n'
 
253
        return ''.join(lines)
 
254
 
228
255
    def test_verbose_log(self):
229
256
        """Verbose log includes changed files
230
257
        
258
285
  a
259
286
''')
260
287
 
 
288
    def test_merges_are_indented_by_level(self):
 
289
        wt = self.make_branch_and_tree('parent')
 
290
        wt.commit('first post')
 
291
        self.run_bzr('branch', 'parent', 'child')
 
292
        self.run_bzr('commit', '-m', 'branch 1', '--unchanged', 'child')
 
293
        self.run_bzr('branch', 'child', 'smallerchild')
 
294
        self.run_bzr('commit', '-m', 'branch 2', '--unchanged', 'smallerchild')
 
295
        os.chdir('child')
 
296
        self.run_bzr('merge', '../smallerchild')
 
297
        self.run_bzr('commit', '-m', 'merge branch 2')
 
298
        os.chdir('../parent')
 
299
        self.run_bzr('merge', '../child')
 
300
        wt.commit('merge branch 1')
 
301
        b = wt.branch
 
302
        sio = StringIO()
 
303
        lf = LongLogFormatter(to_file=sio)
 
304
        show_log(b, lf, verbose=True)
 
305
        log = self.normalize_log(sio.getvalue())
 
306
        self.assertEqualDiff("""\
 
307
------------------------------------------------------------
 
308
revno: 2
 
309
committer: Lorem Ipsum <test@example.com>
 
310
branch nick: parent
 
311
timestamp: Just now
 
312
message:
 
313
  merge branch 1
 
314
    ------------------------------------------------------------
 
315
    revno: 1.1.2
 
316
    committer: Lorem Ipsum <test@example.com>
 
317
    branch nick: child
 
318
    timestamp: Just now
 
319
    message:
 
320
      merge branch 2
 
321
        ------------------------------------------------------------
 
322
        revno: 1.1.1.1.1
 
323
        committer: Lorem Ipsum <test@example.com>
 
324
        branch nick: smallerchild
 
325
        timestamp: Just now
 
326
        message:
 
327
          branch 2
 
328
    ------------------------------------------------------------
 
329
    revno: 1.1.1
 
330
    committer: Lorem Ipsum <test@example.com>
 
331
    branch nick: child
 
332
    timestamp: Just now
 
333
    message:
 
334
      branch 1
 
335
------------------------------------------------------------
 
336
revno: 1
 
337
committer: Lorem Ipsum <test@example.com>
 
338
branch nick: parent
 
339
timestamp: Just now
 
340
message:
 
341
  first post
 
342
""", log)
 
343
 
 
344
    def test_verbose_merge_revisions_contain_deltas(self):
 
345
        wt = self.make_branch_and_tree('parent')
 
346
        self.build_tree(['parent/f1', 'parent/f2'])
 
347
        wt.add(['f1','f2'])
 
348
        wt.commit('first post')
 
349
        self.run_bzr('branch', 'parent', 'child')
 
350
        os.unlink('child/f1')
 
351
        print >> file('child/f2', 'wb'), 'hello'
 
352
        self.run_bzr('commit', '-m', 'removed f1 and modified f2', 'child')
 
353
        os.chdir('parent')
 
354
        self.run_bzr('merge', '../child')
 
355
        wt.commit('merge branch 1')
 
356
        b = wt.branch
 
357
        sio = StringIO()
 
358
        lf = LongLogFormatter(to_file=sio)
 
359
        show_log(b, lf, verbose=True)
 
360
        log = self.normalize_log(sio.getvalue())
 
361
        self.assertEqualDiff("""\
 
362
------------------------------------------------------------
 
363
revno: 2
 
364
committer: Lorem Ipsum <test@example.com>
 
365
branch nick: parent
 
366
timestamp: Just now
 
367
message:
 
368
  merge branch 1
 
369
removed:
 
370
  f1
 
371
modified:
 
372
  f2
 
373
    ------------------------------------------------------------
 
374
    revno: 1.1.1
 
375
    committer: Lorem Ipsum <test@example.com>
 
376
    branch nick: child
 
377
    timestamp: Just now
 
378
    message:
 
379
      removed f1 and modified f2
 
380
    removed:
 
381
      f1
 
382
    modified:
 
383
      f2
 
384
------------------------------------------------------------
 
385
revno: 1
 
386
committer: Lorem Ipsum <test@example.com>
 
387
branch nick: parent
 
388
timestamp: Just now
 
389
message:
 
390
  first post
 
391
added:
 
392
  f1
 
393
  f2
 
394
""", log)
 
395
 
 
396
    def test_trailing_newlines(self):
 
397
        wt = self.make_branch_and_tree('.')
 
398
        b = make_commits_with_trailing_newlines(wt)
 
399
        sio = StringIO()
 
400
        lf = LongLogFormatter(to_file=sio)
 
401
        show_log(b, lf)
 
402
        self.assertEqualDiff(sio.getvalue(), """\
 
403
------------------------------------------------------------
 
404
revno: 3
 
405
committer: Joe Foo <joe@foo.com>
 
406
branch nick: test
 
407
timestamp: Mon 2005-11-21 09:32:56 -0600
 
408
message:
 
409
  single line with trailing newline
 
410
------------------------------------------------------------
 
411
revno: 2
 
412
committer: Joe Foo <joe@foo.com>
 
413
branch nick: test
 
414
timestamp: Mon 2005-11-21 09:27:22 -0600
 
415
message:
 
416
  multiline
 
417
  log
 
418
  message
 
419
------------------------------------------------------------
 
420
revno: 1
 
421
committer: Joe Foo <joe@foo.com>
 
422
branch nick: test
 
423
timestamp: Mon 2005-11-21 09:24:15 -0600
 
424
message:
 
425
  simple log message
 
426
""")
 
427
 
 
428
 
 
429
class TestLineLogFormatter(TestCaseWithTransport):
 
430
 
261
431
    def test_line_log(self):
262
432
        """Line log should show revno
263
433
        
311
481
        finally:
312
482
            wt.unlock()
313
483
 
 
484
    def test_trailing_newlines(self):
 
485
        wt = self.make_branch_and_tree('.')
 
486
        b = make_commits_with_trailing_newlines(wt)
 
487
        sio = StringIO()
 
488
        lf = LineLogFormatter(to_file=sio)
 
489
        show_log(b, lf)
 
490
        self.assertEqualDiff(sio.getvalue(), """\
 
491
3: Joe Foo 2005-11-21 single line with trailing newline
 
492
2: Joe Foo 2005-11-21 multiline
 
493
1: Joe Foo 2005-11-21 simple log message
 
494
""")
 
495
 
 
496
 
 
497
class TestGetViewRevisions(TestCaseWithTransport):
 
498
 
314
499
    def make_tree_with_commits(self):
315
500
        """Create a tree with well-known revision ids"""
316
501
        wt = self.make_branch_and_tree('tree1')