18
18
"""Black-box tests for bzr export.
21
from StringIO import StringIO
23
from bzrlib.branch import Branch
28
from bzrlib.export import (
31
from bzrlib.tests import TestSkipped
24
32
from bzrlib.tests.blackbox import ExternalBase
25
import tarfile, zipfile
27
35
class TestExport(ExternalBase):
29
37
def test_tar_export(self):
38
tree = self.make_branch_and_tree('tar')
39
self.build_tree(['tar/a'])
41
self.build_tree_contents([('tar/.bzrrules', '')])
43
self.build_tree(['tar/.bzr-adir/', 'tar/.bzr-adir/afile'])
44
tree.add(['.bzr-adir/', '.bzr-adir/afile'])
47
self.run_bzr('ignore something')
35
open('a', 'wb').write('foo\n')
37
self.runbzr('ignore something')
38
self.runbzr('commit -m 1')
39
self.runbzr('export test.tar.gz')
50
self.failUnless(tree.has_filename('.bzrignore'))
51
self.failUnless(tree.has_filename('.bzrrules'))
52
self.failUnless(tree.has_filename('.bzr-adir'))
53
self.failUnless(tree.has_filename('.bzr-adir/afile'))
54
self.run_bzr('export test.tar.gz')
40
55
ball = tarfile.open('test.tar.gz')
41
for m in ball.getnames():
43
self.failIf(os.path.basename(m) == '.bzrignore', 'tar export contains .bzrignore')
56
# Make sure the tarball contains 'a', but does not contain
58
self.assertEqual(['test/a'], sorted(ball.getnames()))
60
out, err = self.run_bzr('export --format=tgz --root=test -')
61
ball = tarfile.open('', fileobj=StringIO(out))
62
self.assertEqual(['test/a'], sorted(ball.getnames()))
64
def test_tar_export_unicode(self):
65
tree = self.make_branch_and_tree('tar')
68
self.build_tree(['tar/' + fname])
70
raise TestSkipped('Unable to represent path %r' % (fname,))
75
self.run_bzr('export test.tar')
76
ball = tarfile.open('test.tar')
77
# all paths are prefixed with the base name of the tarball
78
self.assertEqual(['test/' + fname.encode('utf8')],
79
sorted(ball.getnames()))
45
81
def test_zip_export(self):
51
open('a', 'wb').write('foo\n')
53
self.runbzr('ignore something')
54
self.runbzr('commit -m 1')
55
self.runbzr('export test.zip')
56
ball = zipfile.ZipFile('test.zip')
57
for m in ball.namelist():
59
self.failIf(os.path.basename(m) == '.bzrignore', 'zip export contains .bzrignore')
82
tree = self.make_branch_and_tree('zip')
83
self.build_tree(['zip/a'])
85
self.build_tree_contents([('zip/.bzrrules', '')])
87
self.build_tree(['zip/.bzr-adir/', 'zip/.bzr-adir/afile'])
88
tree.add(['.bzr-adir/', '.bzr-adir/afile'])
91
self.run_bzr('ignore something')
94
self.failUnless(tree.has_filename('.bzrignore'))
95
self.failUnless(tree.has_filename('.bzrrules'))
96
self.failUnless(tree.has_filename('.bzr-adir'))
97
self.failUnless(tree.has_filename('.bzr-adir/afile'))
98
self.run_bzr('export test.zip')
100
zfile = zipfile.ZipFile('test.zip')
101
# Make sure the zipfile contains 'a', but does not contain
103
self.assertEqual(['test/a'], sorted(zfile.namelist()))
105
def test_zip_export_unicode(self):
106
tree = self.make_branch_and_tree('zip')
109
self.build_tree(['zip/' + fname])
111
raise TestSkipped('Unable to represent path %r' % (fname,))
116
self.run_bzr('export test.zip')
117
zfile = zipfile.ZipFile('test.zip')
118
# all paths are prefixed with the base name of the zipfile
119
self.assertEqual(['test/' + fname.encode('utf8')],
120
sorted(zfile.namelist()))
122
def test_zip_export_directories(self):
123
tree = self.make_branch_and_tree('zip')
124
self.build_tree(['zip/a', 'zip/b/', 'zip/b/c', 'zip/d/'])
125
tree.add(['a', 'b', 'b/c', 'd'])
129
self.run_bzr('export test.zip')
130
zfile = zipfile.ZipFile('test.zip')
131
names = sorted(zfile.namelist())
133
# even on win32, zipfile.ZipFile changes all names to use
135
self.assertEqual(['test/a', 'test/b/', 'test/b/c', 'test/d/'], names)
137
file_attr = stat.S_IFREG
138
dir_attr = stat.S_IFDIR | zip_exporter.ZIP_DIRECTORY_BIT
140
a_info = zfile.getinfo(names[0])
141
self.assertEqual(file_attr, a_info.external_attr)
143
b_info = zfile.getinfo(names[1])
144
self.assertEqual(dir_attr, b_info.external_attr)
146
c_info = zfile.getinfo(names[2])
147
self.assertEqual(file_attr, c_info.external_attr)
149
d_info = zfile.getinfo(names[3])
150
self.assertEqual(dir_attr, d_info.external_attr)
61
152
def test_dir_export(self):
153
tree = self.make_branch_and_tree('dir')
154
self.build_tree(['dir/a'])
156
self.build_tree_contents([('dir/.bzrrules', '')])
157
tree.add('.bzrrules')
158
self.build_tree(['dir/.bzr-adir/', 'dir/.bzr-adir/afile'])
159
tree.add(['.bzr-adir/', '.bzr-adir/afile'])
162
self.run_bzr('ignore something')
67
open('a', 'wb').write('foo\n')
69
self.runbzr('ignore something')
70
self.runbzr('commit -m 1')
71
self.runbzr('export direxport')
165
self.failUnless(tree.has_filename('.bzrignore'))
166
self.failUnless(tree.has_filename('.bzrrules'))
167
self.failUnless(tree.has_filename('.bzr-adir'))
168
self.failUnless(tree.has_filename('.bzr-adir/afile'))
169
self.run_bzr('export direxport')
73
171
files = sorted(os.listdir('direxport'))
74
self.assertEqual(['a'], files, 'dir contains .bzrignore')
172
# Make sure the exported directory contains 'a', but does not contain
174
self.assertEqual(['a'], files)
176
def example_branch(self):
177
"""Create a branch a 'branch' containing hello and goodbye."""
178
tree = self.make_branch_and_tree('branch')
179
self.build_tree_contents([('branch/hello', 'foo')])
183
self.build_tree_contents([('branch/goodbye', 'baz')])
188
def test_basic_directory_export(self):
189
self.example_branch()
193
self.run_bzr('export ../latest')
194
self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
195
self.check_file_contents('../latest/goodbye', 'baz')
196
self.run_bzr('export ../first -r 1')
197
self.assertEqual(['hello'], sorted(os.listdir('../first')))
198
self.check_file_contents('../first/hello', 'foo')
200
# Even with .gz and .bz2 it is still a directory
201
self.run_bzr('export ../first.gz -r 1')
202
self.check_file_contents('../first.gz/hello', 'foo')
203
self.run_bzr('export ../first.bz2 -r 1')
204
self.check_file_contents('../first.bz2/hello', 'foo')
206
def test_basic_tarfile_export(self):
207
self.example_branch()
210
self.run_bzr('export ../first.tar -r 1')
211
self.failUnless(os.path.isfile('../first.tar'))
212
tf = tarfile.open('../first.tar')
214
self.assertEqual(['first/hello'], sorted(tf.getnames()))
215
self.assertEqual('foo', tf.extractfile('first/hello').read())
219
self.run_bzr('export ../first.tar.gz -r 1')
220
self.failUnless(os.path.isfile('../first.tar.gz'))
221
self.run_bzr('export ../first.tbz2 -r 1')
222
self.failUnless(os.path.isfile('../first.tbz2'))
223
self.run_bzr('export ../first.tar.bz2 -r 1')
224
self.failUnless(os.path.isfile('../first.tar.bz2'))
225
self.run_bzr('export ../first.tar.tbz2 -r 1')
226
self.failUnless(os.path.isfile('../first.tar.tbz2'))
228
tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
230
self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
231
self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
234
self.run_bzr('export ../first2.tar -r 1 --root pizza')
235
tf = tarfile.open('../first2.tar')
237
self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
238
self.assertEqual('foo', tf.extractfile('pizza/hello').read())
242
def test_basic_zipfile_export(self):
243
self.example_branch()
246
self.run_bzr('export ../first.zip -r 1')
247
self.failUnlessExists('../first.zip')
248
zf = zipfile.ZipFile('../first.zip')
250
self.assertEqual(['first/hello'], sorted(zf.namelist()))
251
self.assertEqual('foo', zf.read('first/hello'))
255
self.run_bzr('export ../first2.zip -r 1 --root pizza')
256
zf = zipfile.ZipFile('../first2.zip')
258
self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
259
self.assertEqual('foo', zf.read('pizza/hello'))
263
self.run_bzr('export ../first-zip --format=zip -r 1')
264
zf = zipfile.ZipFile('../first-zip')
266
self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
267
self.assertEqual('foo', zf.read('first-zip/hello'))
271
def test_export_from_outside_branch(self):
272
self.example_branch()
274
# Use directory exports to test stating the branch location
275
self.run_bzr('export latest branch')
276
self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
277
self.check_file_contents('latest/goodbye', 'baz')
278
self.run_bzr('export first -r 1 branch')
279
self.assertEqual(['hello'], sorted(os.listdir('first')))
280
self.check_file_contents('first/hello', 'foo')
282
def test_export_partial_tree(self):
283
tree = self.example_branch()
284
self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
285
tree.smart_add(['branch'])
286
tree.commit('more setup')
287
out, err = self.run_bzr('export exported branch/subdir')
288
self.assertEqual(['foo.txt'], os.listdir('exported'))