~bzr-pqm/bzr/bzr.dev

5724.1.2 by John Arbash Meinel
Force test_tar_export to test that it outputs in binary.
1
# Copyright (C) 2005-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
16
17
18
"""Black-box tests for bzr export.
19
"""
20
3408.7.1 by Martin Pool
Support tarball export to stdout
21
from StringIO import StringIO
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
22
import os
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
23
import stat
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
24
import tarfile
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
25
import time
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
26
import zipfile
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
27
4241.9.1 by Vincent Ladeuil
Fix test_tar_export erroring test.
28
29
from bzrlib import (
30
    export,
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
31
    )
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
32
from bzrlib.tests import (
33
    features,
34
    TestCaseWithTransport,
35
    )
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
36
37
38
class TestExport(TestCaseWithTransport):
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
39
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
40
    # On Windows, if we fail to set the binary bit, and a '\r' or '\n'
41
    # ends up in the data stream, we will get corruption. Add a fair amount
42
    # of random data, to help ensure there is at least one.
43
    _file_content = ('!\r\n\t\n \r'
44
        + 'r29trp9i1r8k0e24c2o7mcx2isrlaw7toh1hv2mtst3o1udkl36v9xn2z8kt\n'
45
          'tvjn7e3i9cj1qs1rw9gcye9w72cbdueiufw8nky7bs08lwggir59d62knecp\n'
46
          '7s0537r8sg3e8hdnidji49rswo47c3j8190nh8emef2b6j1mf5kdq45nt3f5\n'
47
          '1sz9u7fuzrm4w8bebre7p62sh5os2nkj2iiyuk9n0w0pjpdulu9k2aajejah\n'
48
          'ini90ny40qzs12ajuy0ua6l178n93lvy2atqngnntsmtlmqx7yhp0q9a1xr4\n'
49
          '1n69kgbo6qu9osjpqq83446r00jijtcstzybfqwm1lnt9spnri2j07bt7bbh\n'
50
          'rf3ejatdxta83te2s0pt9rc4hidgy3d2pc53p4wscdt2b1dfxdj9utf5m17f\n'
51
          'f03oofcau950o090vyx6m72vfkywo7gp3ajzi6uk02dwqwtumq4r44xx6ho7\n'
52
          'nhynborjdjep5j53f9548msb7gd3x9a1xveb4s8zfo6cbdw2kdngcrbakwu8\n'
53
          'ql5a8l94gplkwr7oypw5nt1gj5i3xwadyjfr3lb61tfkz31ba7uda9knb294\n'
54
          '1azhfta0q3ry9x36lxyanvhp0g5z0t5a0i4wnoc8p4htexi915y1cnw4nznn\n'
55
          'aj70dvp88ifiblv2bsp98hz570teinj8g472ddxni9ydmazfzwtznbf3hrg6\n'
56
          '84gigirjt6n2yagf70036m8d73cz0jpcighpjtxsmbgzbxx7nb4ewq6jbgnc\n'
57
          'hux1b0qtsdi0zfhj6g1otf5jcldmtdvuon8y1ttszkqw3ograwi25yl921hy\n'
58
          'izgscmfha9xdhxxabs07b40secpw22ah9iwpbmsns6qz0yr6fswto3ft2ez5\n'
59
          'ngn48pdfxj1pw246drmj1y2ll5af5w7cz849rapzd9ih7qvalw358co0yzrs\n'
60
          'xan9291d1ivjku4o5gjrsnmllrqwxwy86pcivinbmlnzasa9v3o22lgv4uyd\n'
61
          'q8kw77bge3hr5rr5kzwjxk223bkmo3z9oju0954undsz8axr3kb3730otrcr\n'
62
          '9cwhu37htnizdwxmpoc5qmobycfm7ubbykfumv6zgkl6b8zlslwl7a8b81vz\n'
63
          '3weqkvv5csfza9xvwypr6lo0t03fwp0ihmci3m1muh0lf2u30ze0hjag691j\n'
64
          '27fjtd3e3zbiin5n2hq21iuo09ukbs73r5rt7vaw6axvoilvdciir9ugjh2c\n'
65
          'na2b8dr0ptftoyhyxv1iwg661y338e28fhz4xxwgv3hnoe98ydfa1oou45vj\n'
66
          'ln74oac2keqt0agbylrqhfscin7ireae2bql7z2le823ksy47ud57z8ctomp\n'
67
          '31s1vwbczdjwqp0o2jc7mkrurvzg8mj2zwcn2iily4gcl4sy4fsh4rignlyz\n')
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
68
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
69
    def make_basic_tree(self):
70
        tree = self.make_branch_and_tree('tree')
71
        self.build_tree_contents([('tree/a', self._file_content)])
72
        tree.add('a')
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
73
        tree.commit('1')
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
74
        return tree
75
76
    def make_tree_with_extra_bzr_files(self):
77
        tree = self.make_basic_tree()
78
        self.build_tree_contents([('tree/.bzrrules', '')])
79
        self.build_tree(['tree/.bzr-adir/', 'tree/.bzr-adir/afile'])
80
        tree.add(['.bzrrules', '.bzr-adir/', '.bzr-adir/afile'])
81
82
        self.run_bzr('ignore something -d tree')
83
        tree.commit('2')
84
        return tree
85
86
    def test_tar_export_ignores_bzr(self):
87
        tree = self.make_tree_with_extra_bzr_files()
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
88
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
89
        self.assertTrue(tree.has_filename('.bzrignore'))
90
        self.assertTrue(tree.has_filename('.bzrrules'))
91
        self.assertTrue(tree.has_filename('.bzr-adir'))
92
        self.assertTrue(tree.has_filename('.bzr-adir/afile'))
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
93
        self.run_bzr('export test.tar.gz -d tree')
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
94
        ball = tarfile.open('test.tar.gz')
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
95
        # Make sure the tarball contains 'a', but does not contain
96
        # '.bzrignore'.
5724.1.2 by John Arbash Meinel
Force test_tar_export to test that it outputs in binary.
97
        self.assertEqual(['test/a'],
98
                         sorted(ball.getnames()))
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
99
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
100
    def test_tar_export_unicode_filename(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
101
        self.requireFeature(features.UnicodeFilenameFeature)
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
102
        tree = self.make_branch_and_tree('tar')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
103
        # FIXME: using fname = u'\xe5.txt' below triggers a bug revealed since
104
        # bzr.dev revno 4216 but more related to OSX/working trees/unicode than
4241.9.6 by Vincent Ladeuil
Add NEWS entry.
105
        # export itself --vila 20090406
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
106
        fname = u'\N{Euro Sign}.txt'
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
107
        self.build_tree(['tar/' + fname])
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
108
        tree.add([fname])
109
        tree.commit('first')
110
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
111
        self.run_bzr('export test.tar -d tar')
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
112
        ball = tarfile.open('test.tar')
113
        # all paths are prefixed with the base name of the tarball
114
        self.assertEqual(['test/' + fname.encode('utf8')],
115
                         sorted(ball.getnames()))
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
116
5152.1.1 by Parth Malwankar
Fixed bug #413406. unicode names for parent directory
117
    def test_tar_export_unicode_basedir(self):
118
        """Test for bug #413406"""
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
119
        self.requireFeature(features.UnicodeFilenameFeature)
5152.1.1 by Parth Malwankar
Fixed bug #413406. unicode names for parent directory
120
        basedir = u'\N{euro sign}'
121
        os.mkdir(basedir)
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
122
        self.run_bzr(['init', basedir])
123
        self.run_bzr(['export', '--format', 'tgz', u'test.tar.gz',
124
                      '-d', basedir])
125
126
    def test_zip_export_ignores_bzr(self):
127
        tree = self.make_tree_with_extra_bzr_files()
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
128
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
129
        self.assertTrue(tree.has_filename('.bzrignore'))
130
        self.assertTrue(tree.has_filename('.bzrrules'))
131
        self.assertTrue(tree.has_filename('.bzr-adir'))
132
        self.assertTrue(tree.has_filename('.bzr-adir/afile'))
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
133
        self.run_bzr('export test.zip -d tree')
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
134
135
        zfile = zipfile.ZipFile('test.zip')
136
        # Make sure the zipfile contains 'a', but does not contain
137
        # '.bzrignore'.
138
        self.assertEqual(['test/a'], sorted(zfile.namelist()))
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
139
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
140
    # TODO: This really looks like something that should be using permutation
141
    #       testing. Though the actual setup and teardown functions are pretty
142
    #       different for each
143
    def assertZipANameAndContent(self, zfile, root=''):
144
        """The file should only contain name 'a' and _file_content"""
145
        fname = root + 'a'
146
        self.assertEqual([fname], sorted(zfile.namelist()))
147
        zfile.testzip()
148
        self.assertEqualDiff(self._file_content, zfile.read(fname))
149
5718.5.9 by Jelmer Vernooij
Add test for export zip to stdout.
150
    def test_zip_export_stdout(self):
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
151
        tree = self.make_basic_tree()
152
        contents = self.run_bzr('export -d tree --format=zip -')[0]
153
        self.assertZipANameAndContent(zipfile.ZipFile(StringIO(contents)))
154
155
    def test_zip_export_file(self):
156
        tree = self.make_basic_tree()
157
        self.run_bzr('export -d tree test.zip')
158
        self.assertZipANameAndContent(zipfile.ZipFile('test.zip'),
159
                                      root='test/')
160
161
    def assertTarANameAndContent(self, ball, root=''):
162
        fname = root + 'a'
163
        tar_info = ball.next()
164
        self.assertEqual(fname, tar_info.name)
165
        self.assertEqual(tarfile.REGTYPE, tar_info.type)
166
        self.assertEqual(len(self._file_content), tar_info.size)
167
        f = ball.extractfile(tar_info)
168
        if self._file_content != f.read():
169
            self.fail('File content has been corrupted.'
170
                      ' Check that all streams are handled in binary mode.')
171
        # There should be no other files in the tarball
172
        self.assertIs(None, ball.next())
173
174
    def run_tar_export_disk_and_stdout(self, extension, tarfile_flags):
175
        tree = self.make_basic_tree()
176
        fname = 'test.%s' % (extension,)
5952.1.26 by Vincent Ladeuil
Fix the test failure, streams should be closed. In the right order.
177
        self.run_bzr('export -d tree %s' % (fname,))
5724.1.3 by John Arbash Meinel
Change the exporters to ensure that we are writing the data out in binary mode.
178
        mode = 'r|%s' % (tarfile_flags,)
179
        ball = tarfile.open(fname, mode=mode)
180
        self.assertTarANameAndContent(ball, root='test/')
181
        content = self.run_bzr('export -d tree --format=%s -' % (extension,))[0]
182
        ball = tarfile.open(mode=mode, fileobj=StringIO(content))
183
        self.assertTarANameAndContent(ball, root='')
184
185
    def test_tar_export(self):
186
        self.run_tar_export_disk_and_stdout('tar', '')
187
188
    def test_tgz_export(self):
189
        self.run_tar_export_disk_and_stdout('tgz', 'gz')
190
191
    def test_tbz2_export(self):
192
        self.run_tar_export_disk_and_stdout('tbz2', 'bz2')
193
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
194
    def test_zip_export_unicode(self):
5967.12.1 by Martin Pool
Move all test features into bzrlib.tests.features
195
        self.requireFeature(features.UnicodeFilenameFeature)
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
196
        tree = self.make_branch_and_tree('zip')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
197
        fname = u'\N{Euro Sign}.txt'
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
198
        self.build_tree(['zip/' + fname])
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
199
        tree.add([fname])
200
        tree.commit('first')
201
202
        os.chdir('zip')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
203
        self.run_bzr('export test.zip')
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
204
        zfile = zipfile.ZipFile('test.zip')
205
        # all paths are prefixed with the base name of the zipfile
206
        self.assertEqual(['test/' + fname.encode('utf8')],
207
                         sorted(zfile.namelist()))
1185.61.5 by Jamie Wilkinson
add test for directory export
208
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
209
    def test_zip_export_directories(self):
210
        tree = self.make_branch_and_tree('zip')
211
        self.build_tree(['zip/a', 'zip/b/', 'zip/b/c', 'zip/d/'])
212
        tree.add(['a', 'b', 'b/c', 'd'])
213
        tree.commit('init')
214
215
        os.chdir('zip')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
216
        self.run_bzr('export test.zip')
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
217
        zfile = zipfile.ZipFile('test.zip')
218
        names = sorted(zfile.namelist())
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
219
2024.2.8 by John Arbash Meinel
paths are always forward slashed for python zipfiles
220
        # even on win32, zipfile.ZipFile changes all names to use
221
        # forward slashes
222
        self.assertEqual(['test/a', 'test/b/', 'test/b/c', 'test/d/'], names)
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
223
4823.1.2 by Ivan Sagalaev
File mode is given a name and gets tested
224
        file_attr = stat.S_IFREG | export.zip_exporter.FILE_PERMISSIONS
5664.2.1 by Jelmer Vernooij
Fix setting of mode on directories in zip files.
225
        dir_attr = (stat.S_IFDIR | export.zip_exporter.ZIP_DIRECTORY_BIT |
226
                    export.zip_exporter.DIR_PERMISSIONS)
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
227
228
        a_info = zfile.getinfo(names[0])
229
        self.assertEqual(file_attr, a_info.external_attr)
230
231
        b_info = zfile.getinfo(names[1])
232
        self.assertEqual(dir_attr, b_info.external_attr)
233
234
        c_info = zfile.getinfo(names[2])
235
        self.assertEqual(file_attr, c_info.external_attr)
236
237
        d_info = zfile.getinfo(names[3])
238
        self.assertEqual(dir_attr, d_info.external_attr)
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
239
1185.61.5 by Jamie Wilkinson
add test for directory export
240
    def test_dir_export(self):
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
241
        tree = self.make_branch_and_tree('dir')
242
        self.build_tree(['dir/a'])
243
        tree.add('a')
3577.3.1 by Ian Clatworthy
do not export .bzrrules
244
        self.build_tree_contents([('dir/.bzrrules', '')])
245
        tree.add('.bzrrules')
3577.3.2 by Ian Clatworthy
tweaks following jam's review
246
        self.build_tree(['dir/.bzr-adir/', 'dir/.bzr-adir/afile'])
247
        tree.add(['.bzr-adir/', '.bzr-adir/afile'])
1185.61.5 by Jamie Wilkinson
add test for directory export
248
249
        os.chdir('dir')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
250
        self.run_bzr('ignore something')
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
251
        tree.commit('1')
1185.61.5 by Jamie Wilkinson
add test for directory export
252
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
253
        self.assertTrue(tree.has_filename('.bzrignore'))
254
        self.assertTrue(tree.has_filename('.bzrrules'))
255
        self.assertTrue(tree.has_filename('.bzr-adir'))
256
        self.assertTrue(tree.has_filename('.bzr-adir/afile'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
257
        self.run_bzr('export direxport')
1185.61.5 by Jamie Wilkinson
add test for directory export
258
259
        files = sorted(os.listdir('direxport'))
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
260
        # Make sure the exported directory contains 'a', but does not contain
261
        # '.bzrignore'.
262
        self.assertEqual(['a'], files)
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
263
264
    def example_branch(self):
3613.2.1 by Robert Collins
Teach export how to export a subdirectory. (Robert Collins)
265
        """Create a branch a 'branch' containing hello and goodbye."""
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
266
        tree = self.make_branch_and_tree('branch')
2024.2.4 by John Arbash Meinel
Use build_tree_contents instead of manually opening the file
267
        self.build_tree_contents([('branch/hello', 'foo')])
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
268
        tree.add('hello')
269
        tree.commit('setup')
270
2024.2.4 by John Arbash Meinel
Use build_tree_contents instead of manually opening the file
271
        self.build_tree_contents([('branch/goodbye', 'baz')])
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
272
        tree.add('goodbye')
273
        tree.commit('setup')
274
        return tree
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
275
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
276
    def test_basic_directory_export(self):
277
        self.example_branch()
278
        os.chdir('branch')
279
280
        # Directory exports
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
281
        self.run_bzr('export ../latest')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
282
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
283
        self.check_file_contents('../latest/goodbye', 'baz')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
284
        self.run_bzr('export ../first -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
285
        self.assertEqual(['hello'], sorted(os.listdir('../first')))
286
        self.check_file_contents('../first/hello', 'foo')
287
288
        # Even with .gz and .bz2 it is still a directory
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
289
        self.run_bzr('export ../first.gz -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
290
        self.check_file_contents('../first.gz/hello', 'foo')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
291
        self.run_bzr('export ../first.bz2 -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
292
        self.check_file_contents('../first.bz2/hello', 'foo')
293
294
    def test_basic_tarfile_export(self):
295
        self.example_branch()
296
        os.chdir('branch')
297
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
298
        self.run_bzr('export ../first.tar -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
299
        self.assertTrue(os.path.isfile('../first.tar'))
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
300
        tf = tarfile.open('../first.tar')
301
        try:
302
            self.assertEqual(['first/hello'], sorted(tf.getnames()))
303
            self.assertEqual('foo', tf.extractfile('first/hello').read())
304
        finally:
305
            tf.close()
306
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
307
        self.run_bzr('export ../first.tar.gz -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
308
        self.assertTrue(os.path.isfile('../first.tar.gz'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
309
        self.run_bzr('export ../first.tbz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
310
        self.assertTrue(os.path.isfile('../first.tbz2'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
311
        self.run_bzr('export ../first.tar.bz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
312
        self.assertTrue(os.path.isfile('../first.tar.bz2'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
313
        self.run_bzr('export ../first.tar.tbz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
314
        self.assertTrue(os.path.isfile('../first.tar.tbz2'))
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
315
316
        tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
317
        try:
318
            self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
319
            self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
320
        finally:
321
            tf.close()
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
322
        self.run_bzr('export ../first2.tar -r 1 --root pizza')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
323
        tf = tarfile.open('../first2.tar')
324
        try:
325
            self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
326
            self.assertEqual('foo', tf.extractfile('pizza/hello').read())
327
        finally:
328
            tf.close()
329
330
    def test_basic_zipfile_export(self):
331
        self.example_branch()
332
        os.chdir('branch')
333
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
334
        self.run_bzr('export ../first.zip -r 1')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
335
        self.assertPathExists('../first.zip')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
336
        zf = zipfile.ZipFile('../first.zip')
337
        try:
338
            self.assertEqual(['first/hello'], sorted(zf.namelist()))
339
            self.assertEqual('foo', zf.read('first/hello'))
340
        finally:
341
            zf.close()
342
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
343
        self.run_bzr('export ../first2.zip -r 1 --root pizza')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
344
        zf = zipfile.ZipFile('../first2.zip')
345
        try:
346
            self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
347
            self.assertEqual('foo', zf.read('pizza/hello'))
348
        finally:
349
            zf.close()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
350
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
351
        self.run_bzr('export ../first-zip --format=zip -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
352
        zf = zipfile.ZipFile('../first-zip')
353
        try:
354
            self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
355
            self.assertEqual('foo', zf.read('first-zip/hello'))
356
        finally:
357
            zf.close()
358
2099.1.1 by Daniel Silverstone
Add source branch support to export command
359
    def test_export_from_outside_branch(self):
360
        self.example_branch()
361
362
        # Use directory exports to test stating the branch location
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
363
        self.run_bzr('export latest branch')
2099.1.1 by Daniel Silverstone
Add source branch support to export command
364
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
365
        self.check_file_contents('latest/goodbye', 'baz')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
366
        self.run_bzr('export first -r 1 branch')
2099.1.1 by Daniel Silverstone
Add source branch support to export command
367
        self.assertEqual(['hello'], sorted(os.listdir('first')))
368
        self.check_file_contents('first/hello', 'foo')
3613.2.1 by Robert Collins
Teach export how to export a subdirectory. (Robert Collins)
369
370
    def test_export_partial_tree(self):
371
        tree = self.example_branch()
372
        self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
373
        tree.smart_add(['branch'])
374
        tree.commit('more setup')
375
        out, err = self.run_bzr('export exported branch/subdir')
376
        self.assertEqual(['foo.txt'], os.listdir('exported'))
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
377
5076.2.3 by Jelmer Vernooij
Review comments from Rob.
378
    def test_dir_export_per_file_timestamps(self):
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
379
        tree = self.example_branch()
380
        self.build_tree_contents([('branch/har', 'foo')])
381
        tree.add('har')
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
382
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
383
        tree.commit('setup', timestamp=315532800)
5076.2.3 by Jelmer Vernooij
Review comments from Rob.
384
        self.run_bzr('export --per-file-timestamps t branch')
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
385
        har_st = os.stat('t/har')
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
386
        self.assertEquals(315532800, har_st.st_mtime)
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
387
5966.1.1 by Szilveszter Farkas
Fixed exporting subdirectories with per file timestamps.
388
    def test_dir_export_partial_tree_per_file_timestamps(self):
389
        tree = self.example_branch()
390
        self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
391
        tree.smart_add(['branch'])
392
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
393
        tree.commit('setup', timestamp=315532800)
394
        self.run_bzr('export --per-file-timestamps tpart branch/subdir')
395
        foo_st = os.stat('tpart/foo.txt')
396
        self.assertEquals(315532800, foo_st.st_mtime)
397
5171.3.7 by Martin von Gagern
Added blackbox tests for --directory option.
398
    def test_export_directory(self):
399
        """Test --directory option"""
400
        self.example_branch()
401
        self.run_bzr(['export', '--directory=branch', 'latest'])
402
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
403
        self.check_file_contents('latest/goodbye', 'baz')
5718.5.13 by Jelmer Vernooij
Add test for zip with per-file-timestamps.
404
6331.2.2 by Jelmer Vernooij
Add --uncommitted option to export.
405
    def test_export_uncommitted(self):
406
        """Test --uncommitted option"""
407
        self.example_branch()
408
        os.chdir('branch')
409
        self.build_tree_contents([('goodbye', 'uncommitted data')])
410
        self.run_bzr(['export', '--uncommitted', 'latest'])
411
        self.check_file_contents('latest/goodbye', 'uncommitted data')
412
413
    def test_export_uncommitted_no_tree(self):
414
        """Test --uncommitted option only works with a working tree."""
415
        tree = self.example_branch()
416
        tree.bzrdir.destroy_workingtree()
417
        os.chdir('branch')
418
        self.run_bzr_error(
419
            ['bzr: ERROR: --uncommitted requires a working tree'],
420
            'export --uncommitted latest')
421
5718.5.13 by Jelmer Vernooij
Add test for zip with per-file-timestamps.
422
    def test_zip_export_per_file_timestamps(self):
423
        tree = self.example_branch()
424
        self.build_tree_contents([('branch/har', 'foo')])
425
        tree.add('har')
426
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
427
        timestamp = 347151600
428
        tree.commit('setup', timestamp=timestamp)
5718.5.13 by Jelmer Vernooij
Add test for zip with per-file-timestamps.
429
        self.run_bzr('export --per-file-timestamps test.zip branch')
430
        zfile = zipfile.ZipFile('test.zip')
431
        info = zfile.getinfo("test/har")
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
432
        self.assertEquals(time.localtime(timestamp)[:6], info.date_time)
6283.1.12 by Jelmer Vernooij
Add hpss call count test for 'bzr export'.
433
434
435
class TestSmartServerExport(TestCaseWithTransport):
436
437
    def test_simple_export(self):
438
        self.setup_smart_server_with_call_log()
439
        t = self.make_branch_and_tree('branch')
440
        self.build_tree_contents([('branch/foo', 'thecontents')])
441
        t.add("foo")
442
        t.commit("message")
443
        self.reset_smart_call_log()
444
        out, err = self.run_bzr(['export', "foo.tar.gz", self.get_url('branch')])
445
        # This figure represent the amount of work to perform this use case. It
446
        # is entirely ok to reduce this number if a test fails due to rpc_count
447
        # being too low. If rpc_count increases, more network roundtrips have
448
        # become necessary for this use case. Please do not adjust this number
449
        # upwards without agreement from bzr's network support maintainers.
6280.10.27 by Jelmer Vernooij
Merge bzr.dev, fix hpss call counts.
450
        self.assertLength(16, self.hpss_calls)