/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4988.10.3 by John Arbash Meinel
Merge bzr.dev 5007, resolve conflict, update NEWS
1
# Copyright (C) 2009, 2010 Canonical Ltd
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
2
#
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.
7
#
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.
12
#
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
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
16
5718.5.12 by Jelmer Vernooij
Add test for export_tarball.
17
"""Tests for bzrlib.export."""
18
19
from cStringIO import StringIO
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
20
import os
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
21
import tarfile
4996.1.1 by Robert Collins
Set the file mtime when exporting to a directory to prevent triggering make rebuilds unnecessarily.
22
import time
5718.5.14 by Jelmer Vernooij
Add test for per-file-timestamp zipfiles.
23
import zipfile
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
24
25
from bzrlib import (
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
26
    errors,
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
27
    export,
28
    tests,
29
    )
5718.5.18 by Jelmer Vernooij
Don't export to '-', but rather to ''.
30
from bzrlib.export import get_root_name
5718.5.12 by Jelmer Vernooij
Add test for export_tarball.
31
from bzrlib.export.tar_exporter import export_tarball
5718.5.19 by Jelmer Vernooij
Use features.
32
from bzrlib.tests import features
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
33
34
5718.5.9 by Jelmer Vernooij
Add test for export zip to stdout.
35
class TestDirExport(tests.TestCaseWithTransport):
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
36
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
37
    def test_missing_file(self):
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
38
        self.build_tree(['a/', 'a/b', 'a/c'])
39
        wt = self.make_branch_and_tree('.')
40
        wt.add(['a', 'a/b', 'a/c'])
41
        os.unlink('a/c')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
42
        export.export(wt, 'target', format="dir")
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
43
        self.failUnlessExists('target/a/b')
44
        self.failIfExists('target/a/c')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
45
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
46
    def test_empty(self):
47
        wt = self.make_branch_and_tree('.')
48
        export.export(wt, 'target', format="dir")
49
        self.assertEquals([], os.listdir("target"))
50
51
    def test_symlink(self):
4562.1.2 by Jelmer Vernooij
Use self.requireFeature(tests.SymlinkFeature) per John's review.
52
        self.requireFeature(tests.SymlinkFeature)
4562.1.1 by Jelmer Vernooij
Support exporting symlinks when exporting from a working tree.
53
        wt = self.make_branch_and_tree('.')
54
        os.symlink('source', 'link')
55
        wt.add(['link'])
56
        export.export(wt, 'target', format="dir")
57
        self.failUnlessExists('target/link')
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
58
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
59
    def test_to_existing_empty_dir_success(self):
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
60
        self.build_tree(['source/', 'source/a', 'source/b/', 'source/b/c'])
61
        wt = self.make_branch_and_tree('source')
62
        wt.add(['a', 'b', 'b/c'])
63
        wt.commit('1')
64
        self.build_tree(['target/'])
65
        export.export(wt, 'target', format="dir")
66
        self.failUnlessExists('target/a')
67
        self.failUnlessExists('target/b')
68
        self.failUnlessExists('target/b/c')
69
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
70
    def test_to_existing_nonempty_dir_fail(self):
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
71
        self.build_tree(['source/', 'source/a', 'source/b/', 'source/b/c'])
72
        wt = self.make_branch_and_tree('source')
73
        wt.add(['a', 'b', 'b/c'])
74
        wt.commit('1')
75
        self.build_tree(['target/', 'target/foo'])
76
        self.assertRaises(errors.BzrError, export.export, wt, 'target', format="dir")
4988.10.1 by michal
- bug #511987 fixed, export of single file
77
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
78
    def test_existing_single_file(self):
4988.10.1 by michal
- bug #511987 fixed, export of single file
79
        self.build_tree(['dir1/', 'dir1/dir2/', 'dir1/first', 'dir1/dir2/second'])
80
        wtree = self.make_branch_and_tree('dir1')
81
        wtree.add(['dir2', 'first', 'dir2/second'])
82
        wtree.commit('1')
83
        export.export(wtree, 'target1', format='dir', subdir='first')
84
        self.failUnlessExists('target1/first')
85
        export.export(wtree, 'target2', format='dir', subdir='dir2/second')
86
        self.failUnlessExists('target2/second')
5718.5.7 by Jelmer Vernooij
Support bzr zip exporting to stdout.
87
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
88
    def test_files_same_timestamp(self):
4996.1.1 by Robert Collins
Set the file mtime when exporting to a directory to prevent triggering make rebuilds unnecessarily.
89
        builder = self.make_branch_builder('source')
90
        builder.start_series()
91
        builder.build_snapshot(None, None, [
92
            ('add', ('', 'root-id', 'directory', '')),
93
            ('add', ('a', 'a-id', 'file', 'content\n'))])
94
        builder.build_snapshot(None, None, [
95
            ('add', ('b', 'b-id', 'file', 'content\n'))])
96
        builder.finish_series()
97
        b = builder.get_branch()
98
        b.lock_read()
99
        self.addCleanup(b.unlock)
100
        tree = b.basis_tree()
101
        orig_iter_files_bytes = tree.iter_files_bytes
102
        # Make iter_files_bytes slower, so we provoke mtime skew
103
        def iter_files_bytes(to_fetch):
104
            for thing in orig_iter_files_bytes(to_fetch):
105
                yield thing
106
                time.sleep(1)
107
        tree.iter_files_bytes = iter_files_bytes
108
        export.export(tree, 'target', format='dir')
109
        t = self.get_transport('target')
110
        st_a = t.stat('a')
111
        st_b = t.stat('b')
112
        # All files must be given the same mtime.
113
        self.assertEqual(st_a.st_mtime, st_b.st_mtime)
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
114
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
115
    def test_files_per_file_timestamps(self):
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
116
        builder = self.make_branch_builder('source')
117
        builder.start_series()
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
118
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
119
        a_time = time.mktime((1999, 12, 12, 0, 0, 0, 0, 0, 0))
120
        b_time = time.mktime((1980, 01, 01, 0, 0, 0, 0, 0, 0))
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
121
        builder.build_snapshot(None, None, [
122
            ('add', ('', 'root-id', 'directory', '')),
123
            ('add', ('a', 'a-id', 'file', 'content\n'))],
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
124
            timestamp=a_time)
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
125
        builder.build_snapshot(None, None, [
126
            ('add', ('b', 'b-id', 'file', 'content\n'))],
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
127
            timestamp=b_time)
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
128
        builder.finish_series()
129
        b = builder.get_branch()
130
        b.lock_read()
131
        self.addCleanup(b.unlock)
132
        tree = b.basis_tree()
5076.2.3 by Jelmer Vernooij
Review comments from Rob.
133
        export.export(tree, 'target', format='dir', per_file_timestamps=True)
5076.2.1 by Jelmer Vernooij
Add use_tree_timestamp argument to exporters.
134
        t = self.get_transport('target')
5151.3.1 by Martin
Fix os.utime test failures, three on FAT filesystems and one with readonly files
135
        self.assertEqual(a_time, t.stat('a').st_mtime)
136
        self.assertEqual(b_time, t.stat('b').st_mtime)
5718.5.10 by Jelmer Vernooij
Support creating .tar.xz files.
137
138
139
class TarExporterTests(tests.TestCaseWithTransport):
140
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
141
    def test_xz(self):
5718.5.19 by Jelmer Vernooij
Use features.
142
        self.requireFeature(features.lzma)
143
        import lzma
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
144
        wt = self.make_branch_and_tree('.')
145
        self.build_tree(['a'])
146
        wt.add(["a"])
147
        wt.commit("1")
5718.5.19 by Jelmer Vernooij
Use features.
148
        export.export(wt, 'target.tar.xz', format="txz")
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
149
        tf = tarfile.open(fileobj=lzma.LZMAFile('target.tar.xz'))
150
        self.assertEquals(["target/a"], tf.getnames())
151
5718.5.17 by Jelmer Vernooij
Support tar.lzma.
152
    def test_lzma(self):
5718.5.19 by Jelmer Vernooij
Use features.
153
        self.requireFeature(features.lzma)
154
        import lzma
5718.5.17 by Jelmer Vernooij
Support tar.lzma.
155
        wt = self.make_branch_and_tree('.')
156
        self.build_tree(['a'])
157
        wt.add(["a"])
158
        wt.commit("1")
5718.5.19 by Jelmer Vernooij
Use features.
159
        export.export(wt, 'target.tar.lzma', format="tlzma")
5718.5.17 by Jelmer Vernooij
Support tar.lzma.
160
        tf = tarfile.open(fileobj=lzma.LZMAFile('target.tar.lzma'))
161
        self.assertEquals(["target/a"], tf.getnames())
162
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
163
    def test_tgz(self):
164
        wt = self.make_branch_and_tree('.')
165
        self.build_tree(['a'])
166
        wt.add(["a"])
167
        wt.commit("1")
168
        export.export(wt, 'target.tar.gz', format="tgz")
169
        tf = tarfile.open('target.tar.gz')
170
        self.assertEquals(["target/a"], tf.getnames())
171
5718.5.15 by Jelmer Vernooij
Only write out basename of the tarfile to the gzip file.
172
    def test_tgz_ignores_dest_path(self):
173
        # The target path should not be a part of the target file.
174
        # (bug #102234)
175
        wt = self.make_branch_and_tree('.')
176
        self.build_tree(['a'])
177
        wt.add(["a"])
178
        wt.commit("1")
179
        os.mkdir("testdir1")
180
        os.mkdir("testdir2")
181
        export.export(wt, 'testdir1/target.tar.gz', format="tgz",
182
            per_file_timestamps=True)
183
        export.export(wt, 'testdir2/target.tar.gz', format="tgz",
184
            per_file_timestamps=True)
185
        file1 = open('testdir1/target.tar.gz', 'r')
186
        self.addCleanup(file1.close)
187
        file2 = open('testdir1/target.tar.gz', 'r')
188
        self.addCleanup(file2.close)
189
        content1 = file1.read()
190
        content2 = file2.read()
191
        self.assertEqualDiff(content1, content2)
192
        # the gzip module doesn't have a way to read back to the original
193
        # filename, but it's stored as-is in the tarfile.
194
        self.assertFalse("testdir1" in content1)
195
        self.assertFalse("target.tar.gz" in content1)
196
        self.assertTrue("target.tar" in content1)
197
5718.5.11 by Jelmer Vernooij
Tests, tests, tests.
198
    def test_tbz2(self):
199
        wt = self.make_branch_and_tree('.')
200
        self.build_tree(['a'])
201
        wt.add(["a"])
202
        wt.commit("1")
203
        export.export(wt, 'target.tar.bz2', format="tbz2")
204
        tf = tarfile.open('target.tar.bz2')
205
        self.assertEquals(["target/a"], tf.getnames())
206
207
    def test_xz_stdout(self):
208
        wt = self.make_branch_and_tree('.')
209
        self.assertRaises(errors.BzrError, export.export, wt, '-',
210
            format="txz")
5718.5.12 by Jelmer Vernooij
Add test for export_tarball.
211
212
    def test_export_tarball(self):
213
        wt = self.make_branch_and_tree('.')
214
        self.build_tree(['a'])
215
        wt.add(["a"])
216
        wt.commit("1", timestamp=42)
217
        target = StringIO()
218
        ball = tarfile.open(None, "w|", target)
219
        wt.lock_read()
220
        try:
5718.5.20 by Jelmer Vernooij
Force timezone to UTC in zip test.
221
            export_tarball(wt, ball, "bar")
5718.5.12 by Jelmer Vernooij
Add test for export_tarball.
222
        finally:
223
            wt.unlock()
224
        self.assertEquals(["bar/a"], ball.getnames())
225
        ball.close()
5718.5.14 by Jelmer Vernooij
Add test for per-file-timestamp zipfiles.
226
227
228
class ZipExporterTests(tests.TestCaseWithTransport):
229
230
    def test_per_file_timestamps(self):
231
        tree = self.make_branch_and_tree('.')
232
        self.build_tree_contents([('har', 'foo')])
233
        tree.add('har')
234
        # Earliest allowable date on FAT32 filesystems is 1980-01-01
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
235
        timestamp = 347151600
236
        tree.commit('setup', timestamp=timestamp)
5718.5.14 by Jelmer Vernooij
Add test for per-file-timestamp zipfiles.
237
        export.export(tree.basis_tree(), 'test.zip', format='zip',
238
            per_file_timestamps=True)
239
        zfile = zipfile.ZipFile('test.zip')
240
        info = zfile.getinfo("test/har")
5718.5.26 by Jelmer Vernooij
Work around zip info time zone issues.
241
        self.assertEquals(time.localtime(timestamp)[:6], info.date_time)
5718.5.18 by Jelmer Vernooij
Don't export to '-', but rather to ''.
242
243
244
class RootNameTests(tests.TestCase):
245
246
    def test_root_name(self):
247
        self.assertEquals('mytest', get_root_name('../mytest.tar'))
248
        self.assertEquals('mytar', get_root_name('mytar.tar'))
249
        self.assertEquals('mytar', get_root_name('mytar.tar.bz2'))
250
        self.assertEquals('tar.tar.tar', get_root_name('tar.tar.tar.tgz'))
251
        self.assertEquals('bzr-0.0.5', get_root_name('bzr-0.0.5.tar.gz'))
252
        self.assertEquals('bzr-0.0.5', get_root_name('bzr-0.0.5.zip'))
253
        self.assertEquals('bzr-0.0.5', get_root_name('bzr-0.0.5'))
254
        self.assertEquals('mytar', get_root_name('a/long/path/mytar.tgz'))
255
        self.assertEquals('other',
256
            get_root_name('../parent/../dir/other.tbz2'))
257
        self.assertEquals('', get_root_name('-'))