/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
24
import sys
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
25
import tarfile
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
26
import time
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
27
import zipfile
1185.61.1 by Jamie Wilkinson
add blackbox tests for ensuring .bzrignore is not exported
28
4241.9.1 by Vincent Ladeuil
Fix test_tar_export erroring test.
29
30
from bzrlib import (
31
    export,
5724.1.2 by John Arbash Meinel
Force test_tar_export to test that it outputs in binary.
32
    osutils,
4241.9.1 by Vincent Ladeuil
Fix test_tar_export erroring test.
33
    tests,
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
34
    )
5283.4.5 by Martin Pool
Update remaining subclasses of ExternalBase
35
from bzrlib.tests import TestCaseWithTransport
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):
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
101
        self.requireFeature(tests.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"""
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
119
        self.requireFeature(tests.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
194
    # TODO: test_xz_export, I don't have pylzma working here to test it.
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
195
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
196
    def test_zip_export_unicode(self):
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
197
        self.requireFeature(tests.UnicodeFilenameFeature)
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
198
        tree = self.make_branch_and_tree('zip')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
199
        fname = u'\N{Euro Sign}.txt'
5050.37.1 by Andrew Bennetts
Some fixes for tests that did not cope with LANG=C.
200
        self.build_tree(['zip/' + fname])
2024.2.1 by John Arbash Meinel
Fix bug #56815 by exporting paths in utf8 to tarfile and zipfile
201
        tree.add([fname])
202
        tree.commit('first')
203
204
        os.chdir('zip')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
205
        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
206
        zfile = zipfile.ZipFile('test.zip')
207
        # all paths are prefixed with the base name of the zipfile
208
        self.assertEqual(['test/' + fname.encode('utf8')],
209
                         sorted(zfile.namelist()))
1185.61.5 by Jamie Wilkinson
add test for directory export
210
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
211
    def test_zip_export_directories(self):
212
        tree = self.make_branch_and_tree('zip')
213
        self.build_tree(['zip/a', 'zip/b/', 'zip/b/c', 'zip/d/'])
214
        tree.add(['a', 'b', 'b/c', 'd'])
215
        tree.commit('init')
216
217
        os.chdir('zip')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
218
        self.run_bzr('export test.zip')
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
219
        zfile = zipfile.ZipFile('test.zip')
220
        names = sorted(zfile.namelist())
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
221
2024.2.8 by John Arbash Meinel
paths are always forward slashed for python zipfiles
222
        # even on win32, zipfile.ZipFile changes all names to use
223
        # forward slashes
224
        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
225
4823.1.2 by Ivan Sagalaev
File mode is given a name and gets tested
226
        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.
227
        dir_attr = (stat.S_IFDIR | export.zip_exporter.ZIP_DIRECTORY_BIT |
228
                    export.zip_exporter.DIR_PERMISSIONS)
2024.2.7 by John Arbash Meinel
Set the external_attr bits so Windows respects our directories
229
230
        a_info = zfile.getinfo(names[0])
231
        self.assertEqual(file_attr, a_info.external_attr)
232
233
        b_info = zfile.getinfo(names[1])
234
        self.assertEqual(dir_attr, b_info.external_attr)
235
236
        c_info = zfile.getinfo(names[2])
237
        self.assertEqual(file_attr, c_info.external_attr)
238
239
        d_info = zfile.getinfo(names[3])
240
        self.assertEqual(dir_attr, d_info.external_attr)
2024.2.6 by John Arbash Meinel
In zip files, directories must have trailing slashes
241
1185.61.5 by Jamie Wilkinson
add test for directory export
242
    def test_dir_export(self):
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
243
        tree = self.make_branch_and_tree('dir')
244
        self.build_tree(['dir/a'])
245
        tree.add('a')
3577.3.1 by Ian Clatworthy
do not export .bzrrules
246
        self.build_tree_contents([('dir/.bzrrules', '')])
247
        tree.add('.bzrrules')
3577.3.2 by Ian Clatworthy
tweaks following jam's review
248
        self.build_tree(['dir/.bzr-adir/', 'dir/.bzr-adir/afile'])
249
        tree.add(['.bzr-adir/', '.bzr-adir/afile'])
1185.61.5 by Jamie Wilkinson
add test for directory export
250
251
        os.chdir('dir')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
252
        self.run_bzr('ignore something')
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
253
        tree.commit('1')
1185.61.5 by Jamie Wilkinson
add test for directory export
254
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
255
        self.assertTrue(tree.has_filename('.bzrignore'))
256
        self.assertTrue(tree.has_filename('.bzrrules'))
257
        self.assertTrue(tree.has_filename('.bzr-adir'))
258
        self.assertTrue(tree.has_filename('.bzr-adir/afile'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
259
        self.run_bzr('export direxport')
1185.61.5 by Jamie Wilkinson
add test for directory export
260
261
        files = sorted(os.listdir('direxport'))
2024.2.2 by John Arbash Meinel
Cleanup the export tests to act more like the current api.
262
        # Make sure the exported directory contains 'a', but does not contain
263
        # '.bzrignore'.
264
        self.assertEqual(['a'], files)
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
265
266
    def example_branch(self):
3613.2.1 by Robert Collins
Teach export how to export a subdirectory. (Robert Collins)
267
        """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
268
        tree = self.make_branch_and_tree('branch')
2024.2.4 by John Arbash Meinel
Use build_tree_contents instead of manually opening the file
269
        self.build_tree_contents([('branch/hello', 'foo')])
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
270
        tree.add('hello')
271
        tree.commit('setup')
272
2024.2.4 by John Arbash Meinel
Use build_tree_contents instead of manually opening the file
273
        self.build_tree_contents([('branch/goodbye', 'baz')])
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
274
        tree.add('goodbye')
275
        tree.commit('setup')
276
        return tree
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
277
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
278
    def test_basic_directory_export(self):
279
        self.example_branch()
280
        os.chdir('branch')
281
282
        # Directory exports
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
283
        self.run_bzr('export ../latest')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
284
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
285
        self.check_file_contents('../latest/goodbye', 'baz')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
286
        self.run_bzr('export ../first -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
287
        self.assertEqual(['hello'], sorted(os.listdir('../first')))
288
        self.check_file_contents('../first/hello', 'foo')
289
290
        # Even with .gz and .bz2 it is still a directory
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
291
        self.run_bzr('export ../first.gz -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
292
        self.check_file_contents('../first.gz/hello', 'foo')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
293
        self.run_bzr('export ../first.bz2 -r 1')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
294
        self.check_file_contents('../first.bz2/hello', 'foo')
295
296
    def test_basic_tarfile_export(self):
297
        self.example_branch()
298
        os.chdir('branch')
299
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
300
        self.run_bzr('export ../first.tar -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
301
        self.assertTrue(os.path.isfile('../first.tar'))
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
302
        tf = tarfile.open('../first.tar')
303
        try:
304
            self.assertEqual(['first/hello'], sorted(tf.getnames()))
305
            self.assertEqual('foo', tf.extractfile('first/hello').read())
306
        finally:
307
            tf.close()
308
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
309
        self.run_bzr('export ../first.tar.gz -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
310
        self.assertTrue(os.path.isfile('../first.tar.gz'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
311
        self.run_bzr('export ../first.tbz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
312
        self.assertTrue(os.path.isfile('../first.tbz2'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
313
        self.run_bzr('export ../first.tar.bz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
314
        self.assertTrue(os.path.isfile('../first.tar.bz2'))
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
315
        self.run_bzr('export ../first.tar.tbz2 -r 1')
5784.1.1 by Martin Pool
Stop using failIf, failUnless, etc
316
        self.assertTrue(os.path.isfile('../first.tar.tbz2'))
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
317
318
        tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
319
        try:
320
            self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
321
            self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
322
        finally:
323
            tf.close()
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
324
        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
325
        tf = tarfile.open('../first2.tar')
326
        try:
327
            self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
328
            self.assertEqual('foo', tf.extractfile('pizza/hello').read())
329
        finally:
330
            tf.close()
331
332
    def test_basic_zipfile_export(self):
333
        self.example_branch()
334
        os.chdir('branch')
335
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
336
        self.run_bzr('export ../first.zip -r 1')
5784.1.3 by Martin Pool
Switch away from using failUnlessExists and failIfExists
337
        self.assertPathExists('../first.zip')
2024.2.3 by John Arbash Meinel
Move out export tests from test_too_much, refactor
338
        zf = zipfile.ZipFile('../first.zip')
339
        try:
340
            self.assertEqual(['first/hello'], sorted(zf.namelist()))
341
            self.assertEqual('foo', zf.read('first/hello'))
342
        finally:
343
            zf.close()
344
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
345
        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
346
        zf = zipfile.ZipFile('../first2.zip')
347
        try:
348
            self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
349
            self.assertEqual('foo', zf.read('pizza/hello'))
350
        finally:
351
            zf.close()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
352
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
353
        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
354
        zf = zipfile.ZipFile('../first-zip')
355
        try:
356
            self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
357
            self.assertEqual('foo', zf.read('first-zip/hello'))
358
        finally:
359
            zf.close()
360
2099.1.1 by Daniel Silverstone
Add source branch support to export command
361
    def test_export_from_outside_branch(self):
362
        self.example_branch()
363
364
        # Use directory exports to test stating the branch location
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
365
        self.run_bzr('export latest branch')
2099.1.1 by Daniel Silverstone
Add source branch support to export command
366
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
367
        self.check_file_contents('latest/goodbye', 'baz')
2552.2.3 by Vincent Ladeuil
Deprecate the varargs syntax and fix the tests.
368
        self.run_bzr('export first -r 1 branch')
2099.1.1 by Daniel Silverstone
Add source branch support to export command
369
        self.assertEqual(['hello'], sorted(os.listdir('first')))
370
        self.check_file_contents('first/hello', 'foo')
3613.2.1 by Robert Collins
Teach export how to export a subdirectory. (Robert Collins)
371
372
    def test_export_partial_tree(self):
373
        tree = self.example_branch()
374
        self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
375
        tree.smart_add(['branch'])
376
        tree.commit('more setup')
377
        out, err = self.run_bzr('export exported branch/subdir')
378
        self.assertEqual(['foo.txt'], os.listdir('exported'))
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
379
5076.2.3 by Jelmer Vernooij
Review comments from Rob.
380
    def test_dir_export_per_file_timestamps(self):
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
381
        tree = self.example_branch()
382
        self.build_tree_contents([('branch/har', 'foo')])
383
        tree.add('har')
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
384
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
385
        tree.commit('setup', timestamp=315532800)
5076.2.3 by Jelmer Vernooij
Review comments from Rob.
386
        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``
387
        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
388
        self.assertEquals(315532800, har_st.st_mtime)
5076.2.2 by Jelmer Vernooij
``bzr export`` now takes an optional argument ``--use-tree-timestamp``
389
5966.1.1 by Szilveszter Farkas
Fixed exporting subdirectories with per file timestamps.
390
    def test_dir_export_partial_tree_per_file_timestamps(self):
391
        tree = self.example_branch()
392
        self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
393
        tree.smart_add(['branch'])
394
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
395
        tree.commit('setup', timestamp=315532800)
396
        self.run_bzr('export --per-file-timestamps tpart branch/subdir')
397
        foo_st = os.stat('tpart/foo.txt')
398
        self.assertEquals(315532800, foo_st.st_mtime)
399
5171.3.7 by Martin von Gagern
Added blackbox tests for --directory option.
400
    def test_export_directory(self):
401
        """Test --directory option"""
402
        self.example_branch()
403
        self.run_bzr(['export', '--directory=branch', 'latest'])
404
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
405
        self.check_file_contents('latest/goodbye', 'baz')
5718.5.13 by Jelmer Vernooij
Add test for zip with per-file-timestamps.
406
407
    def test_zip_export_per_file_timestamps(self):
408
        tree = self.example_branch()
409
        self.build_tree_contents([('branch/har', 'foo')])
410
        tree.add('har')
411
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
412
        timestamp = 347151600
413
        tree.commit('setup', timestamp=timestamp)
5718.5.13 by Jelmer Vernooij
Add test for zip with per-file-timestamps.
414
        self.run_bzr('export --per-file-timestamps test.zip branch')
415
        zfile = zipfile.ZipFile('test.zip')
416
        info = zfile.getinfo("test/har")
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
417
        self.assertEquals(time.localtime(timestamp)[:6], info.date_time)