/brz/remove-bazaar

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