1
# Copyright (C) 2005, 2006, 2008 Canonical Ltd
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.
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.
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
18
"""Black-box tests for bzr export.
21
from StringIO import StringIO
28
from bzrlib.export import (
31
from bzrlib.tests import TestSkipped
32
from bzrlib.tests.blackbox import ExternalBase
35
class TestExport(ExternalBase):
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')
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')
55
ball = tarfile.open('test.tar.gz')
56
# Make sure the tarball contains 'a', but does not contain
58
self.assertEqual(['test/a'], sorted(ball.getnames()))
60
if sys.version_info < (2, 5, 2) and sys.platform == 'darwin':
61
raise tests.KnownFailure('python %r has a tar related bug, upgrade'
63
out, err = self.run_bzr('export --format=tgz --root=test -')
64
ball = tarfile.open('', fileobj=StringIO(out))
65
self.assertEqual(['test/a'], sorted(ball.getnames()))
67
def test_tar_export_unicode(self):
68
tree = self.make_branch_and_tree('tar')
71
self.build_tree(['tar/' + fname])
73
raise TestSkipped('Unable to represent path %r' % (fname,))
78
self.run_bzr('export test.tar')
79
ball = tarfile.open('test.tar')
80
# all paths are prefixed with the base name of the tarball
81
self.assertEqual(['test/' + fname.encode('utf8')],
82
sorted(ball.getnames()))
84
def test_zip_export(self):
85
tree = self.make_branch_and_tree('zip')
86
self.build_tree(['zip/a'])
88
self.build_tree_contents([('zip/.bzrrules', '')])
90
self.build_tree(['zip/.bzr-adir/', 'zip/.bzr-adir/afile'])
91
tree.add(['.bzr-adir/', '.bzr-adir/afile'])
94
self.run_bzr('ignore something')
97
self.failUnless(tree.has_filename('.bzrignore'))
98
self.failUnless(tree.has_filename('.bzrrules'))
99
self.failUnless(tree.has_filename('.bzr-adir'))
100
self.failUnless(tree.has_filename('.bzr-adir/afile'))
101
self.run_bzr('export test.zip')
103
zfile = zipfile.ZipFile('test.zip')
104
# Make sure the zipfile contains 'a', but does not contain
106
self.assertEqual(['test/a'], sorted(zfile.namelist()))
108
def test_zip_export_unicode(self):
109
tree = self.make_branch_and_tree('zip')
112
self.build_tree(['zip/' + fname])
114
raise TestSkipped('Unable to represent path %r' % (fname,))
119
self.run_bzr('export test.zip')
120
zfile = zipfile.ZipFile('test.zip')
121
# all paths are prefixed with the base name of the zipfile
122
self.assertEqual(['test/' + fname.encode('utf8')],
123
sorted(zfile.namelist()))
125
def test_zip_export_directories(self):
126
tree = self.make_branch_and_tree('zip')
127
self.build_tree(['zip/a', 'zip/b/', 'zip/b/c', 'zip/d/'])
128
tree.add(['a', 'b', 'b/c', 'd'])
132
self.run_bzr('export test.zip')
133
zfile = zipfile.ZipFile('test.zip')
134
names = sorted(zfile.namelist())
136
# even on win32, zipfile.ZipFile changes all names to use
138
self.assertEqual(['test/a', 'test/b/', 'test/b/c', 'test/d/'], names)
140
file_attr = stat.S_IFREG
141
dir_attr = stat.S_IFDIR | zip_exporter.ZIP_DIRECTORY_BIT
143
a_info = zfile.getinfo(names[0])
144
self.assertEqual(file_attr, a_info.external_attr)
146
b_info = zfile.getinfo(names[1])
147
self.assertEqual(dir_attr, b_info.external_attr)
149
c_info = zfile.getinfo(names[2])
150
self.assertEqual(file_attr, c_info.external_attr)
152
d_info = zfile.getinfo(names[3])
153
self.assertEqual(dir_attr, d_info.external_attr)
155
def test_dir_export(self):
156
tree = self.make_branch_and_tree('dir')
157
self.build_tree(['dir/a'])
159
self.build_tree_contents([('dir/.bzrrules', '')])
160
tree.add('.bzrrules')
161
self.build_tree(['dir/.bzr-adir/', 'dir/.bzr-adir/afile'])
162
tree.add(['.bzr-adir/', '.bzr-adir/afile'])
165
self.run_bzr('ignore something')
168
self.failUnless(tree.has_filename('.bzrignore'))
169
self.failUnless(tree.has_filename('.bzrrules'))
170
self.failUnless(tree.has_filename('.bzr-adir'))
171
self.failUnless(tree.has_filename('.bzr-adir/afile'))
172
self.run_bzr('export direxport')
174
files = sorted(os.listdir('direxport'))
175
# Make sure the exported directory contains 'a', but does not contain
177
self.assertEqual(['a'], files)
179
def example_branch(self):
180
"""Create a branch a 'branch' containing hello and goodbye."""
181
tree = self.make_branch_and_tree('branch')
182
self.build_tree_contents([('branch/hello', 'foo')])
186
self.build_tree_contents([('branch/goodbye', 'baz')])
191
def test_basic_directory_export(self):
192
self.example_branch()
196
self.run_bzr('export ../latest')
197
self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
198
self.check_file_contents('../latest/goodbye', 'baz')
199
self.run_bzr('export ../first -r 1')
200
self.assertEqual(['hello'], sorted(os.listdir('../first')))
201
self.check_file_contents('../first/hello', 'foo')
203
# Even with .gz and .bz2 it is still a directory
204
self.run_bzr('export ../first.gz -r 1')
205
self.check_file_contents('../first.gz/hello', 'foo')
206
self.run_bzr('export ../first.bz2 -r 1')
207
self.check_file_contents('../first.bz2/hello', 'foo')
209
def test_basic_tarfile_export(self):
210
self.example_branch()
213
self.run_bzr('export ../first.tar -r 1')
214
self.failUnless(os.path.isfile('../first.tar'))
215
tf = tarfile.open('../first.tar')
217
self.assertEqual(['first/hello'], sorted(tf.getnames()))
218
self.assertEqual('foo', tf.extractfile('first/hello').read())
222
self.run_bzr('export ../first.tar.gz -r 1')
223
self.failUnless(os.path.isfile('../first.tar.gz'))
224
self.run_bzr('export ../first.tbz2 -r 1')
225
self.failUnless(os.path.isfile('../first.tbz2'))
226
self.run_bzr('export ../first.tar.bz2 -r 1')
227
self.failUnless(os.path.isfile('../first.tar.bz2'))
228
self.run_bzr('export ../first.tar.tbz2 -r 1')
229
self.failUnless(os.path.isfile('../first.tar.tbz2'))
231
tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
233
self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
234
self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
237
self.run_bzr('export ../first2.tar -r 1 --root pizza')
238
tf = tarfile.open('../first2.tar')
240
self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
241
self.assertEqual('foo', tf.extractfile('pizza/hello').read())
245
def test_basic_zipfile_export(self):
246
self.example_branch()
249
self.run_bzr('export ../first.zip -r 1')
250
self.failUnlessExists('../first.zip')
251
zf = zipfile.ZipFile('../first.zip')
253
self.assertEqual(['first/hello'], sorted(zf.namelist()))
254
self.assertEqual('foo', zf.read('first/hello'))
258
self.run_bzr('export ../first2.zip -r 1 --root pizza')
259
zf = zipfile.ZipFile('../first2.zip')
261
self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
262
self.assertEqual('foo', zf.read('pizza/hello'))
266
self.run_bzr('export ../first-zip --format=zip -r 1')
267
zf = zipfile.ZipFile('../first-zip')
269
self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
270
self.assertEqual('foo', zf.read('first-zip/hello'))
274
def test_export_from_outside_branch(self):
275
self.example_branch()
277
# Use directory exports to test stating the branch location
278
self.run_bzr('export latest branch')
279
self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
280
self.check_file_contents('latest/goodbye', 'baz')
281
self.run_bzr('export first -r 1 branch')
282
self.assertEqual(['hello'], sorted(os.listdir('first')))
283
self.check_file_contents('first/hello', 'foo')
285
def test_export_partial_tree(self):
286
tree = self.example_branch()
287
self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
288
tree.smart_add(['branch'])
289
tree.commit('more setup')
290
out, err = self.run_bzr('export exported branch/subdir')
291
self.assertEqual(['foo.txt'], os.listdir('exported'))