/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
17
import os
4996.1.1 by Robert Collins
Set the file mtime when exporting to a directory to prevent triggering make rebuilds unnecessarily.
18
import time
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
19
20
from bzrlib import (
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
21
    errors,
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
22
    export,
4562.1.1 by Jelmer Vernooij
Support exporting symlinks when exporting from a working tree.
23
    osutils,
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
24
    tests,
25
    )
26
27
28
class TestExport(tests.TestCaseWithTransport):
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
29
30
    def test_dir_export_missing_file(self):
31
        self.build_tree(['a/', 'a/b', 'a/c'])
32
        wt = self.make_branch_and_tree('.')
33
        wt.add(['a', 'a/b', 'a/c'])
34
        os.unlink('a/c')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
35
        export.export(wt, 'target', format="dir")
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
36
        self.failUnlessExists('target/a/b')
37
        self.failIfExists('target/a/c')
4241.9.5 by Vincent Ladeuil
Fix unicode related OSX failures.
38
4562.1.1 by Jelmer Vernooij
Support exporting symlinks when exporting from a working tree.
39
    def test_dir_export_symlink(self):
4562.1.2 by Jelmer Vernooij
Use self.requireFeature(tests.SymlinkFeature) per John's review.
40
        self.requireFeature(tests.SymlinkFeature)
4562.1.1 by Jelmer Vernooij
Support exporting symlinks when exporting from a working tree.
41
        wt = self.make_branch_and_tree('.')
42
        os.symlink('source', 'link')
43
        wt.add(['link'])
44
        export.export(wt, 'target', format="dir")
45
        self.failUnlessExists('target/link')
4576.1.1 by Alexander Belchenko
Fixed export to existing empty directory.
46
47
    def test_dir_export_to_existing_empty_dir_success(self):
48
        self.build_tree(['source/', 'source/a', 'source/b/', 'source/b/c'])
49
        wt = self.make_branch_and_tree('source')
50
        wt.add(['a', 'b', 'b/c'])
51
        wt.commit('1')
52
        self.build_tree(['target/'])
53
        export.export(wt, 'target', format="dir")
54
        self.failUnlessExists('target/a')
55
        self.failUnlessExists('target/b')
56
        self.failUnlessExists('target/b/c')
57
58
    def test_dir_export_to_existing_nonempty_dir_fail(self):
59
        self.build_tree(['source/', 'source/a', 'source/b/', 'source/b/c'])
60
        wt = self.make_branch_and_tree('source')
61
        wt.add(['a', 'b', 'b/c'])
62
        wt.commit('1')
63
        self.build_tree(['target/', 'target/foo'])
64
        self.assertRaises(errors.BzrError, export.export, wt, 'target', format="dir")
4988.10.1 by michal
- bug #511987 fixed, export of single file
65
66
    def test_dir_export_existing_single_file(self):
67
        self.build_tree(['dir1/', 'dir1/dir2/', 'dir1/first', 'dir1/dir2/second'])
68
        wtree = self.make_branch_and_tree('dir1')
69
        wtree.add(['dir2', 'first', 'dir2/second'])
70
        wtree.commit('1')
71
        export.export(wtree, 'target1', format='dir', subdir='first')
72
        self.failUnlessExists('target1/first')
73
        export.export(wtree, 'target2', format='dir', subdir='dir2/second')
74
        self.failUnlessExists('target2/second')
75
        
4996.1.1 by Robert Collins
Set the file mtime when exporting to a directory to prevent triggering make rebuilds unnecessarily.
76
    def test_dir_export_files_same_timestamp(self):
77
        builder = self.make_branch_builder('source')
78
        builder.start_series()
79
        builder.build_snapshot(None, None, [
80
            ('add', ('', 'root-id', 'directory', '')),
81
            ('add', ('a', 'a-id', 'file', 'content\n'))])
82
        builder.build_snapshot(None, None, [
83
            ('add', ('b', 'b-id', 'file', 'content\n'))])
84
        builder.finish_series()
85
        b = builder.get_branch()
86
        b.lock_read()
87
        self.addCleanup(b.unlock)
88
        tree = b.basis_tree()
89
        orig_iter_files_bytes = tree.iter_files_bytes
90
        # Make iter_files_bytes slower, so we provoke mtime skew
91
        def iter_files_bytes(to_fetch):
92
            for thing in orig_iter_files_bytes(to_fetch):
93
                yield thing
94
                time.sleep(1)
95
        tree.iter_files_bytes = iter_files_bytes
96
        export.export(tree, 'target', format='dir')
97
        t = self.get_transport('target')
98
        st_a = t.stat('a')
99
        st_b = t.stat('b')
100
        # All files must be given the same mtime.
101
        self.assertEqual(st_a.st_mtime, st_b.st_mtime)