/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5809.3.2 by Aaron Bentley
Support PreviewTree.has_filename.
1
# Copyright (C) 2005-2011 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
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.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
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.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
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.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
16
5967.6.1 by Martin Pool
pep8 cleanup
17
"""Export trees to tarballs, non-controlled directories, zipfiles, etc.
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
18
"""
19
20
import os
5718.5.1 by Jelmer Vernooij
per_file_timestamp -> force_mtime.
21
import time
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
22
import warnings
23
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
24
from bzrlib import (
25
    errors,
26
    pyutils,
5718.5.4 by Jelmer Vernooij
fix timestamp in tgz files.
27
    trace,
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
28
    )
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
29
30
# Maps format name => export function
31
_exporters = {}
32
# Maps filename extensions => export format name
33
_exporter_extensions = {}
34
5967.6.1 by Martin Pool
pep8 cleanup
35
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
36
def register_exporter(format, extensions, func, override=False):
37
    """Register an exporter.
38
39
    :param format: This is the name of the format, such as 'tgz' or 'zip'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
40
    :param extensions: Extensions which should be used in the case that a
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
41
                       format was not explicitly specified.
42
    :type extensions: List
43
    :param func: The function. It will be called with (tree, dest, root)
44
    :param override: Whether to override an object which already exists.
45
                     Frequently plugins will want to provide functionality
46
                     until it shows up in mainline, so the default is False.
47
    """
48
    global _exporters, _exporter_extensions
49
1963.2.1 by Robey Pointer
remove usage of has_key()
50
    if (format not in _exporters) or override:
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
51
        _exporters[format] = func
52
53
    for ext in extensions:
1963.2.1 by Robey Pointer
remove usage of has_key()
54
        if (ext not in _exporter_extensions) or override:
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
55
            _exporter_extensions[ext] = format
56
57
58
def register_lazy_exporter(scheme, extensions, module, funcname):
59
    """Register lazy-loaded exporter function.
60
61
    When requesting a specific type of export, load the respective path.
62
    """
6006.3.7 by Martin Pool
Remove duplicated content-filtering code from exporters
63
    def _loader(tree, dest, root, subdir, force_mtime, fileobj):
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
64
        func = pyutils.get_named_object(module, funcname)
6006.3.7 by Martin Pool
Remove duplicated content-filtering code from exporters
65
        return func(tree, dest, root, subdir, force_mtime=force_mtime,
66
            fileobj=fileobj)
5967.6.1 by Martin Pool
pep8 cleanup
67
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
68
    register_exporter(scheme, extensions, _loader)
5967.6.1 by Martin Pool
pep8 cleanup
69
70
5952.1.18 by geoffreyfishing at gmail
Fixed line ending problems.
71
def get_export_generator(tree, dest=None, format=None, root=None, subdir=None,
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
72
                         filtered=False, per_file_timestamps=False,
73
                         fileobj=None):
74
    """Returns a generator that exports the given tree.
5967.6.1 by Martin Pool
pep8 cleanup
75
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
76
    The generator is expected to yield None while exporting the tree while the
77
    actual export is written to ``fileobj``.
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
78
79
    :param tree: A Tree (such as RevisionTree) to export
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
80
81
    :param dest: The destination where the files, etc should be put
82
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
83
    :param format: The format (dir, zip, etc), if None, it will check the
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
84
        extension on dest, looking for a match
85
86
    :param root: The root location inside the format.  It is common practise to
87
        have zipfiles and tarballs extract into a subdirectory, rather than
88
        into the current working directory.  If root is None, the default root
89
        will be selected as the destination without its extension.
90
3613.2.1 by Robert Collins
Teach export how to export a subdirectory. (Robert Collins)
91
    :param subdir: A starting directory within the tree. None means to export
92
        the entire tree, and anything else should specify the relative path to
93
        a directory to start exporting from.
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
94
95
    :param filtered: If True, content filtering is applied to the exported
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
96
        files.  Deprecated in favour of passing a ContentFilterTree
97
        as the source.
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
98
99
    :param per_file_timestamps: Whether to use the timestamp stored in the tree
100
        rather than now(). This will do a revision lookup for every file so
101
        will be significantly slower.
102
5952.1.6 by geoffreyfishing at gmail
Created get_export_generator.
103
    :param fileobj: Optional file object to use
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
104
    """
105
    global _exporters, _exporter_extensions
106
5952.1.6 by geoffreyfishing at gmail
Created get_export_generator.
107
    if format is None and dest is not None:
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
108
        for ext in _exporter_extensions:
109
            if dest.endswith(ext):
110
                format = _exporter_extensions[ext]
111
                break
112
113
    # Most of the exporters will just have to call
114
    # this function anyway, so why not do it for them
115
    if root is None:
116
        root = get_root_name(dest)
117
1963.2.1 by Robey Pointer
remove usage of has_key()
118
    if format not in _exporters:
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
119
        raise errors.NoSuchExportFormat(format)
5718.5.1 by Jelmer Vernooij
per_file_timestamp -> force_mtime.
120
121
    if not per_file_timestamps:
122
        force_mtime = time.time()
123
    else:
124
        force_mtime = None
125
5718.5.4 by Jelmer Vernooij
fix timestamp in tgz files.
126
    trace.mutter('export version %r', tree)
127
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
128
    if filtered:
129
        from bzrlib.filter_tree import ContentFilterTree
130
        warnings.warn(
131
            "passing filtered=True to export is deprecated in bzr 2.4",
132
            stacklevel=2)
133
        tree = ContentFilterTree(tree, tree._content_filter_stack)
6006.3.7 by Martin Pool
Remove duplicated content-filtering code from exporters
134
        # We don't want things re-filtered by the specific exporter.
135
        filtered = False
136
137
    tree.lock_read()
138
    if filtered:
139
        from bzrlib.filter_tree import ContentFilterTree
140
        warnings.warn(
141
            "passing filtered=True to export is deprecated in bzr 2.4",
142
            stacklevel=2)
143
        tree = ContentFilterTree(tree, tree._content_filter_stack)
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
144
145
    tree.lock_read()
5952.1.16 by geoffreyfishing at gmail
Moved unlock function into finally block.
146
    try:
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
147
        for _ in _exporters[format](
6006.3.7 by Martin Pool
Remove duplicated content-filtering code from exporters
148
            tree, dest, root, subdir,
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
149
            force_mtime=force_mtime, fileobj=fileobj):
5952.1.16 by geoffreyfishing at gmail
Moved unlock function into finally block.
150
            yield
5967.6.1 by Martin Pool
pep8 cleanup
151
    finally:
5952.1.16 by geoffreyfishing at gmail
Moved unlock function into finally block.
152
        tree.unlock()
5952.1.15 by geoffreyfishing at gmail
Major code cleanup.
153
154
5967.6.1 by Martin Pool
pep8 cleanup
155
def export(tree, dest, format=None, root=None, subdir=None, filtered=False,
5952.1.18 by geoffreyfishing at gmail
Fixed line ending problems.
156
           per_file_timestamps=False, fileobj=None):
5952.1.6 by geoffreyfishing at gmail
Created get_export_generator.
157
    """Export the given Tree to the specific destination.
158
159
    :param tree: A Tree (such as RevisionTree) to export
160
    :param dest: The destination where the files,etc should be put
161
    :param format: The format (dir, zip, etc), if None, it will check the
162
                   extension on dest, looking for a match
163
    :param root: The root location inside the format.
164
                 It is common practise to have zipfiles and tarballs
165
                 extract into a subdirectory, rather than into the
166
                 current working directory.
167
                 If root is None, the default root will be
168
                 selected as the destination without its
169
                 extension.
170
    :param subdir: A starting directory within the tree. None means to export
171
        the entire tree, and anything else should specify the relative path to
172
        a directory to start exporting from.
173
    :param filtered: If True, content filtering is applied to the
6006.3.6 by Martin Pool
Deprecate export(filtered=True)
174
        files exported.  Deprecated in favor of passing an ContentFilterTree.
5967.6.1 by Martin Pool
pep8 cleanup
175
    :param per_file_timestamps: Whether to use the timestamp stored in the
176
        tree rather than now(). This will do a revision lookup
5952.1.6 by geoffreyfishing at gmail
Created get_export_generator.
177
        for every file so will be significantly slower.
178
    :param fileobj: Optional file object to use
179
    """
5967.6.1 by Martin Pool
pep8 cleanup
180
    for _ in get_export_generator(tree, dest, format, root, subdir, filtered,
5952.1.18 by geoffreyfishing at gmail
Fixed line ending problems.
181
                                  per_file_timestamps, fileobj):
5952.1.6 by geoffreyfishing at gmail
Created get_export_generator.
182
        pass
183
5967.6.1 by Martin Pool
pep8 cleanup
184
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
185
def get_root_name(dest):
186
    """Get just the root name for an export.
187
188
    """
189
    global _exporter_extensions
5718.5.18 by Jelmer Vernooij
Don't export to '-', but rather to ''.
190
    if dest == '-':
191
        # Exporting to -/foo doesn't make sense so use relative paths.
192
        return ''
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
193
    dest = os.path.basename(dest)
194
    for ext in _exporter_extensions:
195
        if dest.endswith(ext):
196
            return dest[:-len(ext)]
1185.31.13 by John Arbash Meinel
Updated the test to also test zip exports. Fixed some small bugs exposed by test suite.
197
    return dest
1185.31.12 by John Arbash Meinel
Refactored the export code to make it easier to add new export formats.
198
199
5718.5.8 by Jelmer Vernooij
add skip_special option.
200
def _export_iter_entries(tree, subdir, skip_special=True):
3613.2.2 by Robert Collins
Refactor exporters to remove obvious duplication to a helper function.
201
    """Iter the entries for tree suitable for exporting.
202
203
    :param tree: A tree object.
4988.10.2 by michal
bzr export won't fail on symlink exporting
204
    :param subdir: None or the path of an entry to start exporting from.
5718.5.8 by Jelmer Vernooij
add skip_special option.
205
    :param skip_special: Whether to skip .bzr files.
3613.2.2 by Robert Collins
Refactor exporters to remove obvious duplication to a helper function.
206
    """
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
207
    if subdir == '':
208
        subdir = None
209
    if subdir is not None:
210
        subdir = subdir.rstrip('/')
211
    entries = tree.iter_entries_by_dir()
5967.6.1 by Martin Pool
pep8 cleanup
212
    entries.next()  # skip root
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
213
    for path, entry in entries:
3613.2.2 by Robert Collins
Refactor exporters to remove obvious duplication to a helper function.
214
        # The .bzr* namespace is reserved for "magic" files like
215
        # .bzrignore and .bzrrules - do not export these
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
216
        if skip_special and path.startswith(".bzr"):
3613.2.2 by Robert Collins
Refactor exporters to remove obvious duplication to a helper function.
217
            continue
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
218
        if path == subdir:
219
            if entry.kind == 'directory':
220
                continue
221
            final_path = entry.name
222
        elif subdir is not None:
223
            if path.startswith(subdir + '/'):
224
                final_path = path[len(subdir) + 1:]
225
            else:
4010.2.1 by James Westby
Handle files that are not present in the tree when exporting (#174539)
226
                continue
227
        else:
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
228
            final_path = path
229
        if not tree.has_filename(path):
230
            continue
5967.6.1 by Martin Pool
pep8 cleanup
231
5809.3.1 by Aaron Bentley
Switch to iter_entries_by_dir.
232
        yield final_path, entry
3613.2.2 by Robert Collins
Refactor exporters to remove obvious duplication to a helper function.
233
234
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
235
register_lazy_exporter(None, [], 'bzrlib.export.dir_exporter',
236
                       'dir_exporter_generator')
237
register_lazy_exporter('dir', [], 'bzrlib.export.dir_exporter',
238
                       'dir_exporter_generator')
239
register_lazy_exporter('tar', ['.tar'], 'bzrlib.export.tar_exporter',
240
                       'plain_tar_exporter_generator')
5967.6.1 by Martin Pool
pep8 cleanup
241
register_lazy_exporter('tgz', ['.tar.gz', '.tgz'],
242
                       'bzrlib.export.tar_exporter',
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
243
                       'tgz_exporter_generator')
244
register_lazy_exporter('tbz2', ['.tar.bz2', '.tbz2'],
245
                       'bzrlib.export.tar_exporter', 'tbz_exporter_generator')
246
register_lazy_exporter('tlzma', ['.tar.lzma'], 'bzrlib.export.tar_exporter',
247
                       'tar_lzma_exporter_generator')
248
register_lazy_exporter('txz', ['.tar.xz'], 'bzrlib.export.tar_exporter',
5957.3.3 by Vincent Ladeuil
Fix typo.
249
                       'tar_xz_exporter_generator')
5952.2.1 by Vincent Ladeuil
PEP8 tweaks, lines too long, spaces at end of lines.
250
register_lazy_exporter('zip', ['.zip'], 'bzrlib.export.zip_exporter',
251
                       'zip_exporter_generator')