~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Max Bowsher
  • Date: 2010-10-31 14:31:17 UTC
  • mto: This revision was merged to the branch mainline in revision 5521.
  • Revision ID: maxb@f2s.com-20101031143117-57vrfu630yq8a3k2
Fix a slightly odd style of ConfigObj construction to match the prevailing style in bzrlib.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005 by Canonical Ltd
 
1
# Copyright (C) 2005-2010 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
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
 
18
18
 
19
19
"""Black-box tests for bzr.
20
20
 
21
21
These check that it behaves properly when it's invoked through the regular
22
 
command-line interface. This doesn't actually run a new interpreter but 
 
22
command-line interface. This doesn't actually run a new interpreter but
23
23
rather starts again from the run_bzr function.
24
24
"""
25
25
 
26
26
 
27
 
from cStringIO import StringIO
28
 
import os
29
 
import shutil
30
 
import sys
31
27
import os
32
28
 
33
29
from bzrlib.branch import Branch
34
 
from bzrlib.clone import copy_branch
35
 
from bzrlib.errors import BzrCommandError
36
 
from bzrlib.osutils import has_symlinks
37
 
from bzrlib.tests import TestCaseInTempDir, BzrTestBase
38
 
from bzrlib.annotate import annotate_file
39
 
 
40
 
 
41
 
class TestAnnotate(TestCaseInTempDir):
 
30
from bzrlib.config import extract_email_address
 
31
from bzrlib.tests import TestCaseWithTransport
 
32
from bzrlib.urlutils import joinpath
 
33
 
 
34
 
 
35
class TestAnnotate(TestCaseWithTransport):
 
36
 
42
37
    def setUp(self):
43
38
        super(TestAnnotate, self).setUp()
44
 
        b = Branch.initialize(u'.')
 
39
        wt = self.make_branch_and_tree('.')
 
40
        b = wt.branch
45
41
        self.build_tree_contents([('hello.txt', 'my helicopter\n'),
46
42
                                  ('nomail.txt', 'nomail\n')])
47
 
        b.working_tree().add(['hello.txt'])
48
 
        b.working_tree().commit('add hello', 
49
 
                                committer='test@user')
50
 
        b.working_tree().add(['nomail.txt'])
51
 
        b.working_tree().commit('add nomail', committer='no mail')
 
43
        wt.add(['hello.txt'])
 
44
        self.revision_id_1 = wt.commit('add hello',
 
45
                              committer='test@user',
 
46
                              timestamp=1165960000.00, timezone=0)
 
47
        wt.add(['nomail.txt'])
 
48
        self.revision_id_2 = wt.commit('add nomail',
 
49
                              committer='no mail',
 
50
                              timestamp=1165970000.00, timezone=0)
 
51
        self.build_tree_contents([('hello.txt', 'my helicopter\n'
 
52
                                                'your helicopter\n')])
 
53
        self.revision_id_3 = wt.commit('mod hello',
 
54
                              committer='user@test',
 
55
                              timestamp=1166040000.00, timezone=0)
 
56
        self.build_tree_contents([('hello.txt', 'my helicopter\n'
 
57
                                                'your helicopter\n'
 
58
                                                'all of\n'
 
59
                                                'our helicopters\n'
 
60
                                  )])
 
61
        self.revision_id_4 = wt.commit('mod hello',
 
62
                              committer='user@test',
 
63
                              timestamp=1166050000.00, timezone=0)
52
64
 
53
65
    def test_help_annotate(self):
54
66
        """Annotate command exists"""
55
 
        out, err = self.run_bzr_captured(['--no-plugins', 'annotate', '--help'])
 
67
        out, err = self.run_bzr('--no-plugins annotate --help')
56
68
 
57
69
    def test_annotate_cmd(self):
58
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt'])
59
 
        self.assertEquals(err, '')
60
 
        self.assertEqualDiff(out, '''\
61
 
    1 test@us | my helicopter
62
 
''')
 
70
        out, err = self.run_bzr('annotate hello.txt')
 
71
        self.assertEqual('', err)
 
72
        self.assertEqualDiff('''\
 
73
1   test@us | my helicopter
 
74
3   user@te | your helicopter
 
75
4   user@te | all of
 
76
            | our helicopters
 
77
''', out)
 
78
 
 
79
    def test_annotate_cmd_full(self):
 
80
        out, err = self.run_bzr('annotate hello.txt --all')
 
81
        self.assertEqual('', err)
 
82
        self.assertEqualDiff('''\
 
83
1   test@us | my helicopter
 
84
3   user@te | your helicopter
 
85
4   user@te | all of
 
86
4   user@te | our helicopters
 
87
''', out)
 
88
 
 
89
    def test_annotate_cmd_long(self):
 
90
        out, err = self.run_bzr('annotate hello.txt --long')
 
91
        self.assertEqual('', err)
 
92
        self.assertEqualDiff('''\
 
93
1   test@user 20061212 | my helicopter
 
94
3   user@test 20061213 | your helicopter
 
95
4   user@test 20061213 | all of
 
96
                       | our helicopters
 
97
''', out)
 
98
 
 
99
    def test_annotate_cmd_show_ids(self):
 
100
        out, err = self.run_bzr('annotate hello.txt --show-ids')
 
101
        max_len = max([len(self.revision_id_1),
 
102
                       len(self.revision_id_3),
 
103
                       len(self.revision_id_4)])
 
104
        self.assertEqual('', err)
 
105
        self.assertEqualDiff('''\
 
106
%*s | my helicopter
 
107
%*s | your helicopter
 
108
%*s | all of
 
109
%*s | our helicopters
 
110
''' % (max_len, self.revision_id_1,
 
111
       max_len, self.revision_id_3,
 
112
       max_len, self.revision_id_4,
 
113
       max_len, '',
 
114
      )
 
115
, out)
63
116
 
64
117
    def test_no_mail(self):
65
 
        out, err = self.run_bzr_captured(['annotate', 'nomail.txt'])
66
 
        self.assertEquals(err, '')
67
 
        self.assertEqualDiff(out, '''\
68
 
    2 no mail | nomail
69
 
''')
 
118
        out, err = self.run_bzr('annotate nomail.txt')
 
119
        self.assertEqual('', err)
 
120
        self.assertEqualDiff('''\
 
121
2   no mail | nomail
 
122
''', out)
 
123
 
 
124
    def test_annotate_cmd_revision(self):
 
125
        out, err = self.run_bzr('annotate hello.txt -r1')
 
126
        self.assertEqual('', err)
 
127
        self.assertEqualDiff('''\
 
128
1   test@us | my helicopter
 
129
''', out)
 
130
 
 
131
    def test_annotate_cmd_revision3(self):
 
132
        out, err = self.run_bzr('annotate hello.txt -r3')
 
133
        self.assertEqual('', err)
 
134
        self.assertEqualDiff('''\
 
135
1   test@us | my helicopter
 
136
3   user@te | your helicopter
 
137
''', out)
 
138
 
 
139
    def test_annotate_cmd_unknown_revision(self):
 
140
        out, err = self.run_bzr('annotate hello.txt -r 10',
 
141
                                retcode=3)
 
142
        self.assertEqual('', out)
 
143
        self.assertContainsRe(err, "Requested revision: '10' does not exist")
 
144
 
 
145
    def test_annotate_cmd_two_revisions(self):
 
146
        out, err = self.run_bzr('annotate hello.txt -r1..2',
 
147
                                retcode=3)
 
148
        self.assertEqual('', out)
 
149
        self.assertEqual('bzr: ERROR: bzr annotate --revision takes'
 
150
                         ' exactly one revision identifier\n',
 
151
                         err)
 
152
 
 
153
 
 
154
class TestSimpleAnnotate(TestCaseWithTransport):
 
155
    """Annotate tests with no complex setup."""
 
156
 
 
157
    def _setup_edited_file(self, relpath='.'):
 
158
        """Create a tree with a locally edited file."""
 
159
        tree = self.make_branch_and_tree(relpath)
 
160
        file_relpath = joinpath(relpath, 'file')
 
161
        self.build_tree_contents([(file_relpath, 'foo\ngam\n')])
 
162
        tree.add('file')
 
163
        tree.commit('add file', committer="test@host", rev_id="rev1")
 
164
        self.build_tree_contents([(file_relpath, 'foo\nbar\ngam\n')])
 
165
        tree.branch.get_config().set_user_option('email', 'current@host2')
 
166
        return tree
 
167
 
 
168
    def test_annotate_cmd_revspec_branch(self):
 
169
        tree = self._setup_edited_file('trunk')
 
170
        tree.branch.create_checkout(self.get_url('work'), lightweight=True)
 
171
        os.chdir('work')
 
172
        out, err = self.run_bzr('annotate file -r branch:../trunk')
 
173
        self.assertEqual('', err)
 
174
        self.assertEqual(
 
175
            '1   test@ho | foo\n'
 
176
            '            | gam\n',
 
177
            out)
 
178
 
 
179
    def test_annotate_edited_file(self):
 
180
        tree = self._setup_edited_file()
 
181
        out, err = self.run_bzr('annotate file')
 
182
        self.assertEqual(
 
183
            '1   test@ho | foo\n'
 
184
            '2?  current | bar\n'
 
185
            '1   test@ho | gam\n',
 
186
            out)
 
187
 
 
188
    def test_annotate_edited_file_show_ids(self):
 
189
        tree = self._setup_edited_file()
 
190
        out, err = self.run_bzr('annotate file --show-ids')
 
191
        self.assertEqual(
 
192
            '    rev1 | foo\n'
 
193
            'current: | bar\n'
 
194
            '    rev1 | gam\n',
 
195
            out)
 
196
 
 
197
    def _create_merged_file(self):
 
198
        """Create a file with a pending merge and local edit."""
 
199
        tree = self.make_branch_and_tree('.')
 
200
        self.build_tree_contents([('file', 'foo\ngam\n')])
 
201
        tree.add('file')
 
202
        tree.commit('add file', rev_id="rev1", committer="test@host")
 
203
        # right side
 
204
        self.build_tree_contents([('file', 'foo\nbar\ngam\n')])
 
205
        tree.commit("right", rev_id="rev1.1.1", committer="test@host")
 
206
        tree.pull(tree.branch, True, "rev1")
 
207
        # left side
 
208
        self.build_tree_contents([('file', 'foo\nbaz\ngam\n')])
 
209
        tree.commit("left", rev_id="rev2", committer="test@host")
 
210
        # merge
 
211
        tree.merge_from_branch(tree.branch, "rev1.1.1")
 
212
        # edit the file to be 'resolved' and have a further local edit
 
213
        self.build_tree_contents([('file', 'local\nfoo\nbar\nbaz\ngam\n')])
 
214
 
 
215
    def test_annotated_edited_merged_file_revnos(self):
 
216
        self._create_merged_file()
 
217
        out, err = self.run_bzr('annotate file')
 
218
        email = extract_email_address(Branch.open('.').get_config().username())
 
219
        self.assertEqual(
 
220
            '3?    %-7s | local\n'
 
221
            '1     test@ho | foo\n'
 
222
            '1.1.1 test@ho | bar\n'
 
223
            '2     test@ho | baz\n'
 
224
            '1     test@ho | gam\n' % email[:7],
 
225
            out)
 
226
 
 
227
    def test_annotated_edited_merged_file_ids(self):
 
228
        self._create_merged_file()
 
229
        out, err = self.run_bzr('annotate file --show-ids')
 
230
        self.assertEqual(
 
231
            'current: | local\n'
 
232
            '    rev1 | foo\n'
 
233
            'rev1.1.1 | bar\n'
 
234
            '    rev2 | baz\n'
 
235
            '    rev1 | gam\n',
 
236
            out)
 
237
 
 
238
    def test_annotate_empty_file(self):
 
239
        tree = self.make_branch_and_tree('tree')
 
240
        self.build_tree_contents([('tree/empty', '')])
 
241
        tree.add('empty')
 
242
        tree.commit('add empty file')
 
243
 
 
244
        os.chdir('tree')
 
245
        out, err = self.run_bzr('annotate empty')
 
246
        self.assertEqual('', out)
 
247
 
 
248
    def test_annotate_empty_file_show_ids(self):
 
249
        tree = self.make_branch_and_tree('tree')
 
250
        self.build_tree_contents([('tree/empty', '')])
 
251
        tree.add('empty')
 
252
        tree.commit('add empty file')
 
253
 
 
254
        os.chdir('tree')
 
255
        out, err = self.run_bzr(['annotate', '--show-ids', 'empty'])
 
256
        self.assertEqual('', out)
 
257
 
 
258
    def test_annotate_nonexistant_file(self):
 
259
        tree = self.make_branch_and_tree('tree')
 
260
        self.build_tree(['tree/file'])
 
261
        tree.add(['file'])
 
262
        tree.commit('add a file')
 
263
 
 
264
        os.chdir('tree')
 
265
        out, err = self.run_bzr("annotate doesnotexist", retcode=3)
 
266
        self.assertEqual('', out)
 
267
        self.assertEqual("bzr: ERROR: doesnotexist is not versioned.\n", err)
 
268
 
 
269
    def test_annotate_without_workingtree(self):
 
270
        tree = self.make_branch_and_tree('branch')
 
271
        self.build_tree_contents([('branch/empty', '')])
 
272
        tree.add('empty')
 
273
        tree.commit('add empty file')
 
274
        bzrdir = tree.branch.bzrdir
 
275
        bzrdir.destroy_workingtree()
 
276
        self.assertFalse(bzrdir.has_workingtree())
 
277
 
 
278
        os.chdir('branch')
 
279
        out, err = self.run_bzr('annotate empty')
 
280
        self.assertEqual('', out)
 
281
 
 
282
    def test_annotate_directory(self):
 
283
        """Test --directory option"""
 
284
        wt = self.make_branch_and_tree('a')
 
285
        self.build_tree_contents([('a/hello.txt', 'my helicopter\n')])
 
286
        wt.add(['hello.txt'])
 
287
        wt.commit('commit', committer='test@user')
 
288
        out, err = self.run_bzr('annotate -d a hello.txt')
 
289
        self.assertEqualDiff('1   test@us | my helicopter\n', out)