~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Ian Clatworthy
  • Date: 2009-01-19 02:24:15 UTC
  • mto: This revision was merged to the branch mainline in revision 3944.
  • Revision ID: ian.clatworthy@canonical.com-20090119022415-mo0mcfeiexfktgwt
apply jam's log --short fix (Ian Clatworthy)

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
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
8
 
 
 
8
#
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
12
# GNU General Public License for more details.
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
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
24
"""
25
25
 
26
26
 
27
 
from cStringIO import StringIO
28
 
import os
29
 
import shutil
30
 
import sys
31
27
import os
32
28
 
33
29
from bzrlib.branch import Branch
34
 
from bzrlib.errors import BzrCommandError
35
 
from bzrlib.osutils import has_symlinks
 
30
from bzrlib.config import extract_email_address
36
31
from bzrlib.tests import TestCaseWithTransport
37
 
from bzrlib.annotate import annotate_file
38
32
 
39
33
 
40
34
class TestAnnotate(TestCaseWithTransport):
46
40
        self.build_tree_contents([('hello.txt', 'my helicopter\n'),
47
41
                                  ('nomail.txt', 'nomail\n')])
48
42
        wt.add(['hello.txt'])
49
 
        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)
50
46
        wt.add(['nomail.txt'])
51
 
        wt.commit('add nomail', committer='no mail')
52
 
        file('hello.txt', 'ab').write('your helicopter')
53
 
        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)
54
63
 
55
64
    def test_help_annotate(self):
56
65
        """Annotate command exists"""
57
 
        out, err = self.run_bzr_captured(['--no-plugins', 'annotate', '--help'])
 
66
        out, err = self.run_bzr('--no-plugins annotate --help')
58
67
 
59
68
    def test_annotate_cmd(self):
60
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt'])
61
 
        self.assertEquals(err, '')
62
 
        self.assertEqualDiff(out, '''\
63
 
    1 test@us | my helicopter
64
 
    3 user@te | your helicopter
65
 
''')
 
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)
66
115
 
67
116
    def test_no_mail(self):
68
 
        out, err = self.run_bzr_captured(['annotate', 'nomail.txt'])
69
 
        self.assertEquals(err, '')
70
 
        self.assertEqualDiff(out, '''\
71
 
    2 no mail | nomail
72
 
''')
 
117
        out, err = self.run_bzr('annotate nomail.txt')
 
118
        self.assertEqual('', err)
 
119
        self.assertEqualDiff('''\
 
120
2   no mail | nomail
 
121
''', out)
73
122
 
74
123
    def test_annotate_cmd_revision(self):
75
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 1'])
76
 
        self.assertEquals(err, '')
77
 
        self.assertEqualDiff(out, '''\
78
 
    1 test@us | my helicopter
79
 
''')
 
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)
80
129
 
81
130
    def test_annotate_cmd_revision3(self):
82
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 3'])
83
 
        self.assertEquals(err, '')
84
 
        self.assertEqualDiff(out, '''\
85
 
    1 test@us | my helicopter
86
 
    3 user@te | your helicopter
87
 
''')
 
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)
88
137
 
89
138
    def test_annotate_cmd_unknown_revision(self):
90
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 10'],
91
 
                                         retcode=3)
92
 
        self.assertEquals(out, '')
93
 
        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')
94
143
 
95
144
    def test_annotate_cmd_two_revisions(self):
96
 
        out, err = self.run_bzr_captured(['annotate', 'hello.txt', '-r 1..2'],
97
 
                                         retcode=3)
98
 
        self.assertEquals(out, '')
99
 
        self.assertEquals(err, 'bzr: ERROR: bzr annotate --revision takes'
100
 
                               ' 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_nonexistant_file(self):
 
235
        tree = self.make_branch_and_tree('tree')
 
236
        self.build_tree(['tree/file'])
 
237
        tree.add(['file'])
 
238
        tree.commit('add a file')
 
239
 
 
240
        os.chdir('tree')
 
241
        out, err = self.run_bzr("annotate doesnotexist", retcode=3)
 
242
        self.assertEqual('', out)
 
243
        self.assertEqual("bzr: ERROR: doesnotexist is not versioned.\n", err)
 
244
 
 
245
    def test_annotate_without_workingtree(self):
 
246
        tree = self.make_branch_and_tree('branch')
 
247
        self.build_tree_contents([('branch/empty', '')])
 
248
        tree.add('empty')
 
249
        tree.commit('add empty file')
 
250
        bzrdir = tree.branch.bzrdir
 
251
        bzrdir.destroy_workingtree()
 
252
        self.assertFalse(bzrdir.has_workingtree())
 
253
 
 
254
        os.chdir('branch')
 
255
        out, err = self.run_bzr('annotate empty')
 
256
        self.assertEqual('', out)