1
# Copyright (C) 2008 Canonical Ltd
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.
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.
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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
The fastimport plugin provides stream-based importing of data into Bazaar.
21
A bzr-fast-export.py script is also included providing exporting of data
22
out of Bazaar to the same format. As well as enabling interchange between
23
multiple VCS tools, fastimport/export can be useful for complex branch
24
operations, e.g. partitioning off part of a code base in order to Open
27
The normal import recipe is::
30
front-end | bzr fast-import -
32
Numerous front-ends are provided in the exporters directory where
33
the plugin is installed. The list of known front-ends and their
34
status is documented on http://bazaar-vcs.org/BzrFastImport/FrontEnds.
35
For further details, see http://bazaar-vcs.org/BzrFastImport and the
36
online help for the commands::
39
bzr help fast-import-filter
40
bzr help fast-import-info
41
bzr help fast-import-query
43
To report bugs or publish enhancements, visit the bzr-fastimport project
44
page on Launchpad, https://launchpad.net/bzr-fastimport.
47
from bzrlib.commands import Command, register_command
48
from bzrlib.option import Option, ListOption
53
return tests.test_suite()
56
def _run(source, processor_factory, control, params, verbose):
57
"""Create and run a processor.
59
:param source: a filename or '-' for standard input
60
:param processor_factory: a callable for creating a processor
61
:param control: the BzrDir of the destination or None if no
62
destination is expected
71
msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)
75
stream = open(source, "rb")
76
proc = processor_factory(control, params=params, verbose=verbose)
77
p = parser.ImportParser(stream, verbose=verbose)
78
return proc.process(p.iter_commands)
81
class cmd_fast_import(Command):
82
"""Backend for fast Bazaar data importers.
84
This command reads a mixed command/data stream and
85
creates branches in the current repository accordingly.
86
To specify standard input as the input stream, use a
92
front-end | bzr fast-import -
94
If run inside a branch using a shared repository, then
95
the current branch is made the trunk and other branches,
96
if any, are created in sister directories. If run inside
97
a standalone tree, the current branch is also made the
98
trunk, but warnings are output about other branches found.
100
The stream format is upwardly compatible with git-fast-import
101
so existing front-ends for that tool can typically be reused
102
without changes. See http://bazaar-vcs.org/BzrFastImport for
103
links to matching exporters from Subversion, CVS, Git,
104
Mercurial, Darcs, Perforce and SCCS.
106
While reusing an existing format with existing frontends is
107
great, it does mean a slightly more complex recipe when
108
importing large projects via exporters that reuse blob data
109
across commits, namely::
113
bzr fast-import-info -v xxx.fi > xxx.cfg
114
bzr fast-import xxx.fi --info xxx.cfg
116
In this scenario, the xxx.cfg file generated by the first pass
117
holds caching hints that the second pass uses to lower memory
120
At checkpoints and on completion, the commit-id -> revision-id
121
map is saved to a file called 'fastimport-id-map' in the control
122
directory for the repository (e.g. .bzr/repository). If the import
123
is interrupted or unexpectedly crashes, it can be started again
124
and this file will be used to skip over already loaded revisions.
125
As long as subsequent exports from the original source begin
126
with exactly the same revisions, you can use this feature to
127
maintain a mirror of a repository managed by a foreign tool.
128
If and when Bazaar is used to manage the repository, this file
129
can be safely deleted.
131
If you wish to write a custom exporter for your project, see
132
http://bazaar-vcs.org/BzrFastImport for the detailed protocol
133
specification. In many cases, exporters can be written quite
134
quickly using whatever scripting/programming language you like.
139
git-fast-export --signed-tags=warn | bzr fast-import -
141
Import a Git repository into Bazaar.
143
svn-fast-export.py /svn/repo/path | bzr fast-import -
145
Import a Subversion repository into Bazaar.
147
hg-fast-export.py -r /hg/repo/path | bzr fast-import -
149
Import a Mercurial repository into Bazaar.
152
_see_also = ['fast-import-info', 'fast-import-query']
153
takes_args = ['source']
154
takes_options = ['verbose',
155
Option('info', type=str,
156
help="Path to file containing caching hints.",
159
help="Update working trees.",
161
Option('checkpoint', type=int,
162
help="Checkpoint automatically every N revisions.",
164
Option('count', type=int,
165
help="Import this many revisions then exit.",
167
Option('inv-cache', type=int,
168
help="Number of inventories to cache.",
170
Option('experimental',
171
help="Enable experimental features.",
173
Option('import-marks', type=str,
174
help="Import marks from file."),
175
Option('export-marks', type=str,
176
help="Export marks to file."),
179
def run(self, source, verbose=False, info=None, trees=False,
180
checkpoint=10000, count=-1, inv_cache=10,
181
experimental=True, import_marks=None, export_marks=None):
182
from bzrlib import bzrdir
183
from bzrlib.plugins.fastimport.processors import generic_processor
184
control, relpath = bzrdir.BzrDir.open_containing('.')
188
'checkpoint': checkpoint,
190
'inv-cache': inv_cache,
191
'experimental': experimental,
192
'import-marks': import_marks,
193
'export-marks': export_marks,
195
return _run(source, generic_processor.GenericProcessor, control,
199
class cmd_fast_import_filter(Command):
200
"""Filter a fast-import stream to include/exclude files & directories.
202
This command is useful for splitting a subdirectory or bunch of
203
files out from a project to create a new project complete with history
204
for just those files. It can also be used to create a new project
205
repository that removes all references to files that should not have
206
been committed, e.g. security-related information (like passwords),
207
commercially sensitive material, files with an incompatible license or
208
large binary files like CD images.
210
When filtering out a subdirectory (or file), the new stream uses the
211
subdirectory (or subdirectory containing the file) as the root. As
212
fast-import doesn't know in advance whether a path is a file or
213
directory in the stream, you need to specify a trailing '/' on
214
directories passed to the --includes option. If multiple files or
215
directories are given, the new root is the deepest common directory.
217
To specify standard input as the input stream, use a source
220
Note: If a path has been renamed, take care to specify the *original*
221
path name, not the final name that it ends up with.
225
Create a new project from a library. (Note the trailing / on the
226
directory name of the library.)
228
front-end | bzr fast-import-filter -i lib/xxx/ > xxx.fi
229
bzr init-repo mylibrary
231
bzr fast-import ../xxx.fi
232
(lib/xxx/foo is now foo)
234
Create a new repository without a sensitive file.
236
front-end | bzr fast-import-filter -x missile-codes.txt > clean.fi
237
bzr init-repo project.clean
239
bzr fast-import ../clean.fi
242
_see_also = ['fast-import']
243
takes_args = ['source']
244
takes_options = ['verbose',
245
ListOption('include_paths', short_name='i', type=str,
246
help="Only include commits affecting these paths."
247
" Directories should have a trailing /."
249
ListOption('exclude_paths', short_name='x', type=str,
250
help="Exclude these paths from commits."
254
def run(self, source, verbose=False, include_paths=None,
256
from bzrlib.plugins.fastimport.processors import filter_processor
258
'include_paths': include_paths,
259
'exclude_paths': exclude_paths,
261
return _run(source, filter_processor.FilterProcessor, None, params,
265
class cmd_fast_import_info(Command):
266
"""Output information about a fast-import stream.
268
This command reads a fast-import stream and outputs
269
statistics and interesting properties about what it finds.
270
When run in verbose mode, the information is output as a
271
configuration file that can be passed to fast-import to
272
assist it in intelligently caching objects.
274
To specify standard input as the input stream, use a source
279
front-end | bzr fast-import-info -
281
Display statistics about the import stream produced by front-end.
283
front-end | bzr fast-import-info -v - > front-end.cfg
285
Create a hints file for running fast-import on a large repository.
288
_see_also = ['fast-import']
289
takes_args = ['source']
290
takes_options = ['verbose']
292
def run(self, source, verbose=False):
293
from bzrlib.plugins.fastimport.processors import info_processor
294
return _run(source, info_processor.InfoProcessor, None, {}, verbose)
297
class cmd_fast_import_query(Command):
298
"""Query a fast-import stream displaying selected commands.
300
To specify standard input as the input stream, use a source
301
name of '-'. To specify the commands to display, use the -C
302
option one or more times. To specify just some fields for
303
a command, use the syntax::
307
By default, the nominated fields for the nominated commands
308
are displayed tab separated. To see the information in
309
a name:value format, use verbose mode.
311
Note: Binary fields (e.g. data for blobs) are masked out
312
so it is generally safe to view the output in a terminal.
317
bzr fast-import-query xxx.fi -Creset -Ctag
319
Show all the fields of the reset and tag commands.
321
bzr fast-import-query xxx.fi -Ccommit=mark,merge
323
Show the mark and merge fields of the commit commands.
326
_see_also = ['fast-import']
327
takes_args = ['source']
328
takes_options = ['verbose',
329
ListOption('commands', short_name='C', type=str,
330
help="Display fields for these commands."
334
def run(self, source, verbose=False, commands=None):
335
from bzrlib.plugins.fastimport.processors import query_processor
336
from bzrlib.plugins.fastimport import helpers
337
params = helpers.defines_to_dict(commands)
338
return _run(source, query_processor.QueryProcessor, None, params,
342
register_command(cmd_fast_import)
343
register_command(cmd_fast_import_filter)
344
register_command(cmd_fast_import_info)
345
register_command(cmd_fast_import_query)