~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_annotate.py

Better readv coalescing, now with test, and progress during knit index reading.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 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
24
24
"""
25
25
 
26
26
 
 
27
from cStringIO import StringIO
 
28
import os
 
29
import shutil
 
30
import sys
27
31
import os
28
32
 
29
33
from bzrlib.branch import Branch
30
 
from bzrlib.config import extract_email_address
 
34
from bzrlib.errors import BzrCommandError
 
35
from bzrlib.osutils import has_symlinks
31
36
from bzrlib.tests import TestCaseWithTransport
 
37
from bzrlib.annotate import annotate_file
32
38
 
33
39
 
34
40
class TestAnnotate(TestCaseWithTransport):
40
46
        self.build_tree_contents([('hello.txt', 'my helicopter\n'),
41
47
                                  ('nomail.txt', 'nomail\n')])
42
48
        wt.add(['hello.txt'])
43
 
        self.revision_id_1 = wt.commit('add hello',
44
 
                              committer='test@user',
45
 
                              timestamp=1165960000.00, timezone=0)
 
49
        wt.commit('add hello', 
 
50
                                committer='test@user')
46
51
        wt.add(['nomail.txt'])
47
 
        self.revision_id_2 = wt.commit('add nomail',
48
 
                              committer='no mail',
49
 
                              timestamp=1165970000.00, timezone=0)
50
 
        self.build_tree_contents([('hello.txt', 'my helicopter\n'
51
 
                                                'your helicopter\n')])
52
 
        self.revision_id_3 = wt.commit('mod hello',
53
 
                              committer='user@test',
54
 
                              timestamp=1166040000.00, timezone=0)
55
 
        self.build_tree_contents([('hello.txt', 'my helicopter\n'
56
 
                                                'your helicopter\n'
57
 
                                                'all of\n'
58
 
                                                'our helicopters\n'
59
 
                                  )])
60
 
        self.revision_id_4 = wt.commit('mod hello',
61
 
                              committer='user@test',
62
 
                              timestamp=1166050000.00, timezone=0)
 
52
        wt.commit('add nomail', committer='no mail')
63
53
 
64
54
    def test_help_annotate(self):
65
55
        """Annotate command exists"""
66
 
        out, err = self.run_bzr('--no-plugins annotate --help')
 
56
        out, err = self.run_bzr_captured(['--no-plugins', 'annotate', '--help'])
67
57
 
68
58
    def test_annotate_cmd(self):
69
 
        out, err = self.run_bzr('annotate hello.txt')
70
 
        self.assertEqual('', err)
71
 
        self.assertEqualDiff('''\
72
 
1   test@us | my helicopter
73
 
3   user@te | your helicopter
74
 
4   user@te | all of
75
 
            | our helicopters
76
 
''', out)
77
 
 
78
 
    def test_annotate_cmd_full(self):
79
 
        out, err = self.run_bzr('annotate hello.txt --all')
80
 
        self.assertEqual('', err)
81
 
        self.assertEqualDiff('''\
82
 
1   test@us | my helicopter
83
 
3   user@te | your helicopter
84
 
4   user@te | all of
85
 
4   user@te | our helicopters
86
 
''', out)
87
 
 
88
 
    def test_annotate_cmd_long(self):
89
 
        out, err = self.run_bzr('annotate hello.txt --long')
90
 
        self.assertEqual('', err)
91
 
        self.assertEqualDiff('''\
92
 
1   test@user 20061212 | my helicopter
93
 
3   user@test 20061213 | your helicopter
94
 
4   user@test 20061213 | all of
95
 
                       | our helicopters
96
 
''', out)
97
 
 
98
 
    def test_annotate_cmd_show_ids(self):
99
 
        out, err = self.run_bzr('annotate hello.txt --show-ids')
100
 
        max_len = max([len(self.revision_id_1),
101
 
                       len(self.revision_id_3),
102
 
                       len(self.revision_id_4)])
103
 
        self.assertEqual('', err)
104
 
        self.assertEqualDiff('''\
105
 
%*s | my helicopter
106
 
%*s | your helicopter
107
 
%*s | all of
108
 
%*s | our helicopters
109
 
''' % (max_len, self.revision_id_1,
110
 
       max_len, self.revision_id_3,
111
 
       max_len, self.revision_id_4,
112
 
       max_len, '',
113
 
      )
114
 
, out)
 
59
        out, err = self.run_bzr_captured(['annotate', 'hello.txt'])
 
60
        self.assertEquals(err, '')
 
61
        self.assertEqualDiff(out, '''\
 
62
    1 test@us | my helicopter
 
63
''')
115
64
 
116
65
    def test_no_mail(self):
117
 
        out, err = self.run_bzr('annotate nomail.txt')
118
 
        self.assertEqual('', err)
119
 
        self.assertEqualDiff('''\
120
 
2   no mail | nomail
121
 
''', out)
122
 
 
123
 
    def test_annotate_cmd_revision(self):
124
 
        out, err = self.run_bzr('annotate hello.txt -r1')
125
 
        self.assertEqual('', err)
126
 
        self.assertEqualDiff('''\
127
 
1   test@us | my helicopter
128
 
''', out)
129
 
 
130
 
    def test_annotate_cmd_revision3(self):
131
 
        out, err = self.run_bzr('annotate hello.txt -r3')
132
 
        self.assertEqual('', err)
133
 
        self.assertEqualDiff('''\
134
 
1   test@us | my helicopter
135
 
3   user@te | your helicopter
136
 
''', out)
137
 
 
138
 
    def test_annotate_cmd_unknown_revision(self):
139
 
        out, err = self.run_bzr('annotate hello.txt -r 10',
140
 
                                retcode=3)
141
 
        self.assertEqual('', out)
142
 
        self.assertContainsRe(err, 'Requested revision: \'10\' does not exist')
143
 
 
144
 
    def test_annotate_cmd_two_revisions(self):
145
 
        out, err = self.run_bzr('annotate hello.txt -r1..2',
146
 
                                retcode=3)
147
 
        self.assertEqual('', out)
148
 
        self.assertEqual('bzr: ERROR: bzr annotate --revision takes'
149
 
                         ' exactly one revision identifier\n',
150
 
                         err)
151
 
 
152
 
 
153
 
class TestSimpleAnnotate(TestCaseWithTransport):
154
 
    """Annotate tests with no complex setup."""
155
 
 
156
 
    def _setup_edited_file(self):
157
 
        """Create a tree with a locally edited file."""
158
 
        tree = self.make_branch_and_tree('.')
159
 
        self.build_tree_contents([('file', 'foo\ngam\n')])
160
 
        tree.add('file')
161
 
        tree.commit('add file', committer="test@host", rev_id="rev1")
162
 
        self.build_tree_contents([('file', 'foo\nbar\ngam\n')])
163
 
        tree.branch.get_config().set_user_option('email', 'current@host2')
164
 
 
165
 
    def test_annotate_edited_file(self):
166
 
        tree = self._setup_edited_file()
167
 
        out, err = self.run_bzr('annotate file')
168
 
        self.assertEqual(
169
 
            '1   test@ho | foo\n'
170
 
            '2?  current | bar\n'
171
 
            '1   test@ho | gam\n',
172
 
            out)
173
 
 
174
 
    def test_annotate_edited_file_show_ids(self):
175
 
        tree = self._setup_edited_file()
176
 
        out, err = self.run_bzr('annotate file --show-ids')
177
 
        self.assertEqual(
178
 
            '    rev1 | foo\n'
179
 
            'current: | bar\n'
180
 
            '    rev1 | gam\n',
181
 
            out)
182
 
 
183
 
    def _create_merged_file(self):
184
 
        """Create a file with a pending merge and local edit."""
185
 
        tree = self.make_branch_and_tree('.')
186
 
        self.build_tree_contents([('file', 'foo\ngam\n')])
187
 
        tree.add('file')
188
 
        tree.commit('add file', rev_id="rev1", committer="test@host")
189
 
        # right side
190
 
        self.build_tree_contents([('file', 'foo\nbar\ngam\n')])
191
 
        tree.commit("right", rev_id="rev1.1.1", committer="test@host")
192
 
        tree.pull(tree.branch, True, "rev1")
193
 
        # left side
194
 
        self.build_tree_contents([('file', 'foo\nbaz\ngam\n')])
195
 
        tree.commit("left", rev_id="rev2", committer="test@host")
196
 
        # merge
197
 
        tree.merge_from_branch(tree.branch, "rev1.1.1")
198
 
        # edit the file to be 'resolved' and have a further local edit
199
 
        self.build_tree_contents([('file', 'local\nfoo\nbar\nbaz\ngam\n')])
200
 
 
201
 
    def test_annotated_edited_merged_file_revnos(self):
202
 
        self._create_merged_file()
203
 
        out, err = self.run_bzr('annotate file')
204
 
        email = extract_email_address(Branch.open('.').get_config().username())
205
 
        self.assertEqual(
206
 
            '3?    %-7s | local\n'
207
 
            '1     test@ho | foo\n'
208
 
            '1.1.1 test@ho | bar\n'
209
 
            '2     test@ho | baz\n'
210
 
            '1     test@ho | gam\n' % email[:7],
211
 
            out)
212
 
 
213
 
    def test_annotated_edited_merged_file_ids(self):
214
 
        self._create_merged_file()
215
 
        out, err = self.run_bzr('annotate file --show-ids')
216
 
        self.assertEqual(
217
 
            'current: | local\n'
218
 
            '    rev1 | foo\n'
219
 
            'rev1.1.1 | bar\n'
220
 
            '    rev2 | baz\n'
221
 
            '    rev1 | gam\n',
222
 
            out)
223
 
 
224
 
    def test_annotate_empty_file(self):
225
 
        tree = self.make_branch_and_tree('tree')
226
 
        self.build_tree_contents([('tree/empty', '')])
227
 
        tree.add('empty')
228
 
        tree.commit('add empty file')
229
 
 
230
 
        os.chdir('tree')
231
 
        out, err = self.run_bzr('annotate empty')
232
 
        self.assertEqual('', out)
233
 
 
234
 
    def test_annotate_nonexistant_file(self):
235
 
        tree = self.make_branch_and_tree('tree')
236
 
        self.build_tree(['tree/file'])
237
 
        tree.add(['file'])
238
 
        tree.commit('add a file')
239
 
 
240
 
        os.chdir('tree')
241
 
        out, err = self.run_bzr("annotate doesnotexist", retcode=3)
242
 
        self.assertEqual('', out)
243
 
        self.assertEqual("bzr: ERROR: doesnotexist is not versioned.\n", err)
244
 
 
245
 
    def test_annotate_without_workingtree(self):
246
 
        tree = self.make_branch_and_tree('branch')
247
 
        self.build_tree_contents([('branch/empty', '')])
248
 
        tree.add('empty')
249
 
        tree.commit('add empty file')
250
 
        bzrdir = tree.branch.bzrdir
251
 
        bzrdir.destroy_workingtree()
252
 
        self.assertFalse(bzrdir.has_workingtree())
253
 
 
254
 
        os.chdir('branch')
255
 
        out, err = self.run_bzr('annotate empty')
256
 
        self.assertEqual('', out)
 
66
        out, err = self.run_bzr_captured(['annotate', 'nomail.txt'])
 
67
        self.assertEquals(err, '')
 
68
        self.assertEqualDiff(out, '''\
 
69
    2 no mail | nomail
 
70
''')