~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
27
import os
28
3603.4.5 by Robert Collins
Fix test failure on PQM.
29
from bzrlib.branch import Branch
30
from bzrlib.config import extract_email_address
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
31
from bzrlib.tests import TestCaseWithTransport
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
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
35
class TestAnnotate(TestCaseWithTransport):
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
154
class TestSimpleAnnotate(TestCaseWithTransport):
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')])
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
165
        tree.branch.get_config().set_user_option('email', 'current@host2')
4634.120.5 by Andrew Bennetts
Add test.
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)
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
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(
3603.4.3 by Robert Collins
Review feedback.
192
            '    rev1 | foo\n'
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
193
            'current: | bar\n'
3603.4.3 by Robert Collins
Review feedback.
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')
3603.4.5 by Robert Collins
Fix test failure on PQM.
218
        email = extract_email_address(Branch.open('.').get_config().username())
3603.4.3 by Robert Collins
Review feedback.
219
        self.assertEqual(
3603.4.5 by Robert Collins
Fix test failure on PQM.
220
            '3?    %-7s | local\n'
3603.4.3 by Robert Collins
Review feedback.
221
            '1     test@ho | foo\n'
222
            '1.1.1 test@ho | bar\n'
223
            '2     test@ho | baz\n'
3603.4.5 by Robert Collins
Fix test failure on PQM.
224
            '1     test@ho | gam\n' % email[:7],
3603.4.3 by Robert Collins
Review feedback.
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',
3603.4.1 by Robert Collins
Implement lookups into the current working tree for bzr annotate, fixing bug 3439.
236
            out)
237
2027.3.1 by John Arbash Meinel
'bzr annotate' shouldn't fail on an empty file: fix bug #56814
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')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
245
        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
246
        self.assertEqual('', out)
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
247
3960.1.1 by Vincent Ladeuil
Fix bug #314525: don't try to put ids if there is no annotation.
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
2561.2.1 by James Westby
Display a useful error message when annotating a non-existant file (#122656)
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)
2745.3.2 by Daniel Watkins
Updated tests to reflect new error text.
267
        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.
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)
5171.3.7 by Martin von Gagern
Added blackbox tests for --directory option.
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)