~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: John Arbash Meinel
  • Date: 2009-10-02 20:32:50 UTC
  • mto: (4679.6.1 2.1-export-c-api)
  • mto: This revision was merged to the branch mainline in revision 4735.
  • Revision ID: john@arbash-meinel.com-20091002203250-q6iv6o2mwjqp4g53
Add __iter__ support.

Show diffs side-by-side

added added

removed removed

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