~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Robert Collins
  • Date: 2007-07-04 08:08:13 UTC
  • mfrom: (2572 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2587.
  • Revision ID: robertc@robertcollins.net-20070704080813-wzebx0r88fvwj5rq
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2007 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
 
25
from bzrlib.tests import TestCaseInTempDir, TestCaseWithTransport
26
26
 
27
27
 
28
28
class TestLog(ExternalBase):
29
29
 
30
 
    def _prepare(self):
31
 
        self.runbzr("init")
 
30
    def _prepare(self, format=None):
 
31
        if format:
 
32
            self.run_bzr(["init", "--format="+format])
 
33
        else:
 
34
            self.run_bzr("init")
32
35
        self.build_tree(['hello.txt', 'goodbye.txt', 'meep.txt'])
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]
 
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]
40
43
 
41
44
    def test_log_null_end_revspec(self):
42
45
        self._prepare()
47
50
        self.assertTrue('message:\n  message2\n' in self.full_log)
48
51
        self.assertTrue('message:\n  message3\n' in self.full_log)
49
52
 
50
 
        log = self.runbzr("log -r 1..")[0]
51
 
        self.assertEquals(log, self.full_log)
 
53
        log = self.run_bzr("log -r 1..")[0]
 
54
        self.assertEqualDiff(log, self.full_log)
52
55
 
53
56
    def test_log_null_begin_revspec(self):
54
57
        self._prepare()
55
 
        log = self.runbzr("log -r ..3")[0]
56
 
        self.assertEquals(self.full_log, log)
 
58
        log = self.run_bzr("log -r ..3")[0]
 
59
        self.assertEqualDiff(self.full_log, log)
57
60
 
58
61
    def test_log_null_both_revspecs(self):
59
62
        self._prepare()
60
 
        log = self.runbzr("log -r ..")[0]
 
63
        log = self.run_bzr("log -r ..")[0]
61
64
        self.assertEquals(self.full_log, log)
 
65
        self.assertEqualDiff(self.full_log, log)
62
66
 
63
67
    def test_log_negative_begin_revspec_full_log(self):
64
68
        self._prepare()
65
 
        log = self.runbzr("log -r -3..")[0]
66
 
        self.assertEquals(self.full_log, log)
 
69
        log = self.run_bzr("log -r -3..")[0]
 
70
        self.assertEqualDiff(self.full_log, log)
67
71
 
68
72
    def test_log_negative_both_revspec_full_log(self):
69
73
        self._prepare()
70
 
        log = self.runbzr("log -r -3..-1")[0]
71
 
        self.assertEquals(self.full_log, log)
 
74
        log = self.run_bzr("log -r -3..-1")[0]
 
75
        self.assertEqualDiff(self.full_log, log)
72
76
 
73
77
    def test_log_negative_both_revspec_partial(self):
74
78
        self._prepare()
75
 
        log = self.runbzr("log -r -3..-2")[0]
 
79
        log = self.run_bzr("log -r -3..-2")[0]
76
80
        self.assertTrue('revno: 1\n' in log)
77
81
        self.assertTrue('revno: 2\n' in log)
78
82
        self.assertTrue('revno: 3\n' not in log)
79
83
 
80
84
    def test_log_negative_begin_revspec(self):
81
85
        self._prepare()
82
 
        log = self.runbzr("log -r -2..")[0]
 
86
        log = self.run_bzr("log -r -2..")[0]
83
87
        self.assertTrue('revno: 1\n' not in log)
84
88
        self.assertTrue('revno: 2\n' in log)
85
89
        self.assertTrue('revno: 3\n' in log)
86
90
 
87
91
    def test_log_postive_revspecs(self):
88
92
        self._prepare()
89
 
        log = self.runbzr("log -r 1..3")[0]
90
 
        self.assertEquals(self.full_log, log)
 
93
        log = self.run_bzr("log -r 1..3")[0]
 
94
        self.assertEqualDiff(self.full_log, log)
91
95
 
92
96
    def test_log_revno_n_path(self):
93
97
        os.mkdir('branch1')
98
102
        os.chdir('branch2')
99
103
        self._prepare()
100
104
        os.chdir('..')
101
 
        log = self.runbzr("log -r revno:2:branch1..revno:3:branch2",
 
105
        log = self.run_bzr("log -r revno:2:branch1..revno:3:branch2",
102
106
                          retcode=3)[0]
103
 
        log = self.runbzr("log -r revno:1:branch2..revno:3:branch2")[0]
104
 
        self.assertEquals(self.full_log, log)
105
 
        log = self.runbzr("log -r revno:1:branch2")[0]
 
107
        log = self.run_bzr("log -r revno:1:branch2..revno:3:branch2")[0]
 
108
        self.assertEqualDiff(self.full_log, log)
 
109
        log = self.run_bzr("log -r revno:1:branch2")[0]
106
110
        self.assertTrue('revno: 1\n' in log)
107
111
        self.assertTrue('revno: 2\n' not in log)
108
112
        self.assertTrue('branch nick: branch2\n' in log)
109
113
        self.assertTrue('branch nick: branch1\n' not in log)
110
114
        
111
 
 
112
 
class TestLogMerges(ExternalBase):
113
 
 
114
 
    def test_merges_are_indented_by_level(self):
115
 
        self.build_tree(['parent/'])
116
 
        self.run_bzr('init', 'parent')
117
 
        self.run_bzr('commit', '-m', 'first post', '--unchanged', 'parent')
118
 
        self.run_bzr('branch', 'parent', 'child')
119
 
        self.run_bzr('commit', '-m', 'branch 1', '--unchanged', 'child')
120
 
        self.run_bzr('branch', 'child', 'smallerchild')
121
 
        self.run_bzr('commit', '-m', 'branch 2', '--unchanged', 'smallerchild')
122
 
        os.chdir('child')
123
 
        self.run_bzr('merge', '../smallerchild')
124
 
        self.run_bzr('commit', '-m', 'merge branch 2')
125
 
        os.chdir('../parent')
126
 
        self.run_bzr('merge', '../child')
127
 
        self.run_bzr('commit', '-m', 'merge branch 1')
128
 
        out,err = self.run_bzr('log')
129
 
        # the log will look something like:
130
 
#        self.assertEqual("""\
131
 
#------------------------------------------------------------
132
 
#revno: 2
133
 
#committer: Robert Collins <foo@example.com>
134
 
#branch nick: parent
135
 
#timestamp: Tue 2006-03-28 22:31:40 +1100
136
 
#message:
137
 
#  merge branch 1
138
 
#    ------------------------------------------------------------
139
 
#    merged: foo@example.com-20060328113140-91f43cfb46dc2863
140
 
#    committer: Robert Collins <foo@example.com>
141
 
#    branch nick: child
142
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
143
 
#    message:
144
 
#      merge branch 2
145
 
#        ------------------------------------------------------------
146
 
#        merged: foo@example.com-20060328113140-1ba24f850a0ef573
147
 
#        committer: Robert Collins <foo@example.com>
148
 
#        branch nick: smallerchild
149
 
#        timestamp: Tue 2006-03-28 22:31:40 +1100
150
 
#        message:
151
 
#          branch 2
152
 
#    ------------------------------------------------------------
153
 
#    merged: foo@example.com-20060328113140-5749a4757a8ac792
154
 
#    committer: Robert Collins <foo@example.com>
155
 
#    branch nick: child
156
 
#    timestamp: Tue 2006-03-28 22:31:40 +1100
157
 
#    message:
158
 
#      branch 1
159
 
#------------------------------------------------------------
160
 
#revno: 1
161
 
#committer: Robert Collins <foo@example.com>
162
 
#branch nick: parent
163
 
#timestamp: Tue 2006-03-28 22:31:39 +1100
164
 
#message:
165
 
#  first post
166
 
#""", out)
167
 
        # but we dont have a nice pattern matcher hooked up yet, so:
168
 
        # we check for the indenting of the commit message:
169
 
        self.assertTrue('  merge branch 1' in out)
170
 
        self.assertTrue('      merge branch 2' in out)
171
 
        self.assertTrue('          branch 2' in out)
172
 
        self.assertTrue('      branch 1' in out)
173
 
        self.assertTrue('  first post' in out)
174
 
        self.assertEqual('', err)
 
115
    def test_log_nonexistent_file(self):
 
116
        # files that don't exist in either the basis tree or working tree
 
117
        # should give an error
 
118
        wt = self.make_branch_and_tree('.')
 
119
        out, err = self.run_bzr('log', 'does-not-exist', retcode=3)
 
120
        self.assertContainsRe(
 
121
            err, 'Path does not have any revision history: does-not-exist')
 
122
 
 
123
    def test_log_with_tags(self):
 
124
        self._prepare(format='dirstate-tags')
 
125
        self.run_bzr('tag -r1 tag1')
 
126
        self.run_bzr('tag -r1 tag1.1')
 
127
        self.run_bzr('tag tag3')
 
128
        
 
129
        log = self.run_bzr("log -r-1")[0]
 
130
        self.assertTrue('tags: tag3' in log)
 
131
 
 
132
        log = self.run_bzr("log -r1")[0]
 
133
        # I guess that we can't know the order of tags in the output
 
134
        # since dicts are unordered, need to check both possibilities
 
135
        self.assertContainsRe(log, r'tags: (tag1, tag1\.1|tag1\.1, tag1)')
 
136
 
 
137
    def test_merged_log_with_tags(self):
 
138
        os.mkdir('branch1')
 
139
        os.chdir('branch1')
 
140
        self._prepare(format='dirstate-tags')
 
141
        os.chdir('..')
 
142
        self.run_bzr('branch branch1 branch2')
 
143
        os.chdir('branch1')
 
144
        self.run_bzr('commit -m foobar --unchanged')
 
145
        self.run_bzr('tag tag1')
 
146
        os.chdir('../branch2')
 
147
        self.run_bzr('merge ../branch1')
 
148
        self.run_bzr('commit -m merge_branch_1')
 
149
        log = self.run_bzr("log -r-1")[0]
 
150
        self.assertContainsRe(log, r'    tags: tag1')
 
151
 
 
152
    def test_log_limit(self):
 
153
        self._prepare()
 
154
        log = self.run_bzr("log --limit 2")[0]
 
155
        self.assertTrue('revno: 1\n' not in log)
 
156
        self.assertTrue('revno: 2\n' in log)
 
157
        self.assertTrue('revno: 3\n' in log)
175
158
 
176
159
 
177
160
class TestLogEncodings(TestCaseInTempDir):
274
257
        # Make sure the cp1251 string is not found anywhere
275
258
        self.assertEquals(-1, stdout.find(test_in_cp1251))
276
259
 
 
260
 
 
261
class TestLogFile(TestCaseWithTransport):
 
262
 
 
263
    def test_log_local_branch_file(self):
 
264
        """We should be able to log files in local treeless branches"""
 
265
        tree = self.make_branch_and_tree('tree')
 
266
        self.build_tree(['tree/file'])
 
267
        tree.add('file')
 
268
        tree.commit('revision 1')
 
269
        tree.bzrdir.destroy_workingtree()
 
270
        self.run_bzr('log', 'tree/file')
 
271
 
 
272
    def test_log_file(self):
 
273
        """The log for a particular file should only list revs for that file"""
 
274
        tree = self.make_branch_and_tree('parent')
 
275
        self.build_tree(['parent/file1', 'parent/file2', 'parent/file3'])
 
276
        tree.add('file1')
 
277
        tree.commit('add file1')
 
278
        tree.add('file2')
 
279
        tree.commit('add file2')
 
280
        tree.add('file3')
 
281
        tree.commit('add file3')
 
282
        self.run_bzr('branch', 'parent', 'child')
 
283
        print >> file('child/file2', 'wb'), 'hello'
 
284
        self.run_bzr('commit', '-m', 'branch 1', 'child')
 
285
        os.chdir('parent')
 
286
        self.run_bzr('merge', '../child')
 
287
        self.run_bzr('commit', '-m', 'merge child branch')
 
288
        
 
289
        log = self.run_bzr('log', 'file1')[0]
 
290
        self.assertContainsRe(log, 'revno: 1\n')
 
291
        self.assertNotContainsRe(log, 'revno: 2\n')
 
292
        self.assertNotContainsRe(log, 'revno: 3\n')
 
293
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
 
294
        self.assertNotContainsRe(log, 'revno: 4\n')
 
295
        log = self.run_bzr('log', 'file2')[0]
 
296
        self.assertNotContainsRe(log, 'revno: 1\n')
 
297
        self.assertContainsRe(log, 'revno: 2\n')
 
298
        self.assertNotContainsRe(log, 'revno: 3\n')
 
299
        self.assertContainsRe(log, 'revno: 3.1.1\n')
 
300
        self.assertContainsRe(log, 'revno: 4\n')
 
301
        log = self.run_bzr('log', 'file3')[0]
 
302
        self.assertNotContainsRe(log, 'revno: 1\n')
 
303
        self.assertNotContainsRe(log, 'revno: 2\n')
 
304
        self.assertContainsRe(log, 'revno: 3\n')
 
305
        self.assertNotContainsRe(log, 'revno: 3.1.1\n')
 
306
        self.assertNotContainsRe(log, 'revno: 4\n')