13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
17
"""Test our ability to build up test repositories"""
19
from io import BytesIO
21
from dulwich.repo import Repo as GitRepo
19
from cStringIO import StringIO
21
from bzrlib.plugins.git import tests
26
24
class TestGitBranchBuilder(tests.TestCase):
28
26
def test__create_blob(self):
30
28
builder = tests.GitBranchBuilder(stream)
31
self.assertEqual(1, builder._create_blob(b'foo\nbar\n'))
32
self.assertEqualDiff(b'blob\nmark :1\ndata 8\nfoo\nbar\n\n',
29
self.assertEqual(1, builder._create_blob('foo\nbar\n'))
30
self.assertEqualDiff('blob\nmark :1\ndata 8\nfoo\nbar\n\n',
35
33
def test_set_file(self):
37
35
builder = tests.GitBranchBuilder(stream)
38
builder.set_file('foobar', b'foo\nbar\n', False)
39
self.assertEqualDiff(b'blob\nmark :1\ndata 8\nfoo\nbar\n\n',
36
builder.set_file('foobar', 'foo\nbar\n', False)
37
self.assertEqualDiff('blob\nmark :1\ndata 8\nfoo\nbar\n\n',
41
self.assertEqual([b'M 100644 :1 foobar\n'], builder.commit_info)
39
self.assertEqual(['M 100644 :1 foobar\n'], builder.commit_info)
43
41
def test_set_file_unicode(self):
45
43
builder = tests.GitBranchBuilder(stream)
46
builder.set_file(u'f\xb5/bar', b'contents\nbar\n', False)
47
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nbar\n\n',
44
builder.set_file(u'f\xb5/bar', 'contents\nbar\n', False)
45
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nbar\n\n',
49
self.assertEqual([b'M 100644 :1 f\xc2\xb5/bar\n'], builder.commit_info)
47
self.assertEqual(['M 100644 :1 f\xc2\xb5/bar\n'], builder.commit_info)
51
49
def test_set_file_newline(self):
53
51
builder = tests.GitBranchBuilder(stream)
54
builder.set_file(u'foo\nbar', b'contents\nbar\n', False)
55
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nbar\n\n',
52
builder.set_file(u'foo\nbar', 'contents\nbar\n', False)
53
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nbar\n\n',
57
self.assertEqual([b'M 100644 :1 "foo\\nbar"\n'], builder.commit_info)
55
self.assertEqual(['M 100644 :1 "foo\\nbar"\n'], builder.commit_info)
59
57
def test_set_file_executable(self):
61
builder = tests.GitBranchBuilder(stream)
62
builder.set_file(u'f\xb5/bar', b'contents\nbar\n', True)
63
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nbar\n\n',
65
self.assertEqual([b'M 100755 :1 f\xc2\xb5/bar\n'], builder.commit_info)
67
def test_set_symlink(self):
69
builder = tests.GitBranchBuilder(stream)
70
builder.set_symlink(u'f\xb5/bar', b'link/contents')
71
self.assertEqualDiff(b'blob\nmark :1\ndata 13\nlink/contents\n',
73
self.assertEqual([b'M 120000 :1 f\xc2\xb5/bar\n'], builder.commit_info)
75
def test_set_symlink_newline(self):
77
builder = tests.GitBranchBuilder(stream)
78
builder.set_symlink(u'foo\nbar', 'link/contents')
79
self.assertEqualDiff(b'blob\nmark :1\ndata 13\nlink/contents\n',
81
self.assertEqual([b'M 120000 :1 "foo\\nbar"\n'], builder.commit_info)
59
builder = tests.GitBranchBuilder(stream)
60
builder.set_file(u'f\xb5/bar', 'contents\nbar\n', True)
61
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nbar\n\n',
63
self.assertEqual(['M 100755 :1 f\xc2\xb5/bar\n'], builder.commit_info)
65
def test_set_link(self):
67
builder = tests.GitBranchBuilder(stream)
68
builder.set_link(u'f\xb5/bar', 'link/contents')
69
self.assertEqualDiff('blob\nmark :1\ndata 13\nlink/contents\n',
71
self.assertEqual(['M 120000 :1 f\xc2\xb5/bar\n'], builder.commit_info)
73
def test_set_link_newline(self):
75
builder = tests.GitBranchBuilder(stream)
76
builder.set_link(u'foo\nbar', 'link/contents')
77
self.assertEqualDiff('blob\nmark :1\ndata 13\nlink/contents\n',
79
self.assertEqual(['M 120000 :1 "foo\\nbar"\n'], builder.commit_info)
83
81
def test_delete_entry(self):
85
83
builder = tests.GitBranchBuilder(stream)
86
84
builder.delete_entry(u'path/to/f\xb5')
87
self.assertEqual([b'D path/to/f\xc2\xb5\n'], builder.commit_info)
85
self.assertEqual(['D path/to/f\xc2\xb5\n'], builder.commit_info)
89
87
def test_delete_entry_newline(self):
91
89
builder = tests.GitBranchBuilder(stream)
92
90
builder.delete_entry(u'path/to/foo\nbar')
93
self.assertEqual([b'D "path/to/foo\\nbar"\n'], builder.commit_info)
91
self.assertEqual(['D "path/to/foo\\nbar"\n'], builder.commit_info)
95
93
def test_encode_path(self):
96
94
encode = tests.GitBranchBuilder._encode_path
97
95
# Unicode is encoded to utf-8
98
self.assertEqual(encode(u'f\xb5'), b'f\xc2\xb5')
96
self.assertEqual(encode(u'f\xb5'), 'f\xc2\xb5')
99
97
# The name must be quoted if it starts by a double quote or contains a
101
self.assertEqual(encode(u'"foo'), b'"\\"foo"')
102
self.assertEqual(encode(u'fo\no'), b'"fo\\no"')
99
self.assertEqual(encode(u'"foo'), '"\\"foo"')
100
self.assertEqual(encode(u'fo\no'), '"fo\\no"')
103
101
# When the name is quoted, all backslash and quote chars must be
105
self.assertEqual(encode(u'fo\\o\nbar'), b'"fo\\\\o\\nbar"')
106
self.assertEqual(encode(u'fo"o"\nbar'), b'"fo\\"o\\"\\nbar"')
103
self.assertEqual(encode(u'fo\\o\nbar'), '"fo\\\\o\\nbar"')
104
self.assertEqual(encode(u'fo"o"\nbar'), '"fo\\"o\\"\\nbar"')
107
105
# Other control chars, such as \r, need not be escaped.
108
self.assertEqual(encode(u'foo\r\nbar'), b'"foo\r\\nbar"')
106
self.assertEqual(encode(u'foo\r\nbar'), '"foo\r\\nbar"')
110
108
def test_add_and_commit(self):
112
110
builder = tests.GitBranchBuilder(stream)
114
builder.set_file(u'f\xb5/bar', b'contents\nbar\n', False)
115
self.assertEqual(b'2', builder.commit(b'Joe Foo <joe@foo.com>',
116
u'committing f\xb5/bar',
117
timestamp=1194586400,
119
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nbar\n\n'
120
b'commit refs/heads/master\n'
122
b'committer Joe Foo <joe@foo.com> 1194586400 +0100\n'
124
b'committing f\xc2\xb5/bar'
126
b'M 100644 :1 f\xc2\xb5/bar\n'
112
builder.set_file(u'f\xb5/bar', 'contents\nbar\n', False)
113
self.assertEqual(2, builder.commit('Joe Foo <joe@foo.com>',
114
u'committing f\xb5/bar',
115
timestamp=1194586400,
117
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nbar\n\n'
118
'commit refs/heads/master\n'
120
'committer Joe Foo <joe@foo.com> 1194586400 +0100\n'
122
'committing f\xc2\xb5/bar'
124
'M 100644 :1 f\xc2\xb5/bar\n'
128
126
stream.getvalue())
130
128
def test_commit_base(self):
132
130
builder = tests.GitBranchBuilder(stream)
134
builder.set_file(u'foo', b'contents\nfoo\n', False)
135
r1 = builder.commit(b'Joe Foo <joe@foo.com>', u'first',
132
builder.set_file(u'foo', 'contents\nfoo\n', False)
133
r1 = builder.commit('Joe Foo <joe@foo.com>', u'first',
136
134
timestamp=1194586400)
137
r2 = builder.commit(b'Joe Foo <joe@foo.com>', u'second',
135
r2 = builder.commit('Joe Foo <joe@foo.com>', u'second',
138
136
timestamp=1194586405)
139
r3 = builder.commit(b'Joe Foo <joe@foo.com>', u'third',
137
r3 = builder.commit('Joe Foo <joe@foo.com>', u'third',
140
138
timestamp=1194586410,
143
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nfoo\n\n'
144
b'commit refs/heads/master\n'
146
b'committer Joe Foo <joe@foo.com> 1194586400 +0000\n'
152
b'commit refs/heads/master\n'
154
b'committer Joe Foo <joe@foo.com> 1194586405 +0000\n'
159
b'commit refs/heads/master\n'
161
b'committer Joe Foo <joe@foo.com> 1194586410 +0000\n'
166
b'\n', stream.getvalue())
141
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nfoo\n\n'
142
'commit refs/heads/master\n'
144
'committer Joe Foo <joe@foo.com> 1194586400 +0000\n'
150
'commit refs/heads/master\n'
152
'committer Joe Foo <joe@foo.com> 1194586405 +0000\n'
157
'commit refs/heads/master\n'
159
'committer Joe Foo <joe@foo.com> 1194586410 +0000\n'
164
'\n', stream.getvalue())
168
166
def test_commit_merge(self):
170
168
builder = tests.GitBranchBuilder(stream)
172
builder.set_file(u'foo', b'contents\nfoo\n', False)
173
r1 = builder.commit(b'Joe Foo <joe@foo.com>', u'first',
170
builder.set_file(u'foo', 'contents\nfoo\n', False)
171
r1 = builder.commit('Joe Foo <joe@foo.com>', u'first',
174
172
timestamp=1194586400)
175
r2 = builder.commit(b'Joe Foo <joe@foo.com>', u'second',
173
r2 = builder.commit('Joe Foo <joe@foo.com>', u'second',
176
174
timestamp=1194586405)
177
r3 = builder.commit(b'Joe Foo <joe@foo.com>', u'third',
175
r3 = builder.commit('Joe Foo <joe@foo.com>', u'third',
178
176
timestamp=1194586410,
180
r4 = builder.commit(b'Joe Foo <joe@foo.com>', u'Merge',
178
r4 = builder.commit('Joe Foo <joe@foo.com>', u'Merge',
181
179
timestamp=1194586415,
184
self.assertEqualDiff(b'blob\nmark :1\ndata 13\ncontents\nfoo\n\n'
185
b'commit refs/heads/master\n'
187
b'committer Joe Foo <joe@foo.com> 1194586400 +0000\n'
193
b'commit refs/heads/master\n'
195
b'committer Joe Foo <joe@foo.com> 1194586405 +0000\n'
200
b'commit refs/heads/master\n'
202
b'committer Joe Foo <joe@foo.com> 1194586410 +0000\n'
208
b'commit refs/heads/master\n'
210
b'committer Joe Foo <joe@foo.com> 1194586415 +0000\n'
215
b'\n', stream.getvalue())
182
self.assertEqualDiff('blob\nmark :1\ndata 13\ncontents\nfoo\n\n'
183
'commit refs/heads/master\n'
185
'committer Joe Foo <joe@foo.com> 1194586400 +0000\n'
191
'commit refs/heads/master\n'
193
'committer Joe Foo <joe@foo.com> 1194586405 +0000\n'
198
'commit refs/heads/master\n'
200
'committer Joe Foo <joe@foo.com> 1194586410 +0000\n'
206
'commit refs/heads/master\n'
208
'committer Joe Foo <joe@foo.com> 1194586415 +0000\n'
213
'\n', stream.getvalue())
217
215
def test_auto_timestamp(self):
219
217
builder = tests.GitBranchBuilder(stream)
220
builder.commit(b'Joe Foo <joe@foo.com>', u'message')
218
builder.commit('Joe Foo <joe@foo.com>', u'message')
221
219
self.assertContainsRe(stream.getvalue(),
222
br'committer Joe Foo <joe@foo\.com> \d+ \+0000')
220
r'committer Joe Foo <joe@foo\.com> \d+ \+0000')
224
222
def test_reset(self):
226
224
builder = tests.GitBranchBuilder(stream)
228
self.assertEqualDiff(b'reset refs/heads/master\n\n', stream.getvalue())
226
self.assertEqualDiff('reset refs/heads/master\n\n', stream.getvalue())
230
228
def test_reset_named_ref(self):
232
230
builder = tests.GitBranchBuilder(stream)
233
builder.reset(b'refs/heads/branch')
234
self.assertEqualDiff(b'reset refs/heads/branch\n\n', stream.getvalue())
231
builder.reset('refs/heads/branch')
232
self.assertEqualDiff('reset refs/heads/branch\n\n', stream.getvalue())
236
234
def test_reset_revision(self):
238
236
builder = tests.GitBranchBuilder(stream)
239
builder.reset(mark=b'123')
237
builder.reset(mark=123)
240
238
self.assertEqualDiff(
241
b'reset refs/heads/master\n'
243
b'\n', stream.getvalue())
239
'reset refs/heads/master\n'
241
'\n', stream.getvalue())
246
244
class TestGitBranchBuilderReal(tests.TestCaseInTempDir):
248
246
def test_create_real_branch(self):
247
tests.run_git('init')
251
249
builder = tests.GitBranchBuilder()
252
builder.set_file(u'foo', b'contents\nfoo\n', False)
253
r1 = builder.commit(b'Joe Foo <joe@foo.com>', u'first',
250
builder.set_file(u'foo', 'contents\nfoo\n', False)
251
r1 = builder.commit('Joe Foo <joe@foo.com>', u'first',
254
252
timestamp=1194586400)
255
253
mapping = builder.finish()
256
self.assertEqual({b'1': b'44411e8e9202177dd19b6599d7a7991059fa3cb4',
257
b'2': b'b0b62e674f67306fddcf72fa888c3b56df100d64',
254
self.assertEqual({1:'44411e8e9202177dd19b6599d7a7991059fa3cb4',
255
2: 'b0b62e674f67306fddcf72fa888c3b56df100d64',