~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/export/__init__.py

  • Committer: Alexander Belchenko
  • Date: 2006-07-30 16:43:12 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060730164312-b025fd3ff0cee59e
rename  gpl.txt => COPYING.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005 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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Export functionality, which can take a Tree and create a different representation.
18
18
 
19
19
Such as non-controlled directories, tarfiles, zipfiles, etc.
20
20
"""
21
21
 
 
22
from bzrlib.trace import mutter
22
23
import os
23
24
import bzrlib.errors as errors
24
25
 
31
32
    """Register an exporter.
32
33
 
33
34
    :param format: This is the name of the format, such as 'tgz' or 'zip'
34
 
    :param extensions: Extensions which should be used in the case that a
 
35
    :param extensions: Extensions which should be used in the case that a 
35
36
                       format was not explicitly specified.
36
37
    :type extensions: List
37
38
    :param func: The function. It will be called with (tree, dest, root)
41
42
    """
42
43
    global _exporters, _exporter_extensions
43
44
 
44
 
    if (format not in _exporters) or override:
 
45
    if not _exporters.has_key(format) or override:
45
46
        _exporters[format] = func
46
47
 
47
48
    for ext in extensions:
48
 
        if (ext not in _exporter_extensions) or override:
 
49
        if not _exporter_extensions.has_key(ext) or override:
49
50
            _exporter_extensions[ext] = format
50
51
 
51
52
 
54
55
 
55
56
    When requesting a specific type of export, load the respective path.
56
57
    """
57
 
    def _loader(tree, dest, root, subdir, filtered, per_file_timestamps):
 
58
    def _loader(tree, dest, root):
58
59
        mod = __import__(module, globals(), locals(), [funcname])
59
60
        func = getattr(mod, funcname)
60
 
        return func(tree, dest, root, subdir, filtered=filtered,
61
 
                    per_file_timestamps=per_file_timestamps)
 
61
        return func(tree, dest, root)
62
62
    register_exporter(scheme, extensions, _loader)
63
63
 
64
64
 
65
 
def export(tree, dest, format=None, root=None, subdir=None, filtered=False,
66
 
           per_file_timestamps=False):
 
65
def export(tree, dest, format=None, root=None):
67
66
    """Export the given Tree to the specific destination.
68
67
 
69
68
    :param tree: A Tree (such as RevisionTree) to export
71
70
    :param format: The format (dir, zip, etc), if None, it will check the
72
71
                   extension on dest, looking for a match
73
72
    :param root: The root location inside the format.
74
 
                 It is common practise to have zipfiles and tarballs
 
73
                 It is common practise to have zipfiles and tarballs 
75
74
                 extract into a subdirectory, rather than into the
76
75
                 current working directory.
77
76
                 If root is None, the default root will be
78
77
                 selected as the destination without its
79
78
                 extension.
80
 
    :param subdir: A starting directory within the tree. None means to export
81
 
        the entire tree, and anything else should specify the relative path to
82
 
        a directory to start exporting from.
83
 
    :param filtered: If True, content filtering is applied to the
84
 
                     files exported.
85
 
    :param per_file_timestamps: Whether to use the timestamp stored in the 
86
 
        tree rather than now(). This will do a revision lookup 
87
 
        for every file so will be significantly slower.
88
79
    """
89
80
    global _exporters, _exporter_extensions
90
81
 
99
90
    if root is None:
100
91
        root = get_root_name(dest)
101
92
 
102
 
    if format not in _exporters:
 
93
    if not _exporters.has_key(format):
103
94
        raise errors.NoSuchExportFormat(format)
104
 
    tree.lock_read()
105
 
    try:
106
 
        return _exporters[format](tree, dest, root, subdir, filtered=filtered,
107
 
                                  per_file_timestamps=per_file_timestamps)
108
 
    finally:
109
 
        tree.unlock()
 
95
    return _exporters[format](tree, dest, root)
110
96
 
111
97
 
112
98
def get_root_name(dest):
113
99
    """Get just the root name for an export.
114
100
 
115
 
    >>> get_root_name('../mytest.tar')
116
 
    'mytest'
117
101
    >>> get_root_name('mytar.tar')
118
102
    'mytar'
119
103
    >>> get_root_name('mytar.tar.bz2')
139
123
    return dest
140
124
 
141
125
 
142
 
def _export_iter_entries(tree, subdir):
143
 
    """Iter the entries for tree suitable for exporting.
144
 
 
145
 
    :param tree: A tree object.
146
 
    :param subdir: None or the path of an entry to start exporting from.
147
 
    """
148
 
    inv = tree.inventory
149
 
    if subdir is None:
150
 
        subdir_object = None
151
 
    else:
152
 
        subdir_id = inv.path2id(subdir)
153
 
        if subdir_id is not None:
154
 
            subdir_object = inv[subdir_id]
155
 
        # XXX: subdir is path not an id, so NoSuchId isn't proper error
156
 
        else:
157
 
            raise errors.NoSuchId(tree, subdir)
158
 
    if subdir_object is not None and subdir_object.kind != 'directory':
159
 
        yield subdir_object.name, subdir_object
160
 
        return
161
 
    else:
162
 
        entries = inv.iter_entries(subdir_object)
163
 
    if subdir is None:
164
 
        entries.next() # skip root
165
 
    for entry in entries:
166
 
        # The .bzr* namespace is reserved for "magic" files like
167
 
        # .bzrignore and .bzrrules - do not export these
168
 
        if entry[0].startswith(".bzr"):
169
 
            continue
170
 
        if subdir is None:
171
 
            if not tree.has_filename(entry[0]):
172
 
                continue
173
 
        else:
174
 
            if not tree.has_filename(os.path.join(subdir, entry[0])):
175
 
                continue
176
 
        yield entry
177
 
 
178
 
 
179
126
register_lazy_exporter(None, [], 'bzrlib.export.dir_exporter', 'dir_exporter')
180
127
register_lazy_exporter('dir', [], 'bzrlib.export.dir_exporter', 'dir_exporter')
181
128
register_lazy_exporter('tar', ['.tar'], 'bzrlib.export.tar_exporter', 'tar_exporter')