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