~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Patch Queue Manager
  • Date: 2011-09-22 14:12:18 UTC
  • mfrom: (6155.3.1 jam)
  • Revision ID: pqm@pqm.ubuntu.com-20110922141218-86s4uu6nqvourw4f
(jameinel) Cleanup comments bzrlib/smart/__init__.py (John A Meinel)

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
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
 
 
32
 
from bzrlib.branch import Branch
33
 
from bzrlib.errors import BzrCommandError
34
 
from bzrlib.osutils import has_symlinks
35
 
from bzrlib.tests import TestCaseWithTransport
36
 
from bzrlib.annotate import annotate_file
37
 
 
38
 
 
39
 
class TestAnnotate(TestCaseWithTransport):
 
27
from bzrlib import (
 
28
    config,
 
29
    tests,
 
30
    )
 
31
 
 
32
from bzrlib.urlutils import joinpath
 
33
 
 
34
 
 
35
class TestAnnotate(tests.TestCaseWithTransport):
40
36
 
41
37
    def setUp(self):
42
38
        super(TestAnnotate, self).setUp()
45
41
        self.build_tree_contents([('hello.txt', 'my helicopter\n'),
46
42
                                  ('nomail.txt', 'nomail\n')])
47
43
        wt.add(['hello.txt'])
48
 
        wt.commit('add hello', committer='test@user')
 
44
        self.revision_id_1 = wt.commit('add hello',
 
45
                              committer='test@user',
 
46
                              timestamp=1165960000.00, timezone=0)
49
47
        wt.add(['nomail.txt'])
50
 
        wt.commit('add nomail', committer='no mail')
51
 
        file('hello.txt', 'ab').write('your helicopter')
52
 
        wt.commit('mod hello', committer='user@test')
 
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)
53
64
 
54
65
    def test_help_annotate(self):
55
66
        """Annotate command exists"""
56
 
        out, err = self.run_bzr_captured(['--no-plugins', 'annotate', '--help'])
 
67
        out, err = self.run_bzr('--no-plugins annotate --help')
57
68
 
58
69
    def test_annotate_cmd(self):
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
 
    3 user@te | your helicopter
64
 
''')
 
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)
65
116
 
66
117
    def test_no_mail(self):
67
 
        out, err = self.run_bzr_captured(['annotate', 'nomail.txt'])
68
 
        self.assertEquals(err, '')
69
 
        self.assertEqualDiff(out, '''\
70
 
    2 no mail | nomail
71
 
''')
 
118
        out, err = self.run_bzr('annotate nomail.txt')
 
119
        self.assertEqual('', err)
 
120
        self.assertEqualDiff('''\
 
121
2   no mail | nomail
 
122
''', out)
72
123
 
73
124
    def test_annotate_cmd_revision(self):
74
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 1'])
75
 
        self.assertEquals(err, '')
76
 
        self.assertEqualDiff(out, '''\
77
 
    1 test@us | my helicopter
78
 
''')
 
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)
79
130
 
80
131
    def test_annotate_cmd_revision3(self):
81
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 3'])
82
 
        self.assertEquals(err, '')
83
 
        self.assertEqualDiff(out, '''\
84
 
    1 test@us | my helicopter
85
 
    3 user@te | your helicopter
86
 
''')
 
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)
87
138
 
88
139
    def test_annotate_cmd_unknown_revision(self):
89
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 10'],
90
 
                                         retcode=3)
91
 
        self.assertEquals(out, '')
92
 
        self.assertContainsRe(err, 'has no revision 10')
 
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")
93
144
 
94
145
    def test_annotate_cmd_two_revisions(self):
95
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 1..2'],
96
 
                                         retcode=3)
97
 
        self.assertEquals(out, '')
98
 
        self.assertEquals(err, 'bzr: ERROR: bzr annotate --revision takes'
99
 
                               ' exactly 1 argument\n')
 
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(tests.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
        return tree
 
166
 
 
167
    def test_annotate_cmd_revspec_branch(self):
 
168
        tree = self._setup_edited_file('trunk')
 
169
        tree.branch.create_checkout(self.get_url('work'), lightweight=True)
 
170
        out, err = self.run_bzr(['annotate', 'file', '-r', 'branch:../trunk'],
 
171
                                working_dir='work')
 
172
        self.assertEqual('', err)
 
173
        self.assertEqual(
 
174
            '1   test@ho | foo\n'
 
175
            '            | gam\n',
 
176
            out)
 
177
 
 
178
    def test_annotate_edited_file(self):
 
179
        tree = self._setup_edited_file()
 
180
        tree.branch.get_config().set_user_option('email', 'current@host2')
 
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_no_default(self):
 
189
        # Ensure that when no username is available annotate still works.
 
190
        self.overrideEnv('EMAIL', None)
 
191
        self.overrideEnv('BZR_EMAIL', None)
 
192
        # Also, make sure that it's not inferred from mailname.
 
193
        self.overrideAttr(config, '_auto_user_id',
 
194
            lambda: (None, None))
 
195
        tree = self._setup_edited_file()
 
196
        out, err = self.run_bzr('annotate file')
 
197
        self.assertEqual(
 
198
            '1   test@ho | foo\n'
 
199
            '2?  local u | bar\n'
 
200
            '1   test@ho | gam\n',
 
201
            out)
 
202
 
 
203
    def test_annotate_edited_file_show_ids(self):
 
204
        tree = self._setup_edited_file()
 
205
        tree.branch.get_config().set_user_option('email', 'current@host2')
 
206
        out, err = self.run_bzr('annotate file --show-ids')
 
207
        self.assertEqual(
 
208
            '    rev1 | foo\n'
 
209
            'current: | bar\n'
 
210
            '    rev1 | gam\n',
 
211
            out)
 
212
 
 
213
    def _create_merged_file(self):
 
214
        """Create a file with a pending merge and local edit."""
 
215
        tree = self.make_branch_and_tree('.')
 
216
        self.build_tree_contents([('file', 'foo\ngam\n')])
 
217
        tree.add('file')
 
218
        tree.commit('add file', rev_id="rev1", committer="test@host")
 
219
        # right side
 
220
        self.build_tree_contents([('file', 'foo\nbar\ngam\n')])
 
221
        tree.commit("right", rev_id="rev1.1.1", committer="test@host")
 
222
        tree.pull(tree.branch, True, "rev1")
 
223
        # left side
 
224
        self.build_tree_contents([('file', 'foo\nbaz\ngam\n')])
 
225
        tree.commit("left", rev_id="rev2", committer="test@host")
 
226
        # merge
 
227
        tree.merge_from_branch(tree.branch, "rev1.1.1")
 
228
        # edit the file to be 'resolved' and have a further local edit
 
229
        self.build_tree_contents([('file', 'local\nfoo\nbar\nbaz\ngam\n')])
 
230
        return tree
 
231
 
 
232
    def test_annotated_edited_merged_file_revnos(self):
 
233
        wt = self._create_merged_file()
 
234
        out, err = self.run_bzr(['annotate', 'file'])
 
235
        email = config.extract_email_address(wt.branch.get_config().username())
 
236
        self.assertEqual(
 
237
            '3?    %-7s | local\n'
 
238
            '1     test@ho | foo\n'
 
239
            '1.1.1 test@ho | bar\n'
 
240
            '2     test@ho | baz\n'
 
241
            '1     test@ho | gam\n' % email[:7],
 
242
            out)
 
243
 
 
244
    def test_annotated_edited_merged_file_ids(self):
 
245
        self._create_merged_file()
 
246
        out, err = self.run_bzr(['annotate', 'file', '--show-ids'])
 
247
        self.assertEqual(
 
248
            'current: | local\n'
 
249
            '    rev1 | foo\n'
 
250
            'rev1.1.1 | bar\n'
 
251
            '    rev2 | baz\n'
 
252
            '    rev1 | gam\n',
 
253
            out)
 
254
 
 
255
    def test_annotate_empty_file(self):
 
256
        tree = self.make_branch_and_tree('.')
 
257
        self.build_tree_contents([('empty', '')])
 
258
        tree.add('empty')
 
259
        tree.commit('add empty file')
 
260
        out, err = self.run_bzr(['annotate', 'empty'])
 
261
        self.assertEqual('', out)
 
262
 
 
263
    def test_annotate_removed_file(self):
 
264
        tree = self.make_branch_and_tree('.')
 
265
        self.build_tree_contents([('empty', '')])
 
266
        tree.add('empty')
 
267
        tree.commit('add empty file')
 
268
        # delete the file.
 
269
        tree.remove('empty')
 
270
        tree.commit('remove empty file')
 
271
        out, err = self.run_bzr(['annotate', '-r1', 'empty'])
 
272
        self.assertEqual('', out)
 
273
 
 
274
    def test_annotate_empty_file_show_ids(self):
 
275
        tree = self.make_branch_and_tree('.')
 
276
        self.build_tree_contents([('empty', '')])
 
277
        tree.add('empty')
 
278
        tree.commit('add empty file')
 
279
        out, err = self.run_bzr(['annotate', '--show-ids', 'empty'])
 
280
        self.assertEqual('', out)
 
281
 
 
282
    def test_annotate_nonexistant_file(self):
 
283
        tree = self.make_branch_and_tree('.')
 
284
        self.build_tree(['file'])
 
285
        tree.add(['file'])
 
286
        tree.commit('add a file')
 
287
        out, err = self.run_bzr(['annotate', 'doesnotexist'], retcode=3)
 
288
        self.assertEqual('', out)
 
289
        self.assertEqual("bzr: ERROR: doesnotexist is not versioned.\n", err)
 
290
 
 
291
    def test_annotate_without_workingtree(self):
 
292
        tree = self.make_branch_and_tree('.')
 
293
        self.build_tree_contents([('empty', '')])
 
294
        tree.add('empty')
 
295
        tree.commit('add empty file')
 
296
        bzrdir = tree.branch.bzrdir
 
297
        bzrdir.destroy_workingtree()
 
298
        self.assertFalse(bzrdir.has_workingtree())
 
299
        out, err = self.run_bzr(['annotate', 'empty'])
 
300
        self.assertEqual('', out)
 
301
 
 
302
    def test_annotate_directory(self):
 
303
        """Test --directory option"""
 
304
        wt = self.make_branch_and_tree('a')
 
305
        self.build_tree_contents([('a/hello.txt', 'my helicopter\n')])
 
306
        wt.add(['hello.txt'])
 
307
        wt.commit('commit', committer='test@user')
 
308
        out, err = self.run_bzr(['annotate', '-d', 'a', 'hello.txt'])
 
309
        self.assertEqualDiff('1   test@us | my helicopter\n', out)