~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

(jam) export utf-8 paths to tarballs and zipfiles

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
"""
20
20
 
21
21
import os
 
22
import tarfile
 
23
import zipfile
22
24
 
23
 
from bzrlib.branch import Branch
 
25
from bzrlib.tests import TestSkipped
24
26
from bzrlib.tests.blackbox import ExternalBase
25
 
import tarfile, zipfile
 
27
 
26
28
 
27
29
class TestExport(ExternalBase):
28
30
 
29
31
    def test_tar_export(self):
 
32
        tree = self.make_branch_and_tree('tar')
 
33
        self.build_tree(['tar/a'])
 
34
        tree.add('a')
30
35
 
31
 
        os.mkdir('tar')
32
36
        os.chdir('tar')
 
37
        self.run_bzr('ignore', 'something')
 
38
        tree.commit('1')
33
39
 
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')
 
40
        self.failUnless(tree.has_filename('.bzrignore'))
 
41
        self.run_bzr('export', 'test.tar.gz')
40
42
        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')
 
43
        # Make sure the tarball contains 'a', but does not contain
 
44
        # '.bzrignore'.
 
45
        self.assertEqual(['test/a'], sorted(ball.getnames()))
 
46
 
 
47
    def test_tar_export_unicode(self):
 
48
        tree = self.make_branch_and_tree('tar')
 
49
        fname = u'\xe5.txt'
 
50
        try:
 
51
            self.build_tree(['tar/' + fname])
 
52
        except UnicodeError:
 
53
            raise TestSkipped('Unable to represent path %r' % (fname,))
 
54
        tree.add([fname])
 
55
        tree.commit('first')
 
56
 
 
57
        os.chdir('tar')
 
58
        self.run_bzr('export', 'test.tar')
 
59
        ball = tarfile.open('test.tar')
 
60
        # all paths are prefixed with the base name of the tarball
 
61
        self.assertEqual(['test/' + fname.encode('utf8')],
 
62
                         sorted(ball.getnames()))
44
63
 
45
64
    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')
 
65
        tree = self.make_branch_and_tree('zip')
 
66
        self.build_tree(['zip/a'])
 
67
        tree.add('a')
 
68
 
 
69
        os.chdir('zip')
 
70
        self.run_bzr('ignore', 'something')
 
71
        tree.commit('1')
 
72
 
 
73
        self.failUnless(tree.has_filename('.bzrignore'))
 
74
        self.run_bzr('export', 'test.zip')
 
75
 
 
76
        zfile = zipfile.ZipFile('test.zip')
 
77
        # Make sure the zipfile contains 'a', but does not contain
 
78
        # '.bzrignore'.
 
79
        self.assertEqual(['test/a'], sorted(zfile.namelist()))
 
80
 
 
81
    def test_zip_export_unicode(self):
 
82
        tree = self.make_branch_and_tree('zip')
 
83
        fname = u'\xe5.txt'
 
84
        try:
 
85
            self.build_tree(['zip/' + fname])
 
86
        except UnicodeError:
 
87
            raise TestSkipped('Unable to represent path %r' % (fname,))
 
88
        tree.add([fname])
 
89
        tree.commit('first')
 
90
 
 
91
        os.chdir('zip')
 
92
        self.run_bzr('export', 'test.zip')
 
93
        zfile = zipfile.ZipFile('test.zip')
 
94
        # all paths are prefixed with the base name of the zipfile
 
95
        self.assertEqual(['test/' + fname.encode('utf8')],
 
96
                         sorted(zfile.namelist()))
60
97
 
61
98
    def test_dir_export(self):
 
99
        tree = self.make_branch_and_tree('dir')
 
100
        self.build_tree(['dir/a'])
 
101
        tree.add('a')
62
102
 
63
 
        os.mkdir('dir')
64
103
        os.chdir('dir')
 
104
        self.run_bzr('ignore', 'something')
 
105
        tree.commit('1')
65
106
 
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')
 
107
        self.failUnless(tree.has_filename('.bzrignore'))
 
108
        self.run_bzr('export', 'direxport')
72
109
 
73
110
        files = sorted(os.listdir('direxport'))
74
 
        self.assertEqual(['a'], files, 'dir contains .bzrignore')
 
111
        # Make sure the exported directory contains 'a', but does not contain
 
112
        # '.bzrignore'.
 
113
        self.assertEqual(['a'], files)
 
114
 
 
115
    def example_branch(self):
 
116
        tree = self.make_branch_and_tree('branch')
 
117
        self.build_tree_contents([('branch/hello', 'foo')])
 
118
        tree.add('hello')
 
119
        tree.commit('setup')
 
120
 
 
121
        self.build_tree_contents([('branch/goodbye', 'baz')])
 
122
        tree.add('goodbye')
 
123
        tree.commit('setup')
 
124
        return tree
 
125
        
 
126
    def test_basic_directory_export(self):
 
127
        self.example_branch()
 
128
        os.chdir('branch')
 
129
 
 
130
        # Directory exports
 
131
        self.run_bzr('export', '../latest')
 
132
        self.assertEqual(['goodbye', 'hello'], sorted(os.listdir('../latest')))
 
133
        self.check_file_contents('../latest/goodbye', 'baz')
 
134
        self.run_bzr('export', '../first', '-r', '1')
 
135
        self.assertEqual(['hello'], sorted(os.listdir('../first')))
 
136
        self.check_file_contents('../first/hello', 'foo')
 
137
 
 
138
        # Even with .gz and .bz2 it is still a directory
 
139
        self.run_bzr('export', '../first.gz', '-r', '1')
 
140
        self.check_file_contents('../first.gz/hello', 'foo')
 
141
        self.run_bzr('export', '../first.bz2', '-r', '1')
 
142
        self.check_file_contents('../first.bz2/hello', 'foo')
 
143
 
 
144
    def test_basic_tarfile_export(self):
 
145
        self.example_branch()
 
146
        os.chdir('branch')
 
147
 
 
148
        self.run_bzr('export', '../first.tar', '-r', '1')
 
149
        self.failUnless(os.path.isfile('../first.tar'))
 
150
        tf = tarfile.open('../first.tar')
 
151
        try:
 
152
            self.assertEqual(['first/hello'], sorted(tf.getnames()))
 
153
            self.assertEqual('foo', tf.extractfile('first/hello').read())
 
154
        finally:
 
155
            tf.close()
 
156
 
 
157
        self.run_bzr('export', '../first.tar.gz', '-r', '1')
 
158
        self.failUnless(os.path.isfile('../first.tar.gz'))
 
159
        self.run_bzr('export', '../first.tbz2', '-r', '1')
 
160
        self.failUnless(os.path.isfile('../first.tbz2'))
 
161
        self.run_bzr('export', '../first.tar.bz2', '-r', '1')
 
162
        self.failUnless(os.path.isfile('../first.tar.bz2'))
 
163
        self.run_bzr('export', '../first.tar.tbz2', '-r', '1')
 
164
        self.failUnless(os.path.isfile('../first.tar.tbz2'))
 
165
 
 
166
        tf = tarfile.open('../first.tar.tbz2', 'r:bz2')
 
167
        try:
 
168
            self.assertEqual(['first.tar/hello'], sorted(tf.getnames()))
 
169
            self.assertEqual('foo', tf.extractfile('first.tar/hello').read())
 
170
        finally:
 
171
            tf.close()
 
172
        self.run_bzr('export', '../first2.tar', '-r', '1', '--root', 'pizza')
 
173
        tf = tarfile.open('../first2.tar')
 
174
        try:
 
175
            self.assertEqual(['pizza/hello'], sorted(tf.getnames()))
 
176
            self.assertEqual('foo', tf.extractfile('pizza/hello').read())
 
177
        finally:
 
178
            tf.close()
 
179
 
 
180
    def test_basic_zipfile_export(self):
 
181
        self.example_branch()
 
182
        os.chdir('branch')
 
183
 
 
184
        self.run_bzr('export', '../first.zip', '-r', '1')
 
185
        self.failUnlessExists('../first.zip')
 
186
        zf = zipfile.ZipFile('../first.zip')
 
187
        try:
 
188
            self.assertEqual(['first/hello'], sorted(zf.namelist()))
 
189
            self.assertEqual('foo', zf.read('first/hello'))
 
190
        finally:
 
191
            zf.close()
 
192
 
 
193
        self.run_bzr('export', '../first2.zip', '-r', '1', '--root', 'pizza')
 
194
        zf = zipfile.ZipFile('../first2.zip')
 
195
        try:
 
196
            self.assertEqual(['pizza/hello'], sorted(zf.namelist()))
 
197
            self.assertEqual('foo', zf.read('pizza/hello'))
 
198
        finally:
 
199
            zf.close()
 
200
        
 
201
        self.run_bzr('export', '../first-zip', '--format=zip', '-r', '1')
 
202
        zf = zipfile.ZipFile('../first-zip')
 
203
        try:
 
204
            self.assertEqual(['first-zip/hello'], sorted(zf.namelist()))
 
205
            self.assertEqual('foo', zf.read('first-zip/hello'))
 
206
        finally:
 
207
            zf.close()
 
208