/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_export.py

First attempt to merge .dev and resolve the conflicts (but tests are 
failing)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: utf-8 -*-
 
1
# Copyright (C) 2005, 2006, 2008 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
"""Black-box tests for bzr export.
19
19
"""
20
20
 
 
21
from StringIO import StringIO
21
22
import os
 
23
import stat
 
24
import sys
 
25
import tarfile
 
26
import zipfile
22
27
 
23
 
from bzrlib.branch import Branch
 
28
from bzrlib.export import (
 
29
    zip_exporter,
 
30
    )
 
31
from bzrlib.tests import TestSkipped
24
32
from bzrlib.tests.blackbox import ExternalBase
25
 
import tarfile, zipfile
 
33
 
26
34
 
27
35
class TestExport(ExternalBase):
28
36
 
29
37
    def test_tar_export(self):
 
38
        tree = self.make_branch_and_tree('tar')
 
39
        self.build_tree(['tar/a'])
 
40
        tree.add('a')
 
41
        self.build_tree_contents([('tar/.bzrrules', '')])
 
42
        tree.add('.bzrrules')
 
43
        self.build_tree(['tar/.bzr-adir/', 'tar/.bzr-adir/afile'])
 
44
        tree.add(['.bzr-adir/', '.bzr-adir/afile'])
30
45
 
31
 
        os.mkdir('tar')
32
46
        os.chdir('tar')
 
47
        self.run_bzr('ignore something')
 
48
        tree.commit('1')
33
49
 
34
 
        self.runbzr('init')
35
 
        open('a', 'wb').write('foo\n')
36
 
        self.runbzr('add a')
37
 
        self.runbzr('ignore something')
38
 
        self.runbzr('commit -m 1')
39
 
        self.runbzr('export test.tar.gz')
 
50
        self.failUnless(tree.has_filename('.bzrignore'))
 
51
        self.failUnless(tree.has_filename('.bzrrules'))
 
52
        self.failUnless(tree.has_filename('.bzr-adir'))
 
53
        self.failUnless(tree.has_filename('.bzr-adir/afile'))
 
54
        self.run_bzr('export test.tar.gz')
40
55
        ball = tarfile.open('test.tar.gz')
41
 
        for m in ball.getnames():
42
 
            #print m
43
 
            self.failIf(os.path.basename(m) == '.bzrignore', 'tar export contains .bzrignore')
 
56
        # Make sure the tarball contains 'a', but does not contain
 
57
        # '.bzrignore'.
 
58
        self.assertEqual(['test/a'], sorted(ball.getnames()))
 
59
 
 
60
        out, err = self.run_bzr('export --format=tgz --root=test -')
 
61
        ball = tarfile.open('', fileobj=StringIO(out))
 
62
        self.assertEqual(['test/a'], sorted(ball.getnames()))
 
63
 
 
64
    def test_tar_export_unicode(self):
 
65
        tree = self.make_branch_and_tree('tar')
 
66
        fname = u'\xe5.txt'
 
67
        try:
 
68
            self.build_tree(['tar/' + fname])
 
69
        except UnicodeError:
 
70
            raise TestSkipped('Unable to represent path %r' % (fname,))
 
71
        tree.add([fname])
 
72
        tree.commit('first')
 
73
 
 
74
        os.chdir('tar')
 
75
        self.run_bzr('export test.tar')
 
76
        ball = tarfile.open('test.tar')
 
77
        # all paths are prefixed with the base name of the tarball
 
78
        self.assertEqual(['test/' + fname.encode('utf8')],
 
79
                         sorted(ball.getnames()))
44
80
 
45
81
    def test_zip_export(self):
46
 
 
47
 
        os.mkdir('zip')
48
 
        os.chdir('zip')
49
 
 
50
 
        self.runbzr('init')
51
 
        open('a', 'wb').write('foo\n')
52
 
        self.runbzr('add a')
53
 
        self.runbzr('ignore something')
54
 
        self.runbzr('commit -m 1')
55
 
        self.runbzr('export test.zip')
56
 
        ball = zipfile.ZipFile('test.zip')
57
 
        for m in ball.namelist():
58
 
            #print m
59
 
            self.failIf(os.path.basename(m) == '.bzrignore', 'zip export contains .bzrignore')
 
82
        tree = self.make_branch_and_tree('zip')
 
83
        self.build_tree(['zip/a'])
 
84
        tree.add('a')
 
85
        self.build_tree_contents([('zip/.bzrrules', '')])
 
86
        tree.add('.bzrrules')
 
87
        self.build_tree(['zip/.bzr-adir/', 'zip/.bzr-adir/afile'])
 
88
        tree.add(['.bzr-adir/', '.bzr-adir/afile'])
 
89
 
 
90
        os.chdir('zip')
 
91
        self.run_bzr('ignore something')
 
92
        tree.commit('1')
 
93
 
 
94
        self.failUnless(tree.has_filename('.bzrignore'))
 
95
        self.failUnless(tree.has_filename('.bzrrules'))
 
96
        self.failUnless(tree.has_filename('.bzr-adir'))
 
97
        self.failUnless(tree.has_filename('.bzr-adir/afile'))
 
98
        self.run_bzr('export test.zip')
 
99
 
 
100
        zfile = zipfile.ZipFile('test.zip')
 
101
        # Make sure the zipfile contains 'a', but does not contain
 
102
        # '.bzrignore'.
 
103
        self.assertEqual(['test/a'], sorted(zfile.namelist()))
 
104
 
 
105
    def test_zip_export_unicode(self):
 
106
        tree = self.make_branch_and_tree('zip')
 
107
        fname = u'\xe5.txt'
 
108
        try:
 
109
            self.build_tree(['zip/' + fname])
 
110
        except UnicodeError:
 
111
            raise TestSkipped('Unable to represent path %r' % (fname,))
 
112
        tree.add([fname])
 
113
        tree.commit('first')
 
114
 
 
115
        os.chdir('zip')
 
116
        self.run_bzr('export test.zip')
 
117
        zfile = zipfile.ZipFile('test.zip')
 
118
        # all paths are prefixed with the base name of the zipfile
 
119
        self.assertEqual(['test/' + fname.encode('utf8')],
 
120
                         sorted(zfile.namelist()))
 
121
 
 
122
    def test_zip_export_directories(self):
 
123
        tree = self.make_branch_and_tree('zip')
 
124
        self.build_tree(['zip/a', 'zip/b/', 'zip/b/c', 'zip/d/'])
 
125
        tree.add(['a', 'b', 'b/c', 'd'])
 
126
        tree.commit('init')
 
127
 
 
128
        os.chdir('zip')
 
129
        self.run_bzr('export test.zip')
 
130
        zfile = zipfile.ZipFile('test.zip')
 
131
        names = sorted(zfile.namelist())
 
132
 
 
133
        # even on win32, zipfile.ZipFile changes all names to use
 
134
        # forward slashes
 
135
        self.assertEqual(['test/a', 'test/b/', 'test/b/c', 'test/d/'], names)
 
136
 
 
137
        file_attr = stat.S_IFREG
 
138
        dir_attr = stat.S_IFDIR | zip_exporter.ZIP_DIRECTORY_BIT
 
139
 
 
140
        a_info = zfile.getinfo(names[0])
 
141
        self.assertEqual(file_attr, a_info.external_attr)
 
142
 
 
143
        b_info = zfile.getinfo(names[1])
 
144
        self.assertEqual(dir_attr, b_info.external_attr)
 
145
 
 
146
        c_info = zfile.getinfo(names[2])
 
147
        self.assertEqual(file_attr, c_info.external_attr)
 
148
 
 
149
        d_info = zfile.getinfo(names[3])
 
150
        self.assertEqual(dir_attr, d_info.external_attr)
60
151
 
61
152
    def test_dir_export(self):
 
153
        tree = self.make_branch_and_tree('dir')
 
154
        self.build_tree(['dir/a'])
 
155
        tree.add('a')
 
156
        self.build_tree_contents([('dir/.bzrrules', '')])
 
157
        tree.add('.bzrrules')
 
158
        self.build_tree(['dir/.bzr-adir/', 'dir/.bzr-adir/afile'])
 
159
        tree.add(['.bzr-adir/', '.bzr-adir/afile'])
62
160
 
63
 
        os.mkdir('dir')
64
161
        os.chdir('dir')
 
162
        self.run_bzr('ignore something')
 
163
        tree.commit('1')
65
164
 
66
 
        self.runbzr('init')
67
 
        open('a', 'wb').write('foo\n')
68
 
        self.runbzr('add a')
69
 
        self.runbzr('ignore something')
70
 
        self.runbzr('commit -m 1')
71
 
        self.runbzr('export direxport')
 
165
        self.failUnless(tree.has_filename('.bzrignore'))
 
166
        self.failUnless(tree.has_filename('.bzrrules'))
 
167
        self.failUnless(tree.has_filename('.bzr-adir'))
 
168
        self.failUnless(tree.has_filename('.bzr-adir/afile'))
 
169
        self.run_bzr('export direxport')
72
170
 
73
171
        files = sorted(os.listdir('direxport'))
74
 
        self.assertEqual(['a'], files, 'dir contains .bzrignore')
 
172
        # Make sure the exported directory contains 'a', but does not contain
 
173
        # '.bzrignore'.
 
174
        self.assertEqual(['a'], files)
 
175
 
 
176
    def example_branch(self):
 
177
        """Create a branch a 'branch' containing hello and goodbye."""
 
178
        tree = self.make_branch_and_tree('branch')
 
179
        self.build_tree_contents([('branch/hello', 'foo')])
 
180
        tree.add('hello')
 
181
        tree.commit('setup')
 
182
 
 
183
        self.build_tree_contents([('branch/goodbye', 'baz')])
 
184
        tree.add('goodbye')
 
185
        tree.commit('setup')
 
186
        return tree
 
187
        
 
188
    def test_basic_directory_export(self):
 
189
        self.example_branch()
 
190
        os.chdir('branch')
 
191
 
 
192
        # Directory exports
 
193
        self.run_bzr('export ../latest')
 
194
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
 
195
        self.check_file_contents('../latest/goodbye', 'baz')
 
196
        self.run_bzr('export ../first -r 1')
 
197
        self.assertEqual(['hello'], sorted(os.listdir('../first')))
 
198
        self.check_file_contents('../first/hello', 'foo')
 
199
 
 
200
        # Even with .gz and .bz2 it is still a directory
 
201
        self.run_bzr('export ../first.gz -r 1')
 
202
        self.check_file_contents('../first.gz/hello', 'foo')
 
203
        self.run_bzr('export ../first.bz2 -r 1')
 
204
        self.check_file_contents('../first.bz2/hello', 'foo')
 
205
 
 
206
    def test_basic_tarfile_export(self):
 
207
        self.example_branch()
 
208
        os.chdir('branch')
 
209
 
 
210
        self.run_bzr('export ../first.tar -r 1')
 
211
        self.failUnless(os.path.isfile('../first.tar'))
 
212
        tf = tarfile.open('../first.tar')
 
213
        try:
 
214
            self.assertEqual(['first/hello'], sorted(tf.getnames()))
 
215
            self.assertEqual('foo', tf.extractfile('first/hello').read())
 
216
        finally:
 
217
            tf.close()
 
218
 
 
219
        self.run_bzr('export ../first.tar.gz -r 1')
 
220
        self.failUnless(os.path.isfile('../first.tar.gz'))
 
221
        self.run_bzr('export ../first.tbz2 -r 1')
 
222
        self.failUnless(os.path.isfile('../first.tbz2'))
 
223
        self.run_bzr('export ../first.tar.bz2 -r 1')
 
224
        self.failUnless(os.path.isfile('../first.tar.bz2'))
 
225
        self.run_bzr('export ../first.tar.tbz2 -r 1')
 
226
        self.failUnless(os.path.isfile('../first.tar.tbz2'))
 
227
 
 
228
        tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
 
229
        try:
 
230
            self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
 
231
            self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
 
232
        finally:
 
233
            tf.close()
 
234
        self.run_bzr('export ../first2.tar -r 1 --root pizza')
 
235
        tf = tarfile.open('../first2.tar')
 
236
        try:
 
237
            self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
 
238
            self.assertEqual('foo', tf.extractfile('pizza/hello').read())
 
239
        finally:
 
240
            tf.close()
 
241
 
 
242
    def test_basic_zipfile_export(self):
 
243
        self.example_branch()
 
244
        os.chdir('branch')
 
245
 
 
246
        self.run_bzr('export ../first.zip -r 1')
 
247
        self.failUnlessExists('../first.zip')
 
248
        zf = zipfile.ZipFile('../first.zip')
 
249
        try:
 
250
            self.assertEqual(['first/hello'], sorted(zf.namelist()))
 
251
            self.assertEqual('foo', zf.read('first/hello'))
 
252
        finally:
 
253
            zf.close()
 
254
 
 
255
        self.run_bzr('export ../first2.zip -r 1 --root pizza')
 
256
        zf = zipfile.ZipFile('../first2.zip')
 
257
        try:
 
258
            self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
 
259
            self.assertEqual('foo', zf.read('pizza/hello'))
 
260
        finally:
 
261
            zf.close()
 
262
        
 
263
        self.run_bzr('export ../first-zip --format=zip -r 1')
 
264
        zf = zipfile.ZipFile('../first-zip')
 
265
        try:
 
266
            self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
 
267
            self.assertEqual('foo', zf.read('first-zip/hello'))
 
268
        finally:
 
269
            zf.close()
 
270
 
 
271
    def test_export_from_outside_branch(self):
 
272
        self.example_branch()
 
273
 
 
274
        # Use directory exports to test stating the branch location
 
275
        self.run_bzr('export latest branch')
 
276
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('latest')))
 
277
        self.check_file_contents('latest/goodbye', 'baz')
 
278
        self.run_bzr('export first -r 1 branch')
 
279
        self.assertEqual(['hello'], sorted(os.listdir('first')))
 
280
        self.check_file_contents('first/hello', 'foo')
 
281
 
 
282
    def test_export_partial_tree(self):
 
283
        tree = self.example_branch()
 
284
        self.build_tree(['branch/subdir/', 'branch/subdir/foo.txt'])
 
285
        tree.smart_add(['branch'])
 
286
        tree.commit('more setup')
 
287
        out, err = self.run_bzr('export exported branch/subdir')
 
288
        self.assertEqual(['foo.txt'], os.listdir('exported'))