/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
1
# Copyright (C) 2008 Canonical Ltd
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
"""Test the Import parsing"""
18
19
import StringIO
20
21
from bzrlib import tests
22
23
from bzrlib.plugins.fastimport import (
24
    errors,
25
    parser,
26
    )
27
28
29
class TestLineBasedParser(tests.TestCase):
30
31
    def test_push_line(self):
32
        s = StringIO.StringIO("foo\nbar\nbaz\n")
33
        p = parser.LineBasedParser(s)
34
        self.assertEqual('foo', p.next_line())
35
        self.assertEqual('bar', p.next_line())
36
        p.push_line('bar')
37
        self.assertEqual('bar', p.next_line())
38
        self.assertEqual('baz', p.next_line())
39
        self.assertEqual(None, p.next_line())
40
41
    def test_read_bytes(self):
42
        s = StringIO.StringIO("foo\nbar\nbaz\n")
43
        p = parser.LineBasedParser(s)
44
        self.assertEqual('fo', p.read_bytes(2))
45
        self.assertEqual('o\nb', p.read_bytes(3))
46
        self.assertEqual('ar', p.next_line())
47
        # Test that the line buffer is ignored
48
        p.push_line('bar')
49
        self.assertEqual('baz', p.read_bytes(3))
50
        # Test missing bytes
51
        self.assertRaises(errors.MissingBytes, p.read_bytes, 10)
52
53
    def test_read_until(self):
54
        # TODO
55
        return
56
        s = StringIO.StringIO("foo\nbar\nbaz\nabc\ndef\nghi\n")
57
        p = parser.LineBasedParser(s)
58
        self.assertEqual('foo\nbar', p.read_until('baz'))
59
        self.assertEqual('abc', p.next_line())
60
        # Test that the line buffer is ignored
61
        p.push_line('abc')
62
        self.assertEqual('def', p.read_until('ghi'))
63
        # Test missing terminator
64
        self.assertRaises(errors.MissingTerminator, p.read_until('>>>'))
65
66
67
# Sample text
68
_sample_import_text = """
69
progress completed
70
# Test blob formats
71
blob
72
mark :1
73
data 4
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
74
aaaablob
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
75
data 5
76
bbbbb
77
# Commit formats
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
78
commit refs/heads/master
79
mark :2
80
committer bugs bunny <bugs@bunny.org> now
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
81
data 14
82
initial import
83
M 644 inline README
84
data 18
85
Welcome from bugs
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
86
commit refs/heads/master
0.65.2 by James Westby
The space between the author and email is optional in committer.
87
committer <bugs@bunny.org> now
88
data 13
89
second commit
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
90
from :2
0.65.2 by James Westby
The space between the author and email is optional in committer.
91
M 644 inline README
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
92
data 23
0.65.2 by James Westby
The space between the author and email is optional in committer.
93
Welcome from bugs, etc.
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
94
# Miscellaneous
95
checkpoint
96
progress completed
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
97
# Test a commit without sub-commands (bug #351717)
98
commit refs/heads/master
99
mark :3
100
author <bugs@bunny.org> now
101
committer <bugs@bunny.org> now
102
data 20
103
first commit, empty
0.88.1 by Samuel Bronson
Add a test for bug #400960.
104
# Test a commit with a heredoc-style (delimited_data) messsage (bug #400960)
105
commit refs/heads/master
106
mark :4
107
author <bugs@bunny.org> now
108
committer <bugs@bunny.org> now
109
data <<EOF
110
Commit with heredoc-style message
111
EOF
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
112
"""
113
114
115
class TestImportParser(tests.TestCase):
116
117
    def test_iter_commands(self):
118
        s = StringIO.StringIO(_sample_import_text)
119
        p = parser.ImportParser(s)
0.64.10 by Ian Clatworthy
1st cut are dequoting paths
120
        result = []
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
121
        for cmd in p.iter_commands():
0.64.10 by Ian Clatworthy
1st cut are dequoting paths
122
            result.append(cmd)
0.64.1 by Ian Clatworthy
1st cut: gfi parser + --info processing method
123
            if cmd.name == 'commit':
124
                for fc in cmd.file_iter():
0.64.10 by Ian Clatworthy
1st cut are dequoting paths
125
                    result.append(fc)
0.88.1 by Samuel Bronson
Add a test for bug #400960.
126
        self.assertEqual(len(result), 11)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
127
        cmd1 = result.pop(0)
0.64.10 by Ian Clatworthy
1st cut are dequoting paths
128
        self.assertEqual('progress', cmd1.name)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
129
        self.assertEqual('completed', cmd1.message)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
130
        cmd2 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
131
        self.assertEqual('blob', cmd2.name)
132
        self.assertEqual('1', cmd2.mark)
133
        self.assertEqual(':1', cmd2.id)
134
        self.assertEqual('aaaa', cmd2.data)
135
        self.assertEqual(4, cmd2.lineno)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
136
        cmd3 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
137
        self.assertEqual('blob', cmd3.name)
138
        self.assertEqual('@7', cmd3.id)
139
        self.assertEqual(None, cmd3.mark)
140
        self.assertEqual('bbbbb', cmd3.data)
141
        self.assertEqual(7, cmd3.lineno)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
142
        cmd4 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
143
        self.assertEqual('commit', cmd4.name)
144
        self.assertEqual('2', cmd4.mark)
145
        self.assertEqual(':2', cmd4.id)
146
        self.assertEqual('initial import', cmd4.message)
147
        self.assertEqual('bugs bunny', cmd4.committer[0])
148
        self.assertEqual('bugs@bunny.org', cmd4.committer[1])
149
        # FIXME: check timestamp and timezone as well
150
        self.assertEqual(None, cmd4.author)
151
        self.assertEqual(11, cmd4.lineno)
152
        self.assertEqual('refs/heads/master', cmd4.ref)
0.64.71 by Ian Clatworthy
fix tests to use new CommitCommand constructor
153
        self.assertEqual(None, cmd4.from_)
154
        self.assertEqual([], cmd4.merges)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
155
        file_cmd1 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
156
        self.assertEqual('filemodify', file_cmd1.name)
157
        self.assertEqual('README', file_cmd1.path)
158
        self.assertEqual('file', file_cmd1.kind)
159
        self.assertEqual(False, file_cmd1.is_executable)
160
        self.assertEqual('Welcome from bugs\n', file_cmd1.data)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
161
        cmd5 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
162
        self.assertEqual('commit', cmd5.name)
163
        self.assertEqual(None, cmd5.mark)
164
        self.assertEqual('@19', cmd5.id)
165
        self.assertEqual('second commit', cmd5.message)
166
        self.assertEqual('', cmd5.committer[0])
167
        self.assertEqual('bugs@bunny.org', cmd5.committer[1])
168
        # FIXME: check timestamp and timezone as well
169
        self.assertEqual(None, cmd5.author)
170
        self.assertEqual(19, cmd5.lineno)
171
        self.assertEqual('refs/heads/master', cmd5.ref)
0.64.71 by Ian Clatworthy
fix tests to use new CommitCommand constructor
172
        self.assertEqual(':2', cmd5.from_)
173
        self.assertEqual([], cmd5.merges)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
174
        file_cmd2 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
175
        self.assertEqual('filemodify', file_cmd2.name)
176
        self.assertEqual('README', file_cmd2.path)
177
        self.assertEqual('file', file_cmd2.kind)
178
        self.assertEqual(False, file_cmd2.is_executable)
179
        self.assertEqual('Welcome from bugs, etc.', file_cmd2.data)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
180
        cmd6 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
181
        self.assertEqual(cmd6.name, 'checkpoint')
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
182
        cmd7 = result.pop(0)
0.65.5 by James Westby
Make the parser handle multiple words in the committer name.
183
        self.assertEqual('progress', cmd7.name)
184
        self.assertEqual('completed', cmd7.message)
0.64.172 by Ian Clatworthy
handle commit commands with no from clause and no sub-commands
185
        cmd = result.pop(0)
186
        self.assertEqual('commit', cmd.name)
187
        self.assertEqual('3', cmd.mark)
188
        self.assertEqual(None, cmd.from_)
0.88.1 by Samuel Bronson
Add a test for bug #400960.
189
        cmd = result.pop(0)
190
        self.assertEqual('commit', cmd.name)
191
        self.assertEqual('4', cmd.mark)
192
        self.assertEqual('Commit with heredoc-style message\n', cmd.message)
0.64.10 by Ian Clatworthy
1st cut are dequoting paths
193
194
195
class TestStringParsing(tests.TestCase):
196
197
    def test_unquote(self):
198
        s = r'hello \"sweet\" wo\\r\tld'
199
        self.assertEquals(r'hello "sweet" wo\r' + "\tld",
200
            parser._unquote_c_string(s))
0.64.175 by Ian Clatworthy
fix parsing when a rename old-path has spaces in it
201
202
203
class TestPathPairParsing(tests.TestCase):
204
205
    def test_path_pair_simple(self):
206
        p = parser.ImportParser("")
207
        self.assertEqual(['foo', 'bar'], p._path_pair("foo bar"))
208
209
    def test_path_pair_spaces_in_first(self):
210
        p = parser.ImportParser("")
211
        self.assertEqual(['foo bar', 'baz'],
212
            p._path_pair('"foo bar" baz'))