1
# Copyright (C) 2005 Canonical Ltd
1
# Copyright (C) 2005-2010 Canonical Ltd
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
19
19
Such as non-controlled directories, tarfiles, zipfiles, etc.
22
from bzrlib.trace import mutter
24
23
import bzrlib.errors as errors
56
55
When requesting a specific type of export, load the respective path.
58
def _loader(tree, dest, root, subdir, filtered):
57
def _loader(tree, dest, root, subdir, filtered, per_file_timestamps):
59
58
mod = __import__(module, globals(), locals(), [funcname])
60
59
func = getattr(mod, funcname)
61
return func(tree, dest, root, subdir, filtered=filtered)
60
return func(tree, dest, root, subdir, filtered=filtered,
61
per_file_timestamps=per_file_timestamps)
62
62
register_exporter(scheme, extensions, _loader)
65
def export(tree, dest, format=None, root=None, subdir=None, filtered=False):
65
def export(tree, dest, format=None, root=None, subdir=None, filtered=False,
66
per_file_timestamps=False):
66
67
"""Export the given Tree to the specific destination.
68
69
:param tree: A Tree (such as RevisionTree) to export
81
82
a directory to start exporting from.
82
83
:param filtered: If True, content filtering is applied to the
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.
85
89
global _exporters, _exporter_extensions
99
103
raise errors.NoSuchExportFormat(format)
102
return _exporters[format](tree, dest, root, subdir, filtered=filtered)
106
return _exporters[format](tree, dest, root, subdir, filtered=filtered,
107
per_file_timestamps=per_file_timestamps)
138
143
"""Iter the entries for tree suitable for exporting.
140
145
:param tree: A tree object.
141
:param subdir: None or the path of a directory to start exporting from.
146
:param subdir: None or the path of an entry to start exporting from.
143
148
inv = tree.inventory
144
149
if subdir is None:
147
152
subdir_id = inv.path2id(subdir)
148
entries = inv.iter_entries(subdir_id)
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
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
162
entries = inv.iter_entries(subdir_object)
149
163
if subdir is None:
150
164
entries.next() # skip root
151
165
for entry in entries: