~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005-2010 Canonical Ltd
1185.16.32 by Martin Pool
- add a basic annotate built-in command
2
# -*- coding: utf-8 -*-
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
3
#
1185.16.32 by Martin Pool
- add a basic annotate built-in command
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
8
#
1185.16.32 by Martin Pool
- add a basic annotate built-in command
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
13
#
1185.16.32 by Martin Pool
- add a basic annotate built-in command
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.16.32 by Martin Pool
- add a basic annotate built-in command
17
18
19
"""Black-box tests for bzr.
20
21
These check that it behaves properly when it's invoked through the regular
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
22
command-line interface. This doesn't actually run a new interpreter but
1185.16.32 by Martin Pool
- add a basic annotate built-in command
23
rather starts again from the run_bzr function.
24
"""
25
26
5967.2.2 by Jelmer Vernooij
add test
27
from bzrlib import (
28
    config,
29
    tests,
30
    )
1185.16.32 by Martin Pool
- add a basic annotate built-in command
31
4634.120.5 by Andrew Bennetts
Add test.
32
from bzrlib.urlutils import joinpath
1185.16.32 by Martin Pool
- add a basic annotate built-in command
33
34
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
35
class TestAnnotate(tests.TestCaseWithTransport):
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
36
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
37
    def setUp(self):
38
        super(TestAnnotate, self).setUp()
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
39
        wt = self.make_branch_and_tree('.')
40
        b = wt.branch
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
41
        self.build_tree_contents([('hello.txt', 'my helicopter\n'),
42
                                  ('nomail.txt', 'nomail\n')])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
43
        wt.add(['hello.txt'])
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
44
        self.revision_id_1 = wt.commit('add hello',
2182.3.12 by John Arbash Meinel
Force the timezone properly during tests which look at dates.
45
                              committer='test@user',
46
                              timestamp=1165960000.00, timezone=0)
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
47
        wt.add(['nomail.txt'])
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
48
        self.revision_id_2 = wt.commit('add nomail',
2182.3.12 by John Arbash Meinel
Force the timezone properly during tests which look at dates.
49
                              committer='no mail',
50
                              timestamp=1165970000.00, timezone=0)
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
51
        self.build_tree_contents([('hello.txt', 'my helicopter\n'
52
                                                'your helicopter\n')])
53
        self.revision_id_3 = wt.commit('mod hello',
2182.3.12 by John Arbash Meinel
Force the timezone properly during tests which look at dates.
54
                              committer='user@test',
55
                              timestamp=1166040000.00, timezone=0)
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
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',
2182.3.12 by John Arbash Meinel
Force the timezone properly during tests which look at dates.
62
                              committer='user@test',
63
                              timestamp=1166050000.00, timezone=0)
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
64
1185.16.32 by Martin Pool
- add a basic annotate built-in command
65
    def test_help_annotate(self):
66
        """Annotate command exists"""
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
67
        out, err = self.run_bzr('--no-plugins annotate --help')
1185.16.53 by Martin Pool
- annotate improvements from Goffreddo, with extra bug fixes and tests
68
69
    def test_annotate_cmd(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
70
        out, err = self.run_bzr('annotate hello.txt')
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
71
        self.assertEqual('', err)
72
        self.assertEqualDiff('''\
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
73
1   test@us | my helicopter
74
3   user@te | your helicopter
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
75
4   user@te | all of
76
            | our helicopters
77
''', out)
78
79
    def test_annotate_cmd_full(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
80
        out, err = self.run_bzr('annotate hello.txt --all')
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
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):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
90
        out, err = self.run_bzr('annotate hello.txt --long')
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
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):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
100
        out, err = self.run_bzr('annotate hello.txt --show-ids')
2182.3.7 by John Arbash Meinel
Cleanup and add blackbox tests for annotate.
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)
1185.33.31 by Martin Pool
Make annotate cope better with revisions committed without a valid
116
117
    def test_no_mail(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
118
        out, err = self.run_bzr('annotate nomail.txt')
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
119
        self.assertEqual('', err)
120
        self.assertEqualDiff('''\
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
121
2   no mail | nomail
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
122
''', out)
1694.2.6 by Martin Pool
[merge] bzr.dev
123
124
    def test_annotate_cmd_revision(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
125
        out, err = self.run_bzr('annotate hello.txt -r1')
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
126
        self.assertEqual('', err)
127
        self.assertEqualDiff('''\
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
128
1   test@us | my helicopter
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
129
''', out)
1694.2.6 by Martin Pool
[merge] bzr.dev
130
1558.14.6 by Aaron Bentley
Added annotate test
131
    def test_annotate_cmd_revision3(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
132
        out, err = self.run_bzr('annotate hello.txt -r3')
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
133
        self.assertEqual('', err)
134
        self.assertEqualDiff('''\
2182.3.3 by John Arbash Meinel
Add tests for annotate with dotted revnos.
135
1   test@us | my helicopter
136
3   user@te | your helicopter
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
137
''', out)
1558.14.6 by Aaron Bentley
Added annotate test
138
1694.2.6 by Martin Pool
[merge] bzr.dev
139
    def test_annotate_cmd_unknown_revision(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
140
        out, err = self.run_bzr('annotate hello.txt -r 10',
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
141
                                retcode=3)
142
        self.assertEqual('', out)
5105.1.4 by Vincent Ladeuil
Use single quotes so that no test need to be updated.
143
        self.assertContainsRe(err, "Requested revision: '10' does not exist")
1694.2.6 by Martin Pool
[merge] bzr.dev
144
145
    def test_annotate_cmd_two_revisions(self):
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
146
        out, err = self.run_bzr('annotate hello.txt -r1..2',
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
147
                                retcode=3)
148
        self.assertEqual('', out)
149
        self.assertEqual('bzr: ERROR: bzr annotate --revision takes'
3655.3.1 by Lukáš Lalinský
Fix `bzr st -rbranch:PATH_TO_BRANCH`
150
                         ' exactly one revision identifier\n',
2182.3.6 by John Arbash Meinel
Cleanup annotate blackbox tests
151
                         err)
2027.3.1 by John Arbash Meinel
'bzr annotate' shouldn't fail on an empty file: fix bug #56814
152
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
153
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
154
class TestSimpleAnnotate(tests.TestCaseWithTransport):
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
155
    """Annotate tests with no complex setup."""
156
4634.120.5 by Andrew Bennetts
Add test.
157
    def _setup_edited_file(self, relpath='.'):
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
158
        """Create a tree with a locally edited file."""
4634.120.5 by Andrew Bennetts
Add test.
159
        tree = self.make_branch_and_tree(relpath)
160
        file_relpath = joinpath(relpath, 'file')
161
        self.build_tree_contents([(file_relpath, 'foo\ngam\n')])
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
162
        tree.add('file')
3603.4.3 by Robert Collins
Review feedback.
163
        tree.commit('add file', committer="test@host", rev_id="rev1")
4634.120.5 by Andrew Bennetts
Add test.
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)
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
170
        out, err = self.run_bzr(['annotate', 'file', '-r', 'branch:../trunk'],
171
                                working_dir='work')
4634.120.5 by Andrew Bennetts
Add test.
172
        self.assertEqual('', err)
173
        self.assertEqual(
174
            '1   test@ho | foo\n'
175
            '            | gam\n',
176
            out)
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
177
178
    def test_annotate_edited_file(self):
179
        tree = self._setup_edited_file()
5967.2.2 by Jelmer Vernooij
add test
180
        tree.branch.get_config().set_user_option('email', 'current@host2')
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
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
5967.2.2 by Jelmer Vernooij
add test
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
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
203
    def test_annotate_edited_file_show_ids(self):
204
        tree = self._setup_edited_file()
5967.2.2 by Jelmer Vernooij
add test
205
        tree.branch.get_config().set_user_option('email', 'current@host2')
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
206
        out, err = self.run_bzr('annotate file --show-ids')
207
        self.assertEqual(
3603.4.3 by Robert Collins
Review feedback.
208
            '    rev1 | foo\n'
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
209
            'current: | bar\n'
3603.4.3 by Robert Collins
Review feedback.
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')])
5638.2.4 by Vincent Ladeuil
Delete one more import.
230
        return tree
3603.4.3 by Robert Collins
Review feedback.
231
232
    def test_annotated_edited_merged_file_revnos(self):
5638.2.4 by Vincent Ladeuil
Delete one more import.
233
        wt = self._create_merged_file()
234
        out, err = self.run_bzr(['annotate', 'file'])
5967.2.2 by Jelmer Vernooij
add test
235
        email = config.extract_email_address(wt.branch.get_config().username())
3603.4.3 by Robert Collins
Review feedback.
236
        self.assertEqual(
3603.4.5 by Robert Collins
Fix test failure on PQM.
237
            '3?    %-7s | local\n'
3603.4.3 by Robert Collins
Review feedback.
238
            '1     test@ho | foo\n'
239
            '1.1.1 test@ho | bar\n'
240
            '2     test@ho | baz\n'
3603.4.5 by Robert Collins
Fix test failure on PQM.
241
            '1     test@ho | gam\n' % email[:7],
3603.4.3 by Robert Collins
Review feedback.
242
            out)
243
244
    def test_annotated_edited_merged_file_ids(self):
245
        self._create_merged_file()
5638.2.4 by Vincent Ladeuil
Delete one more import.
246
        out, err = self.run_bzr(['annotate', 'file', '--show-ids'])
3603.4.3 by Robert Collins
Review feedback.
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',
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
253
            out)
254
2027.3.1 by John Arbash Meinel
'bzr annotate' shouldn't fail on an empty file: fix bug #56814
255
    def test_annotate_empty_file(self):
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
256
        tree = self.make_branch_and_tree('.')
257
        self.build_tree_contents([('empty', '')])
2027.3.1 by John Arbash Meinel
'bzr annotate' shouldn't fail on an empty file: fix bug #56814
258
        tree.add('empty')
259
        tree.commit('add empty file')
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
260
        out, err = self.run_bzr(['annotate', 'empty'])
2027.3.1 by John Arbash Meinel
'bzr annotate' shouldn't fail on an empty file: fix bug #56814
261
        self.assertEqual('', out)
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
262
5638.2.1 by Andrew King
Fix 537442 - cannot annotate deleted file
263
    def test_annotate_removed_file(self):
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
264
        tree = self.make_branch_and_tree('.')
265
        self.build_tree_contents([('empty', '')])
5638.2.1 by Andrew King
Fix 537442 - cannot annotate deleted file
266
        tree.add('empty')
267
        tree.commit('add empty file')
268
        # delete the file.
269
        tree.remove('empty')
270
        tree.commit('remove empty file')
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
271
        out, err = self.run_bzr(['annotate', '-r1', 'empty'])
5638.2.1 by Andrew King
Fix 537442 - cannot annotate deleted file
272
        self.assertEqual('', out)
273
3960.1.1 by Vincent Ladeuil
Fix bug #314525: don't try to put ids if there is no annotation.
274
    def test_annotate_empty_file_show_ids(self):
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
275
        tree = self.make_branch_and_tree('.')
276
        self.build_tree_contents([('empty', '')])
3960.1.1 by Vincent Ladeuil
Fix bug #314525: don't try to put ids if there is no annotation.
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
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
282
    def test_annotate_nonexistant_file(self):
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
283
        tree = self.make_branch_and_tree('.')
284
        self.build_tree(['file'])
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
285
        tree.add(['file'])
286
        tree.commit('add a file')
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
287
        out, err = self.run_bzr(['annotate', 'doesnotexist'], retcode=3)
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
288
        self.assertEqual('', out)
2745.3.2 by Daniel Watkins
Updated tests to reflect new error text.
289
        self.assertEqual("bzr: ERROR: doesnotexist is not versioned.\n", err)
3146.2.1 by Lukáš Lalinský
Don't require a working tree in cmd_annotate.
290
291
    def test_annotate_without_workingtree(self):
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
292
        tree = self.make_branch_and_tree('.')
293
        self.build_tree_contents([('empty', '')])
3146.2.1 by Lukáš Lalinský
Don't require a working tree in cmd_annotate.
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())
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
299
        out, err = self.run_bzr(['annotate', 'empty'])
3146.2.1 by Lukáš Lalinský
Don't require a working tree in cmd_annotate.
300
        self.assertEqual('', out)
5171.3.7 by Martin von Gagern
Added blackbox tests for --directory option.
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')
5638.2.3 by Vincent Ladeuil
Freshen up the tests to a more modern style.
308
        out, err = self.run_bzr(['annotate', '-d', 'a', 'hello.txt'])
5171.3.7 by Martin von Gagern
Added blackbox tests for --directory option.
309
        self.assertEqualDiff('1   test@us | my helicopter\n', out)