~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_log.py

  • Committer: Alexander Belchenko
  • Date: 2006-07-30 16:43:12 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060730164312-b025fd3ff0cee59e
rename  gpl.txt => COPYING.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005 by Canonical Ltd
2
2
# -*- coding: utf-8 -*-
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
22
22
 
23
23
import bzrlib
24
24
from bzrlib.tests.blackbox import ExternalBase
25
 
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
 
25
from bzrlib.tests import TestCaseInTempDir
26
26
 
27
27
 
28
28
class TestLog(ExternalBase):
29
29
 
30
 
    def _prepare(self, format=None):
31
 
        if format:
32
 
            self.run_bzr(["init", "--format="+format])
33
 
        else:
34
 
            self.run_bzr("init")
 
30
    def _prepare(self):
 
31
        self.runbzr("init")
35
32
        self.build_tree(['hello.txt', 'goodbye.txt', 'meep.txt'])
36
 
        self.run_bzr("add hello.txt")
37
 
        self.run_bzr("commit -m message1 hello.txt")
38
 
        self.run_bzr("add goodbye.txt")
39
 
        self.run_bzr("commit -m message2 goodbye.txt")
40
 
        self.run_bzr("add meep.txt")
41
 
        self.run_bzr("commit -m message3 meep.txt")
42
 
        self.full_log = self.run_bzr("log")[0]
 
33
        self.runbzr("add hello.txt")
 
34
        self.runbzr("commit -m message1 hello.txt")
 
35
        self.runbzr("add goodbye.txt")
 
36
        self.runbzr("commit -m message2 goodbye.txt")
 
37
        self.runbzr("add meep.txt")
 
38
        self.runbzr("commit -m message3 meep.txt")
 
39
        self.full_log = self.runbzr("log")[0]
43
40
 
44
41
    def test_log_null_end_revspec(self):
45
42
        self._prepare()
50
47
        self.assertTrue('message:\n  message2\n' in self.full_log)
51
48
        self.assertTrue('message:\n  message3\n' in self.full_log)
52
49
 
53
 
        log = self.run_bzr("log -r 1..")[0]
54
 
        self.assertEqualDiff(log, self.full_log)
 
50
        log = self.runbzr("log -r 1..")[0]
 
51
        self.assertEquals(log, self.full_log)
55
52
 
56
53
    def test_log_null_begin_revspec(self):
57
54
        self._prepare()
58
 
        log = self.run_bzr("log -r ..3")[0]
59
 
        self.assertEqualDiff(self.full_log, log)
 
55
        log = self.runbzr("log -r ..3")[0]
 
56
        self.assertEquals(self.full_log, log)
60
57
 
61
58
    def test_log_null_both_revspecs(self):
62
59
        self._prepare()
63
 
        log = self.run_bzr("log -r ..")[0]
 
60
        log = self.runbzr("log -r ..")[0]
64
61
        self.assertEquals(self.full_log, log)
65
 
        self.assertEqualDiff(self.full_log, log)
66
62
 
67
63
    def test_log_negative_begin_revspec_full_log(self):
68
64
        self._prepare()
69
 
        log = self.run_bzr("log -r -3..")[0]
70
 
        self.assertEqualDiff(self.full_log, log)
 
65
        log = self.runbzr("log -r -3..")[0]
 
66
        self.assertEquals(self.full_log, log)
71
67
 
72
68
    def test_log_negative_both_revspec_full_log(self):
73
69
        self._prepare()
74
 
        log = self.run_bzr("log -r -3..-1")[0]
75
 
        self.assertEqualDiff(self.full_log, log)
 
70
        log = self.runbzr("log -r -3..-1")[0]
 
71
        self.assertEquals(self.full_log, log)
76
72
 
77
73
    def test_log_negative_both_revspec_partial(self):
78
74
        self._prepare()
79
 
        log = self.run_bzr("log -r -3..-2")[0]
 
75
        log = self.runbzr("log -r -3..-2")[0]
80
76
        self.assertTrue('revno: 1\n' in log)
81
77
        self.assertTrue('revno: 2\n' in log)
82
78
        self.assertTrue('revno: 3\n' not in log)
83
79
 
84
80
    def test_log_negative_begin_revspec(self):
85
81
        self._prepare()
86
 
        log = self.run_bzr("log -r -2..")[0]
 
82
        log = self.runbzr("log -r -2..")[0]
87
83
        self.assertTrue('revno: 1\n' not in log)
88
84
        self.assertTrue('revno: 2\n' in log)
89
85
        self.assertTrue('revno: 3\n' in log)
90
86
 
91
87
    def test_log_postive_revspecs(self):
92
88
        self._prepare()
93
 
        log = self.run_bzr("log -r 1..3")[0]
94
 
        self.assertEqualDiff(self.full_log, log)
95
 
 
96
 
    def test_log_reversed_revspecs(self):
97
 
        self._prepare()
98
 
        self.run_bzr_error(('bzr: ERROR: Start revision must be older than '
99
 
                            'the end revision.\n',),
100
 
                           ['log', '-r3..1'])
101
 
 
102
 
    def test_log_revno_n_path(self):
103
 
        os.mkdir('branch1')
104
 
        os.chdir('branch1')
105
 
        self._prepare()
106
 
        os.chdir('..')
107
 
        os.mkdir('branch2')
108
 
        os.chdir('branch2')
109
 
        self._prepare()
110
 
        os.chdir('..')
111
 
        log = self.run_bzr("log -r revno:2:branch1..revno:3:branch2",
112
 
                          retcode=3)[0]
113
 
        log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
114
 
        self.assertEqualDiff(self.full_log, log)
115
 
        log = self.run_bzr("log -r revno:1:branch2")[0]
116
 
        self.assertTrue('revno: 1\n' in log)
117
 
        self.assertTrue('revno: 2\n' not in log)
118
 
        self.assertTrue('branch nick: branch2\n' in log)
119
 
        self.assertTrue('branch nick: branch1\n' not in log)
120
 
        
121
 
    def test_log_nonexistent_file(self):
122
 
        # files that don't exist in either the basis tree or working tree
123
 
        # should give an error
124
 
        wt = self.make_branch_and_tree('.')
125
 
        out, err = self.run_bzr('log does-not-exist', retcode=3)
126
 
        self.assertContainsRe(
127
 
            err, 'Path does not have any revision history: does-not-exist')
128
 
 
129
 
    def test_log_with_tags(self):
130
 
        self._prepare(format='dirstate-tags')
131
 
        self.run_bzr('tag -r1 tag1')
132
 
        self.run_bzr('tag -r1 tag1.1')
133
 
        self.run_bzr('tag tag3')
134
 
        
135
 
        log = self.run_bzr("log -r-1")[0]
136
 
        self.assertTrue('tags: tag3' in log)
137
 
 
138
 
        log = self.run_bzr("log -r1")[0]
139
 
        # I guess that we can't know the order of tags in the output
140
 
        # since dicts are unordered, need to check both possibilities
141
 
        self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
142
 
 
143
 
    def test_merged_log_with_tags(self):
144
 
        os.mkdir('branch1')
145
 
        os.chdir('branch1')
146
 
        self._prepare(format='dirstate-tags')
147
 
        os.chdir('..')
148
 
        self.run_bzr('branch branch1 branch2')
149
 
        os.chdir('branch1')
150
 
        self.run_bzr('commit -m foobar --unchanged')
151
 
        self.run_bzr('tag tag1')
152
 
        os.chdir('../branch2')
153
 
        self.run_bzr('merge ../branch1')
154
 
        self.run_bzr(['commit', '-m', 'merge branch 1'])
155
 
        log = self.run_bzr("log -r-1")[0]
156
 
        self.assertContainsRe(log, r'    tags: tag1')
157
 
        log = self.run_bzr("log -r3.1.1")[0]
158
 
        self.assertContainsRe(log, r'tags: tag1')
159
 
 
160
 
    def test_log_limit(self):
161
 
        self._prepare()
162
 
        log = self.run_bzr("log --limit 2")[0]
163
 
        self.assertTrue('revno: 1\n' not in log)
164
 
        self.assertTrue('revno: 2\n' in log)
165
 
        self.assertTrue('revno: 3\n' in log)
 
89
        log = self.runbzr("log -r 1..3")[0]
 
90
        self.assertEquals(self.full_log, log)
 
91
 
166
92
 
167
93
class TestLogMerges(ExternalBase):
168
94
 
169
 
    def _prepare(self):
 
95
    def test_merges_are_indented_by_level(self):
170
96
        self.build_tree(['parent/'])
171
 
        self.run_bzr('init parent')
172
 
        self.run_bzr(['commit', '-m', 'first post', '--unchanged', 'parent'])
173
 
        self.run_bzr('branch parent child')
174
 
        self.run_bzr(['commit', '-m', 'branch 1', '--unchanged', 'child'])
175
 
        self.run_bzr('branch child smallerchild')
176
 
        self.run_bzr(['commit', '-m', 'branch 2', '--unchanged',
177
 
                      'smallerchild'])
 
97
        self.run_bzr('init', 'parent')
 
98
        self.run_bzr('commit', '-m', 'first post', '--unchanged', 'parent')
 
99
        self.run_bzr('branch', 'parent', 'child')
 
100
        self.run_bzr('commit', '-m', 'branch 1', '--unchanged', 'child')
 
101
        self.run_bzr('branch', 'child', 'smallerchild')
 
102
        self.run_bzr('commit', '-m', 'branch 2', '--unchanged', 'smallerchild')
178
103
        os.chdir('child')
179
 
        self.run_bzr('merge ../smallerchild')
180
 
        self.run_bzr(['commit', '-m', 'merge branch 2'])
 
104
        self.run_bzr('merge', '../smallerchild')
 
105
        self.run_bzr('commit', '-m', 'merge branch 2')
181
106
        os.chdir('../parent')
182
 
        self.run_bzr('merge ../child')
183
 
        self.run_bzr(['commit', '-m', 'merge branch 1'])
184
 
 
185
 
    def test_merges_are_indented_by_level(self):
186
 
        self._prepare()
 
107
        self.run_bzr('merge', '../child')
 
108
        self.run_bzr('commit', '-m', 'merge branch 1')
187
109
        out,err = self.run_bzr('log')
188
110
        # the log will look something like:
189
111
#        self.assertEqual("""\
195
117
#message:
196
118
#  merge branch 1
197
119
#    ------------------------------------------------------------
198
 
#    revno: 1.1.2  
 
120
#    merged: foo@example.com-20060328113140-91f43cfb46dc2863
199
121
#    committer: Robert Collins <foo@example.com>
200
122
#    branch nick: child
201
123
#    timestamp: Tue 2006-03-28 22:31:40 +1100
202
124
#    message:
203
125
#      merge branch 2
204
126
#        ------------------------------------------------------------
205
 
#        revno: 1.1.1.1
 
127
#        merged: foo@example.com-20060328113140-1ba24f850a0ef573
206
128
#        committer: Robert Collins <foo@example.com>
207
129
#        branch nick: smallerchild
208
130
#        timestamp: Tue 2006-03-28 22:31:40 +1100
209
131
#        message:
210
132
#          branch 2
211
133
#    ------------------------------------------------------------
212
 
#    revno: 1.1.1
 
134
#    merged: foo@example.com-20060328113140-5749a4757a8ac792
213
135
#    committer: Robert Collins <foo@example.com>
214
136
#    branch nick: child
215
137
#    timestamp: Tue 2006-03-28 22:31:40 +1100
224
146
#  first post
225
147
#""", out)
226
148
        # but we dont have a nice pattern matcher hooked up yet, so:
227
 
        # we check for the indenting of the commit message and the 
228
 
        # revision numbers 
229
 
        self.assertTrue('revno: 2' in out)
 
149
        # we check for the indenting of the commit message:
230
150
        self.assertTrue('  merge branch 1' in out)
231
 
        self.assertTrue('    revno: 1.1.2' in out)
232
151
        self.assertTrue('      merge branch 2' in out)
233
 
        self.assertTrue('        revno: 1.1.1.1' in out)
234
152
        self.assertTrue('          branch 2' in out)
235
 
        self.assertTrue('    revno: 1.1.1' in out)
236
153
        self.assertTrue('      branch 1' in out)
237
 
        self.assertTrue('revno: 1\n' in out)
238
154
        self.assertTrue('  first post' in out)
239
155
        self.assertEqual('', err)
240
156
 
241
 
    def test_merges_single_merge_rev(self):
242
 
        self._prepare()
243
 
        out,err = self.run_bzr('log -r1.1.2')
244
 
        # the log will look something like:
245
 
#        self.assertEqual("""\
246
 
#------------------------------------------------------------
247
 
#revno: 1.1.2  
248
 
#committer: Robert Collins <foo@example.com>
249
 
#branch nick: child
250
 
#timestamp: Tue 2006-03-28 22:31:40 +1100
251
 
#message:
252
 
#  merge branch 2
253
 
#    ------------------------------------------------------------
254
 
#    revno: 1.1.1.1
255
 
#    committer: Robert Collins <foo@example.com>
256
 
#    branch nick: smallerchild
257
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
258
 
#    message:
259
 
#      branch 2
260
 
#""", out)
261
 
        # but we dont have a nice pattern matcher hooked up yet, so:
262
 
        # we check for the indenting of the commit message and the 
263
 
        # revision numbers 
264
 
        self.assertTrue('revno: 2' not in out)
265
 
        self.assertTrue('  merge branch 1' not in out)
266
 
        self.assertTrue('revno: 1.1.2' in out)
267
 
        self.assertTrue('  merge branch 2' in out)
268
 
        self.assertTrue('    revno: 1.1.1.1' in out)
269
 
        self.assertTrue('      branch 2' in out)
270
 
        self.assertTrue('revno: 1.1.1\n' not in out)
271
 
        self.assertTrue('  branch 1' not in out)
272
 
        self.assertTrue('revno: 1\n' not in out)
273
 
        self.assertTrue('  first post' not in out)
274
 
        self.assertEqual('', err)
275
 
 
276
 
    def test_merges_partial_range(self):
277
 
        self._prepare()
278
 
        out,err = self.run_bzr('log -r1.1.1..1.1.2')
279
 
        # the log will look something like:
280
 
#        self.assertEqual("""\
281
 
#------------------------------------------------------------
282
 
#revno: 1.1.2  
283
 
#committer: Robert Collins <foo@example.com>
284
 
#branch nick: child
285
 
#timestamp: Tue 2006-03-28 22:31:40 +1100
286
 
#message:
287
 
#  merge branch 2
288
 
#    ------------------------------------------------------------
289
 
#    revno: 1.1.1.1
290
 
#    committer: Robert Collins <foo@example.com>
291
 
#    branch nick: smallerchild
292
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
293
 
#    message:
294
 
#      branch 2
295
 
#------------------------------------------------------------
296
 
#revno: 1.1.1
297
 
#committer: Robert Collins <foo@example.com>
298
 
#branch nick: child
299
 
#timestamp: Tue 2006-03-28 22:31:40 +1100
300
 
#message:
301
 
#  branch 1
302
 
#""", out)
303
 
        # but we dont have a nice pattern matcher hooked up yet, so:
304
 
        # we check for the indenting of the commit message and the 
305
 
        # revision numbers 
306
 
        self.assertTrue('revno: 2' not in out)
307
 
        self.assertTrue('  merge branch 1' not in out)
308
 
        self.assertTrue('revno: 1.1.2' in out)
309
 
        self.assertTrue('  merge branch 2' in out)
310
 
        self.assertTrue('    revno: 1.1.1.1' in out)
311
 
        self.assertTrue('      branch 2' in out)
312
 
        self.assertTrue('revno: 1.1.1' in out)
313
 
        self.assertTrue('  branch 1' in out)
314
 
        self.assertTrue('revno: 1\n' not in out)
315
 
        self.assertTrue('  first post' not in out)
316
 
        self.assertEqual('', err)
317
 
 
318
 
 
 
157
 
319
158
class TestLogEncodings(TestCaseInTempDir):
320
159
 
321
160
    _mu = u'\xb5'
349
188
        bzr = self.run_bzr
350
189
        bzr('init')
351
190
        open('a', 'wb').write('some stuff\n')
352
 
        bzr('add a')
353
 
        bzr(['commit', '-m', self._message])
 
191
        bzr('add', 'a')
 
192
        bzr('commit', '-m', self._message)
354
193
 
355
194
    def try_encoding(self, encoding, fail=False):
356
195
        bzr = self.run_bzr
397
236
 
398
237
        bzr('init')
399
238
        self.build_tree(['a'])
400
 
        bzr('add a')
401
 
        bzr(['commit', '-m', u'\u0422\u0435\u0441\u0442'])
 
239
        bzr('add', 'a')
 
240
        bzr('commit', '-m', u'\u0422\u0435\u0441\u0442')
402
241
        stdout, stderr = self.run_bzr('log', encoding='cp866')
403
242
 
404
243
        message = stdout.splitlines()[-1]
416
255
        # Make sure the cp1251 string is not found anywhere
417
256
        self.assertEquals(-1, stdout.find(test_in_cp1251))
418
257
 
419
 
 
420
 
class TestLogFile(TestCaseWithTransport):
421
 
 
422
 
    def test_log_local_branch_file(self):
423
 
        """We should be able to log files in local treeless branches"""
424
 
        tree = self.make_branch_and_tree('tree')
425
 
        self.build_tree(['tree/file'])
426
 
        tree.add('file')
427
 
        tree.commit('revision 1')
428
 
        tree.bzrdir.destroy_workingtree()
429
 
        self.run_bzr('log tree/file')
430
 
 
431
 
    def test_log_file(self):
432
 
        """The log for a particular file should only list revs for that file"""
433
 
        tree = self.make_branch_and_tree('parent')
434
 
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
435
 
        tree.add('file1')
436
 
        tree.commit('add file1')
437
 
        tree.add('file2')
438
 
        tree.commit('add file2')
439
 
        tree.add('file3')
440
 
        tree.commit('add file3')
441
 
        self.run_bzr('branch parent child')
442
 
        print >> file('child/file2', 'wb'), 'hello'
443
 
        self.run_bzr(['commit', '-m', 'branch 1', 'child'])
444
 
        os.chdir('parent')
445
 
        self.run_bzr('merge ../child')
446
 
        self.run_bzr(['commit', '-m', 'merge child branch'])
447
 
        log = self.run_bzr('log file1')[0]
448
 
        self.assertContainsRe(log, 'revno: 1\n')
449
 
        self.assertNotContainsRe(log, 'revno: 2\n')
450
 
        self.assertNotContainsRe(log, 'revno: 3\n')
451
 
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
452
 
        self.assertNotContainsRe(log, 'revno: 4\n')
453
 
        log = self.run_bzr('log file2')[0]
454
 
        self.assertNotContainsRe(log, 'revno: 1\n')
455
 
        self.assertContainsRe(log, 'revno: 2\n')
456
 
        self.assertNotContainsRe(log, 'revno: 3\n')
457
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
458
 
        self.assertContainsRe(log, 'revno: 4\n')
459
 
        log = self.run_bzr('log file3')[0]
460
 
        self.assertNotContainsRe(log, 'revno: 1\n')
461
 
        self.assertNotContainsRe(log, 'revno: 2\n')
462
 
        self.assertContainsRe(log, 'revno: 3\n')
463
 
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
464
 
        self.assertNotContainsRe(log, 'revno: 4\n')
465
 
        log = self.run_bzr('log -r3.1.1 file2')[0]
466
 
        self.assertNotContainsRe(log, 'revno: 1\n')
467
 
        self.assertNotContainsRe(log, 'revno: 2\n')
468
 
        self.assertNotContainsRe(log, 'revno: 3\n')
469
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
470
 
        self.assertNotContainsRe(log, 'revno: 4\n')
471
 
        log = self.run_bzr('log -r4 file2')[0]
472
 
        self.assertNotContainsRe(log, 'revno: 1\n')
473
 
        self.assertNotContainsRe(log, 'revno: 2\n')
474
 
        self.assertNotContainsRe(log, 'revno: 3\n')
475
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
476
 
        self.assertContainsRe(log, 'revno: 4\n')
477
 
        log = self.run_bzr('log -r3.. file2')[0]
478
 
        self.assertNotContainsRe(log, 'revno: 1\n')
479
 
        self.assertNotContainsRe(log, 'revno: 2\n')
480
 
        self.assertNotContainsRe(log, 'revno: 3\n')
481
 
        self.assertContainsRe(log, 'revno: 3.1.1\n')
482
 
        self.assertContainsRe(log, 'revno: 4\n')
483
 
        log = self.run_bzr('log -r..3 file2')[0]
484
 
        self.assertNotContainsRe(log, 'revno: 1\n')
485
 
        self.assertContainsRe(log, 'revno: 2\n')
486
 
        self.assertNotContainsRe(log, 'revno: 3\n')
487
 
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
488
 
        self.assertNotContainsRe(log, 'revno: 4\n')