~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Wouter van Heyst
  • Date: 2006-06-07 16:05:27 UTC
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: larstiq@larstiq.dyndns.org-20060607160527-2b3649154d0e2e84
more code cleanup

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
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
8
 
#
 
8
 
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
12
# GNU General Public License for more details.
13
 
#
 
13
 
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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
97
        self.run_bzr('init', 'parent')
172
98
        self.run_bzr('commit', '-m', 'first post', '--unchanged', 'parent')
180
106
        os.chdir('../parent')
181
107
        self.run_bzr('merge', '../child')
182
108
        self.run_bzr('commit', '-m', 'merge branch 1')
183
 
 
184
 
    def test_merges_are_indented_by_level(self):
185
 
        self._prepare()
186
109
        out,err = self.run_bzr('log')
187
110
        # the log will look something like:
188
111
#        self.assertEqual("""\
194
117
#message:
195
118
#  merge branch 1
196
119
#    ------------------------------------------------------------
197
 
#    revno: 1.1.2  
 
120
#    merged: foo@example.com-20060328113140-91f43cfb46dc2863
198
121
#    committer: Robert Collins <foo@example.com>
199
122
#    branch nick: child
200
123
#    timestamp: Tue 2006-03-28 22:31:40 +1100
201
124
#    message:
202
125
#      merge branch 2
203
126
#        ------------------------------------------------------------
204
 
#        revno: 1.1.1.1
 
127
#        merged: foo@example.com-20060328113140-1ba24f850a0ef573
205
128
#        committer: Robert Collins <foo@example.com>
206
129
#        branch nick: smallerchild
207
130
#        timestamp: Tue 2006-03-28 22:31:40 +1100
208
131
#        message:
209
132
#          branch 2
210
133
#    ------------------------------------------------------------
211
 
#    revno: 1.1.1
 
134
#    merged: foo@example.com-20060328113140-5749a4757a8ac792
212
135
#    committer: Robert Collins <foo@example.com>
213
136
#    branch nick: child
214
137
#    timestamp: Tue 2006-03-28 22:31:40 +1100
223
146
#  first post
224
147
#""", out)
225
148
        # but we dont have a nice pattern matcher hooked up yet, so:
226
 
        # we check for the indenting of the commit message and the 
227
 
        # revision numbers 
228
 
        self.assertTrue('revno: 2' in out)
 
149
        # we check for the indenting of the commit message:
229
150
        self.assertTrue('  merge branch 1' in out)
230
 
        self.assertTrue('    revno: 1.1.2' in out)
231
151
        self.assertTrue('      merge branch 2' in out)
232
 
        self.assertTrue('        revno: 1.1.1.1' in out)
233
152
        self.assertTrue('          branch 2' in out)
234
 
        self.assertTrue('    revno: 1.1.1' in out)
235
153
        self.assertTrue('      branch 1' in out)
236
 
        self.assertTrue('revno: 1\n' in out)
237
154
        self.assertTrue('  first post' in out)
238
155
        self.assertEqual('', err)
239
156
 
240
 
    def test_merges_single_merge_rev(self):
241
 
        self._prepare()
242
 
        out,err = self.run_bzr('log', '-r1.1.2')
243
 
        # the log will look something like:
244
 
#        self.assertEqual("""\
245
 
#    ------------------------------------------------------------
246
 
#    revno: 1.1.2  
247
 
#    committer: Robert Collins <foo@example.com>
248
 
#    branch nick: child
249
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
250
 
#    message:
251
 
#      merge branch 2
252
 
#        ------------------------------------------------------------
253
 
#        revno: 1.1.1.1
254
 
#        committer: Robert Collins <foo@example.com>
255
 
#        branch nick: smallerchild
256
 
#        timestamp: Tue 2006-03-28 22:31:40 +1100
257
 
#        message:
258
 
#          branch 2
259
 
#""", out)
260
 
        # but we dont have a nice pattern matcher hooked up yet, so:
261
 
        # we check for the indenting of the commit message and the 
262
 
        # revision numbers 
263
 
        self.assertTrue('revno: 2' not in out)
264
 
        self.assertTrue('  merge branch 1' not in out)
265
 
        self.assertTrue('    revno: 1.1.2' in out)
266
 
        self.assertTrue('      merge branch 2' in out)
267
 
        self.assertTrue('        revno: 1.1.1.1' in out)
268
 
        self.assertTrue('          branch 2' in out)
269
 
        self.assertTrue('    revno: 1.1.1\n' not in out)
270
 
        self.assertTrue('      branch 1' not in out)
271
 
        self.assertTrue('revno: 1\n' not in out)
272
 
        self.assertTrue('  first post' not in out)
273
 
        self.assertEqual('', err)
274
 
 
275
 
    def test_merges_partial_range(self):
276
 
        self._prepare()
277
 
        out,err = self.run_bzr('log', '-r1.1.1..1.1.2')
278
 
        # the log will look something like:
279
 
#        self.assertEqual("""\
280
 
#    ------------------------------------------------------------
281
 
#    revno: 1.1.2  
282
 
#    committer: Robert Collins <foo@example.com>
283
 
#    branch nick: child
284
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
285
 
#    message:
286
 
#      merge branch 2
287
 
#        ------------------------------------------------------------
288
 
#        revno: 1.1.1.1
289
 
#        committer: Robert Collins <foo@example.com>
290
 
#        branch nick: smallerchild
291
 
#        timestamp: Tue 2006-03-28 22:31:40 +1100
292
 
#        message:
293
 
#          branch 2
294
 
#    ------------------------------------------------------------
295
 
#    revno: 1.1.1
296
 
#    committer: Robert Collins <foo@example.com>
297
 
#    branch nick: child
298
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
299
 
#    message:
300
 
#      branch 1
301
 
#""", out)
302
 
        # but we dont have a nice pattern matcher hooked up yet, so:
303
 
        # we check for the indenting of the commit message and the 
304
 
        # revision numbers 
305
 
        self.assertTrue('revno: 2' not in out)
306
 
        self.assertTrue('  merge branch 1' not in out)
307
 
        self.assertTrue('    revno: 1.1.2' in out)
308
 
        self.assertTrue('      merge branch 2' in out)
309
 
        self.assertTrue('        revno: 1.1.1.1' in out)
310
 
        self.assertTrue('          branch 2' in out)
311
 
        self.assertTrue('    revno: 1.1.1' in out)
312
 
        self.assertTrue('      branch 1' in out)
313
 
        self.assertTrue('revno: 1\n' not in out)
314
 
        self.assertTrue('  first post' not in out)
315
 
        self.assertEqual('', err)
316
 
 
317
 
 
 
157
 
318
158
class TestLogEncodings(TestCaseInTempDir):
319
159
 
320
160
    _mu = u'\xb5'
415
255
        # Make sure the cp1251 string is not found anywhere
416
256
        self.assertEquals(-1, stdout.find(test_in_cp1251))
417
257
 
418
 
 
419
 
class TestLogFile(TestCaseWithTransport):
420
 
 
421
 
    def test_log_local_branch_file(self):
422
 
        """We should be able to log files in local treeless branches"""
423
 
        tree = self.make_branch_and_tree('tree')
424
 
        self.build_tree(['tree/file'])
425
 
        tree.add('file')
426
 
        tree.commit('revision 1')
427
 
        tree.bzrdir.destroy_workingtree()
428
 
        self.run_bzr('log', 'tree/file')
429
 
 
430
 
    def test_log_file(self):
431
 
        """The log for a particular file should only list revs for that file"""
432
 
        tree = self.make_branch_and_tree('parent')
433
 
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
434
 
        tree.add('file1')
435
 
        tree.commit('add file1')
436
 
        tree.add('file2')
437
 
        tree.commit('add file2')
438
 
        tree.add('file3')
439
 
        tree.commit('add file3')
440
 
        self.run_bzr('branch', 'parent', 'child')
441
 
        print >> file('child/file2', 'wb'), 'hello'
442
 
        self.run_bzr('commit', '-m', 'branch 1', 'child')
443
 
        os.chdir('parent')
444
 
        self.run_bzr('merge', '../child')
445
 
        self.run_bzr('commit', '-m', 'merge child branch')
446
 
       
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')