~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Jonathan Riddell
  • Date: 2011-05-16 11:27:37 UTC
  • mto: This revision was merged to the branch mainline in revision 5869.
  • Revision ID: jriddell@canonical.com-20110516112737-gep642p24rtzp3jt
userĀ guideĀ licence

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