Merge in support for --dont-squash-empty-commits.
[bzr-fastimport.git] / cmds.py
blob06dc1f7258ede256970175987bcf1024285a739e
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, see <http://www.gnu.org/licenses/>.
16 """Fastimport/fastexport commands."""
18 from bzrlib import bzrdir
19 from bzrlib.commands import Command
20 from bzrlib.option import Option, ListOption, RegistryOption
22 from bzrlib.plugins.fastimport import load_fastimport
25 def _run(source, processor_factory, verbose=False, user_map=None, **kwargs):
26 """Create and run a processor.
28 :param source: a filename or '-' for standard input. If the
29 filename ends in .gz, it will be opened as a gzip file and
30 the stream will be implicitly uncompressed
31 :param processor_factory: a callable for creating a processor
32 :param user_map: if not None, the file containing the user map.
33 """
34 from fastimport import parser
35 stream = _get_source_stream(source)
36 user_mapper = _get_user_mapper(user_map)
37 proc = processor_factory(verbose=verbose, **kwargs)
38 p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
39 return proc.process(p.iter_commands)
42 def _get_source_stream(source):
43 if source == '-' or source is None:
44 import sys
45 from fastimport import helpers
46 stream = helpers.binary_stream(sys.stdin)
47 elif source.endswith('.gz'):
48 import gzip
49 stream = gzip.open(source, "rb")
50 else:
51 stream = open(source, "rb")
52 return stream
55 def _get_user_mapper(filename):
56 import user_mapper
57 if filename is None:
58 return None
59 f = open(filename)
60 lines = f.readlines()
61 f.close()
62 return user_mapper.UserMapper(lines)
65 class cmd_fast_import(Command):
66 """Backend for fast Bazaar data importers.
68 This command reads a mixed command/data stream and creates
69 branches in a Bazaar repository accordingly. The preferred
70 recipe is::
72 bzr fast-import project.fi project.bzr
74 Numerous commands are provided for generating a fast-import file
75 to use as input. These are named fast-export-from-xxx where xxx
76 is one of cvs, darcs, git, hg, mtn, p4 or svn.
77 To specify standard input as the input stream, use a
78 source name of '-' (instead of project.fi). If the source name
79 ends in '.gz', it is assumed to be compressed in gzip format.
81 project.bzr will be created if it doesn't exist. If it exists
82 already, it should be empty or be an existing Bazaar repository
83 or branch. If not specified, the current directory is assumed.
85 fast-import will intelligently select the format to use when
86 creating a repository or branch. If you are running Bazaar 1.17
87 up to Bazaar 2.0, the default format for Bazaar 2.x ("2a") is used.
88 Otherwise, the current default format ("pack-0.92" for Bazaar 1.x)
89 is used. If you wish to specify a custom format, use the `--format`
90 option.
92 .. note::
94 To maintain backwards compatibility, fast-import lets you
95 create the target repository or standalone branch yourself.
96 It is recommended though that you let fast-import create
97 these for you instead.
99 :Branch mapping rules:
101 Git reference names are mapped to Bazaar branch names as follows:
103 * refs/heads/foo is mapped to foo
104 * refs/remotes/origin/foo is mapped to foo.remote
105 * refs/tags/foo is mapped to foo.tag
106 * */master is mapped to trunk, trunk.remote, etc.
107 * */trunk is mapped to git-trunk, git-trunk.remote, etc.
109 :Branch creation rules:
111 When a shared repository is created or found at the destination,
112 branches are created inside it. In the simple case of a single
113 branch (refs/heads/master) inside the input file, the branch is
114 project.bzr/trunk.
116 When a standalone branch is found at the destination, the trunk
117 is imported there and warnings are output about any other branches
118 found in the input file.
120 When a branch in a shared repository is found at the destination,
121 that branch is made the trunk and other branches, if any, are
122 created in sister directories.
124 :Working tree updates:
126 The working tree is generated for the trunk branch. If multiple
127 branches are created, a message is output on completion explaining
128 how to create the working trees for other branches.
130 :Custom exporters:
132 The fast-export-from-xxx commands typically call more advanced
133 xxx-fast-export scripts. You are welcome to use the advanced
134 scripts if you prefer.
136 If you wish to write a custom exporter for your project, see
137 http://bazaar-vcs.org/BzrFastImport for the detailed protocol
138 specification. In many cases, exporters can be written quite
139 quickly using whatever scripting/programming language you like.
141 :User mapping:
143 Some source repositories store just the user name while Bazaar
144 prefers a full email address. You can adjust user-ids while
145 importing by using the --user-map option. The argument is a
146 text file with lines in the format::
148 old-id = new-id
150 Blank lines and lines beginning with # are ignored.
151 If old-id has the special value '@', then users without an
152 email address will get one created by using the matching new-id
153 as the domain, unless a more explicit address is given for them.
154 For example, given the user-map of::
156 @ = example.com
157 bill = William Jones <bill@example.com>
159 then user-ids are mapped as follows::
161 maria => maria <maria@example.com>
162 bill => William Jones <bill@example.com>
164 .. note::
166 User mapping is supported by both the fast-import and
167 fast-import-filter commands.
169 :Blob tracking:
171 As some exporters (like git-fast-export) reuse blob data across
172 commits, fast-import makes two passes over the input file by
173 default. In the first pass, it collects data about what blobs are
174 used when, along with some other statistics (e.g. total number of
175 commits). In the second pass, it generates the repository and
176 branches.
178 .. note::
180 The initial pass isn't done if the --info option is used
181 to explicitly pass in information about the input stream.
182 It also isn't done if the source is standard input. In the
183 latter case, memory consumption may be higher than otherwise
184 because some blobs may be kept in memory longer than necessary.
186 :Restarting an import:
188 At checkpoints and on completion, the commit-id -> revision-id
189 map is saved to a file called 'fastimport-id-map' in the control
190 directory for the repository (e.g. .bzr/repository). If the import
191 is interrupted or unexpectedly crashes, it can be started again
192 and this file will be used to skip over already loaded revisions.
193 As long as subsequent exports from the original source begin
194 with exactly the same revisions, you can use this feature to
195 maintain a mirror of a repository managed by a foreign tool.
196 If and when Bazaar is used to manage the repository, this file
197 can be safely deleted.
199 :Examples:
201 Import a Subversion repository into Bazaar::
203 bzr fast-export-from-svn /svn/repo/path project.fi
204 bzr fast-import project.fi project.bzr
206 Import a CVS repository into Bazaar::
208 bzr fast-export-from-cvs /cvs/repo/path project.fi
209 bzr fast-import project.fi project.bzr
211 Import a Git repository into Bazaar::
213 bzr fast-export-from-git /git/repo/path project.fi
214 bzr fast-import project.fi project.bzr
216 Import a Mercurial repository into Bazaar::
218 bzr fast-export-from-hg /hg/repo/path project.fi
219 bzr fast-import project.fi project.bzr
221 Import a Darcs repository into Bazaar::
223 bzr fast-export-from-darcs /darcs/repo/path project.fi
224 bzr fast-import project.fi project.bzr
226 hidden = False
227 _see_also = ['fast-export', 'fast-import-filter', 'fast-import-info']
228 takes_args = ['source', 'destination?']
229 takes_options = ['verbose',
230 Option('user-map', type=str,
231 help="Path to file containing a map of user-ids.",
233 Option('info', type=str,
234 help="Path to file containing caching hints.",
236 Option('trees',
237 help="Update all working trees, not just trunk's.",
239 Option('count', type=int,
240 help="Import this many revisions then exit.",
242 Option('checkpoint', type=int,
243 help="Checkpoint automatically every N revisions."
244 " The default is 10000.",
246 Option('autopack', type=int,
247 help="Pack every N checkpoints. The default is 4.",
249 Option('inv-cache', type=int,
250 help="Number of inventories to cache.",
252 RegistryOption.from_kwargs('mode',
253 'The import algorithm to use.',
254 title='Import Algorithm',
255 default='Use the preferred algorithm (inventory deltas).',
256 classic="Use the original algorithm (mutable inventories).",
257 experimental="Enable experimental features.",
258 value_switches=True, enum_switch=False,
260 Option('import-marks', type=str,
261 help="Import marks from file."
263 Option('export-marks', type=str,
264 help="Export marks to file."
266 RegistryOption('format',
267 help='Specify a format for the created repository. See'
268 ' "bzr help formats" for details.',
269 lazy_registry=('bzrlib.bzrdir', 'format_registry'),
270 converter=lambda name: bzrdir.format_registry.make_bzrdir(name),
271 value_switches=False, title='Repository format'),
273 def run(self, source, destination='.', verbose=False, info=None,
274 trees=False, count=-1, checkpoint=10000, autopack=4, inv_cache=-1,
275 mode=None, import_marks=None, export_marks=None, format=None,
276 user_map=None):
277 load_fastimport()
278 from bzrlib.plugins.fastimport.processors import generic_processor
279 from bzrlib.plugins.fastimport.helpers import (
280 open_destination_directory,
282 # If no format is given and the user is running a release
283 # leading up to 2.0, select 2a for them. Otherwise, use
284 # the default format.
285 if format is None:
286 import bzrlib
287 bzr_version = bzrlib.version_info[0:2]
288 if bzr_version in [(1,17), (1,18), (2,0)]:
289 format = bzrdir.format_registry.make_bzrdir('2a')
290 control = open_destination_directory(destination, format=format)
292 # If an information file was given and the source isn't stdin,
293 # generate the information by reading the source file as a first pass
294 if info is None and source != '-':
295 info = self._generate_info(source)
297 # Do the work
298 if mode is None:
299 mode = 'default'
300 params = {
301 'info': info,
302 'trees': trees,
303 'count': count,
304 'checkpoint': checkpoint,
305 'autopack': autopack,
306 'inv-cache': inv_cache,
307 'mode': mode,
308 'import-marks': import_marks,
309 'export-marks': export_marks,
311 return _run(source, generic_processor.GenericProcessor,
312 bzrdir=control, params=params, verbose=verbose,
313 user_map=user_map)
315 def _generate_info(self, source):
316 from cStringIO import StringIO
317 from fastimport import parser
318 from fastimport.processors import info_processor
319 stream = _get_source_stream(source)
320 output = StringIO()
321 try:
322 proc = info_processor.InfoProcessor(verbose=True, outf=output)
323 p = parser.ImportParser(stream)
324 return_code = proc.process(p.iter_commands)
325 lines = output.getvalue().splitlines()
326 finally:
327 output.close()
328 stream.seek(0)
329 return lines
332 class cmd_fast_import_filter(Command):
333 """Filter a fast-import stream to include/exclude files & directories.
335 This command is useful for splitting a subdirectory or bunch of
336 files out from a project to create a new project complete with history
337 for just those files. It can also be used to create a new project
338 repository that removes all references to files that should not have
339 been committed, e.g. security-related information (like passwords),
340 commercially sensitive material, files with an incompatible license or
341 large binary files like CD images.
343 To specify standard input as the input stream, use a source name
344 of '-'. If the source name ends in '.gz', it is assumed to be
345 compressed in gzip format.
347 :File/directory filtering:
349 This is supported by the -i and -x options. Excludes take precedence
350 over includes.
352 When filtering out a subdirectory (or file), the new stream uses the
353 subdirectory (or subdirectory containing the file) as the root. As
354 fast-import doesn't know in advance whether a path is a file or
355 directory in the stream, you need to specify a trailing '/' on
356 directories passed to the `--includes option`. If multiple files or
357 directories are given, the new root is the deepest common directory.
359 Note: If a path has been renamed, take care to specify the *original*
360 path name, not the final name that it ends up with.
362 :User mapping:
364 Some source repositories store just the user name while Bazaar
365 prefers a full email address. You can adjust user-ids
366 by using the --user-map option. The argument is a
367 text file with lines in the format::
369 old-id = new-id
371 Blank lines and lines beginning with # are ignored.
372 If old-id has the special value '@', then users without an
373 email address will get one created by using the matching new-id
374 as the domain, unless a more explicit address is given for them.
375 For example, given the user-map of::
377 @ = example.com
378 bill = William Jones <bill@example.com>
380 then user-ids are mapped as follows::
382 maria => maria <maria@example.com>
383 bill => William Jones <bill@example.com>
385 .. note::
387 User mapping is supported by both the fast-import and
388 fast-import-filter commands.
390 :History rewriting:
392 By default fast-import-filter does quite aggressive history rewriting.
393 Empty commits (or commits which had all their content filtered out) will
394 be removed, and so are the references to commits not included in the stream.
396 Flag --dont-squash-empty-commits reverses this behavior and makes it possible to
397 use fast-import-filter on incremental streams.
399 :Examples:
401 Create a new project from a library (note the trailing / on the
402 directory name of the library)::
404 front-end | bzr fast-import-filter -i lib/xxx/ > xxx.fi
405 bzr fast-import xxx.fi mylibrary.bzr
406 (lib/xxx/foo is now foo)
408 Create a new repository without a sensitive file::
410 front-end | bzr fast-import-filter -x missile-codes.txt > clean.fi
411 bzr fast-import clean.fi clean.bzr
413 hidden = False
414 _see_also = ['fast-import']
415 takes_args = ['source?']
416 takes_options = ['verbose',
417 ListOption('include_paths', short_name='i', type=str,
418 help="Only include commits affecting these paths."
419 " Directories should have a trailing /."
421 ListOption('exclude_paths', short_name='x', type=str,
422 help="Exclude these paths from commits."
424 Option('user-map', type=str,
425 help="Path to file containing a map of user-ids.",
427 Option('dont-squash-empty-commits',
428 help="Preserve all commits and links between them"
431 encoding_type = 'exact'
432 def run(self, source=None, verbose=False, include_paths=None,
433 exclude_paths=None, user_map=None, dont_squash_empty_commits=False):
434 from bzrlib.errors import BzrCommandError
435 load_fastimport()
436 from fastimport.processors import filter_processor
437 params = {
438 'include_paths': include_paths,
439 'exclude_paths': exclude_paths,
441 if ('squash_empty_commits' in
442 filter_processor.FilterProcessor.known_params):
443 params['squash_empty_commits'] = (not dont_squash_empty_commits)
444 else:
445 if dont_squash_empty_commits:
446 raise BzrCommandError("installed python-fastimport does not "
447 "support not squashing empty commits. Please install "
448 " a newer python-fastimport to use "
449 "--dont-squash-empty-commits")
451 from fastimport import parser
452 stream = _get_source_stream(source)
453 user_mapper = _get_user_mapper(user_map)
454 proc = filter_processor.FilterProcessor(params=params, verbose=verbose)
455 p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
456 return proc.process(p.iter_commands)
459 class cmd_fast_import_info(Command):
460 """Output information about a fast-import stream.
462 This command reads a fast-import stream and outputs
463 statistics and interesting properties about what it finds.
464 When run in verbose mode, the information is output as a
465 configuration file that can be passed to fast-import to
466 assist it in intelligently caching objects.
468 To specify standard input as the input stream, use a source name
469 of '-'. If the source name ends in '.gz', it is assumed to be
470 compressed in gzip format.
472 :Examples:
474 Display statistics about the import stream produced by front-end::
476 front-end | bzr fast-import-info -
478 Create a hints file for running fast-import on a large repository::
480 front-end | bzr fast-import-info -v - > front-end.cfg
482 hidden = False
483 _see_also = ['fast-import']
484 takes_args = ['source']
485 takes_options = ['verbose']
486 def run(self, source, verbose=False):
487 load_fastimport()
488 from fastimport.processors import info_processor
489 return _run(source, info_processor.InfoProcessor, verbose=verbose)
492 class cmd_fast_import_query(Command):
493 """Query a fast-import stream displaying selected commands.
495 To specify standard input as the input stream, use a source name
496 of '-'. If the source name ends in '.gz', it is assumed to be
497 compressed in gzip format.
499 To specify a commit to display, give its mark using the
500 --commit-mark option. The commit will be displayed with
501 file-commands included but with inline blobs hidden.
503 To specify the commands to display, use the -C option one or
504 more times. To specify just some fields for a command, use the
505 syntax::
507 command=field1,...
509 By default, the nominated fields for the nominated commands
510 are displayed tab separated. To see the information in
511 a name:value format, use verbose mode.
513 Note: Binary fields (e.g. data for blobs) are masked out
514 so it is generally safe to view the output in a terminal.
516 :Examples:
518 Show the commit with mark 429::
520 bzr fast-import-query xxx.fi -m429
522 Show all the fields of the reset and tag commands::
524 bzr fast-import-query xxx.fi -Creset -Ctag
526 Show the mark and merge fields of the commit commands::
528 bzr fast-import-query xxx.fi -Ccommit=mark,merge
530 hidden = True
531 _see_also = ['fast-import', 'fast-import-filter']
532 takes_args = ['source']
533 takes_options = ['verbose',
534 Option('commit-mark', short_name='m', type=str,
535 help="Mark of the commit to display."
537 ListOption('commands', short_name='C', type=str,
538 help="Display fields for these commands."
541 def run(self, source, verbose=False, commands=None, commit_mark=None):
542 load_fastimport()
543 from fastimport.processors import query_processor
544 from bzrlib.plugins.fastimport import helpers
545 params = helpers.defines_to_dict(commands) or {}
546 if commit_mark:
547 params['commit-mark'] = commit_mark
548 return _run(source, query_processor.QueryProcessor, params=params,
549 verbose=verbose)
552 class cmd_fast_export(Command):
553 """Generate a fast-import stream from a Bazaar branch.
555 This program generates a stream from a Bazaar branch in fast-import
556 format used by tools such as bzr fast-import, git-fast-import and
557 hg-fast-import.
559 If no destination is given or the destination is '-', standard output
560 is used. Otherwise, the destination is the name of a file. If the
561 destination ends in '.gz', the output will be compressed into gzip
562 format.
564 :Round-tripping:
566 Recent versions of the fast-import specification support features
567 that allow effective round-tripping of many Bazaar branches. As
568 such, fast-exporting a branch and fast-importing the data produced
569 will create a new repository with equivalent history, i.e.
570 "bzr log -v -p --include-merges --forward" on the old branch and
571 new branch should produce similar, if not identical, results.
573 .. note::
575 Be aware that the new repository may appear to have similar history
576 but internally it is quite different with new revision-ids and
577 file-ids assigned. As a consequence, the ability to easily merge
578 with branches based on the old repository is lost. Depending on your
579 reasons for producing a new repository, this may or may not be an
580 issue.
582 :Interoperability:
584 fast-export can use the following "extended features" to
585 produce a richer data stream:
587 * *multiple-authors* - if a commit has multiple authors (as commonly
588 occurs in pair-programming), all authors will be included in the
589 output, not just the first author
591 * *commit-properties* - custom metadata per commit that Bazaar stores
592 in revision properties (e.g. branch-nick and bugs fixed by this
593 change) will be included in the output.
595 * *empty-directories* - directories, even the empty ones, will be
596 included in the output.
598 To disable these features and produce output acceptable to git 1.6,
599 use the --plain option. To enable these features, use --no-plain.
600 Currently, --plain is the default but that will change in the near
601 future once the feature names and definitions are formally agreed
602 to by the broader fast-import developer community.
604 Git has stricter naming rules for tags and fast-export --plain
605 will skip tags which can't be imported into git. To replace characters
606 unsupported in git with an underscore instead, specify
607 --rewrite-tag-names.
609 :Examples:
611 To produce data destined for import into Bazaar::
613 bzr fast-export --no-plain my-bzr-branch my.fi.gz
615 To produce data destined for Git 1.6::
617 bzr fast-export --plain my-bzr-branch my.fi
619 To import several unmerged but related branches into the same repository,
620 use the --{export,import}-marks options, and specify a name for the git
621 branch like this::
623 bzr fast-export --export-marks=marks.bzr project.dev |
624 GIT_DIR=project/.git git-fast-import --export-marks=marks.git
626 bzr fast-export --import-marks=marks.bzr -b other project.other |
627 GIT_DIR=project/.git git-fast-import --import-marks=marks.git
629 If you get a "Missing space after source" error from git-fast-import,
630 see the top of the commands.py module for a work-around.
632 hidden = False
633 _see_also = ['fast-import', 'fast-import-filter']
634 takes_args = ['source', 'destination?']
635 takes_options = ['verbose', 'revision',
636 Option('git-branch', short_name='b', type=str,
637 argname='FILE',
638 help='Name of the git branch to create (default=master).'
640 Option('checkpoint', type=int, argname='N',
641 help="Checkpoint every N revisions (default=10000)."
643 Option('marks', type=str, argname='FILE',
644 help="Import marks from and export marks to file."
646 Option('import-marks', type=str, argname='FILE',
647 help="Import marks from file."
649 Option('export-marks', type=str, argname='FILE',
650 help="Export marks to file."
652 Option('plain',
653 help="Exclude metadata to maximise interoperability."
655 Option('rewrite-tag-names',
656 help="Replace characters invalid in git with '_'"
657 " (plain mode only).",
660 encoding_type = 'exact'
661 def run(self, source, destination=None, verbose=False,
662 git_branch="master", checkpoint=10000, marks=None,
663 import_marks=None, export_marks=None, revision=None,
664 plain=True, rewrite_tag_names=False):
665 load_fastimport()
666 from bzrlib.plugins.fastimport import exporter
668 if marks:
669 import_marks = export_marks = marks
670 exporter = exporter.BzrFastExporter(source,
671 destination=destination,
672 git_branch=git_branch, checkpoint=checkpoint,
673 import_marks_file=import_marks, export_marks_file=export_marks,
674 revision=revision, verbose=verbose, plain_format=plain,
675 rewrite_tags=rewrite_tag_names)
676 return exporter.run()
679 class cmd_fast_export_from_cvs(Command):
680 """Generate a fast-import file from a CVS repository.
682 Destination is a dump file, typically named xxx.fi where xxx is
683 the name of the project. If '-' is given, standard output is used.
685 cvs2svn 2.3 or later must be installed as its cvs2bzr script is used
686 under the covers to do the export.
688 The source must be the path on your filesystem to the part of the
689 repository you wish to convert. i.e. either that path or a parent
690 directory must contain a CVSROOT subdirectory. The path may point to
691 either the top of a repository or to a path within it. In the latter
692 case, only that project within the repository will be converted.
694 .. note::
695 Remote access to the repository is not sufficient - the path
696 must point into a copy of the repository itself. See
697 http://cvs2svn.tigris.org/faq.html#repoaccess for instructions
698 on how to clone a remote CVS repository locally.
700 By default, the trunk, branches and tags are all exported. If you
701 only want the trunk, use the `--trunk-only` option.
703 By default, filenames, log messages and author names are expected
704 to be encoded in ascii. Use the `--encoding` option to specify an
705 alternative. If multiple encodings are used, specify the option
706 multiple times. For a list of valid encoding names, see
707 http://docs.python.org/lib/standard-encodings.html.
709 Windows users need to install GNU sort and use the `--sort`
710 option to specify its location. GNU sort can be downloaded from
711 http://unxutils.sourceforge.net/.
713 hidden = False
714 _see_also = ['fast-import', 'fast-import-filter']
715 takes_args = ['source', 'destination']
716 takes_options = ['verbose',
717 Option('trunk-only',
718 help="Export just the trunk, ignoring tags and branches."
720 ListOption('encoding', type=str, argname='CODEC',
721 help="Encoding used for filenames, commit messages "
722 "and author names if not ascii."
724 Option('sort', type=str, argname='PATH',
725 help="GNU sort program location if not on the path."
728 encoding_type = 'exact'
729 def run(self, source, destination, verbose=False, trunk_only=False,
730 encoding=None, sort=None):
731 load_fastimport()
732 from bzrlib.plugins.fastimport.exporters import fast_export_from
733 custom = []
734 if trunk_only:
735 custom.append("--trunk-only")
736 if encoding:
737 for enc in encoding:
738 custom.extend(['--encoding', enc])
739 if sort:
740 custom.extend(['--sort', sort])
741 fast_export_from(source, destination, 'cvs', verbose, custom)
744 class cmd_fast_export_from_darcs(Command):
745 """Generate a fast-import file from a Darcs repository.
747 Destination is a dump file, typically named xxx.fi where xxx is
748 the name of the project. If '-' is given, standard output is used.
750 Darcs 2.2 or later must be installed as various subcommands are
751 used to access the source repository. The source may be a network
752 URL but using a local URL is recommended for performance reasons.
754 hidden = False
755 _see_also = ['fast-import', 'fast-import-filter']
756 takes_args = ['source', 'destination']
757 takes_options = ['verbose',
758 Option('encoding', type=str, argname='CODEC',
759 help="Encoding used for commit messages if not utf-8."
762 encoding_type = 'exact'
763 def run(self, source, destination, verbose=False, encoding=None):
764 from bzrlib.plugins.fastimport.exporters import fast_export_from
765 custom = None
766 if encoding is not None:
767 custom = ['--encoding', encoding]
768 fast_export_from(source, destination, 'darcs', verbose, custom)
771 class cmd_fast_export_from_hg(Command):
772 """Generate a fast-import file from a Mercurial repository.
774 Destination is a dump file, typically named xxx.fi where xxx is
775 the name of the project. If '-' is given, standard output is used.
777 Mercurial 1.2 or later must be installed as its libraries are used
778 to access the source repository. Given the APIs currently used,
779 the source repository must be a local file, not a network URL.
781 hidden = False
782 _see_also = ['fast-import', 'fast-import-filter']
783 takes_args = ['source', 'destination']
784 takes_options = ['verbose']
785 encoding_type = 'exact'
786 def run(self, source, destination, verbose=False):
787 load_fastimport()
788 from bzrlib.plugins.fastimport.exporters import fast_export_from
789 fast_export_from(source, destination, 'hg', verbose)
792 class cmd_fast_export_from_git(Command):
793 """Generate a fast-import file from a Git repository.
795 Destination is a dump file, typically named xxx.fi where xxx is
796 the name of the project. If '-' is given, standard output is used.
798 Git 1.6 or later must be installed as the git fast-export
799 subcommand is used under the covers to generate the stream.
800 The source must be a local directory.
802 .. note::
804 Earlier versions of Git may also work fine but are
805 likely to receive less active support if problems arise.
807 hidden = False
808 _see_also = ['fast-import', 'fast-import-filter']
809 takes_args = ['source', 'destination']
810 takes_options = ['verbose']
811 encoding_type = 'exact'
812 def run(self, source, destination, verbose=False):
813 load_fastimport()
814 from bzrlib.plugins.fastimport.exporters import fast_export_from
815 fast_export_from(source, destination, 'git', verbose)
818 class cmd_fast_export_from_mtn(Command):
819 """Generate a fast-import file from a Monotone repository.
821 Destination is a dump file, typically named xxx.fi where xxx is
822 the name of the project. If '-' is given, standard output is used.
824 Monotone 0.43 or later must be installed as the mtn git_export
825 subcommand is used under the covers to generate the stream.
826 The source must be a local directory.
828 hidden = False
829 _see_also = ['fast-import', 'fast-import-filter']
830 takes_args = ['source', 'destination']
831 takes_options = ['verbose']
832 encoding_type = 'exact'
833 def run(self, source, destination, verbose=False):
834 load_fastimport()
835 from bzrlib.plugins.fastimport.exporters import fast_export_from
836 fast_export_from(source, destination, 'mtn', verbose)
839 class cmd_fast_export_from_p4(Command):
840 """Generate a fast-import file from a Perforce repository.
842 Source is a Perforce depot path, e.g., //depot/project
844 Destination is a dump file, typically named xxx.fi where xxx is
845 the name of the project. If '-' is given, standard output is used.
847 bzrp4 must be installed as its p4_fast_export.py module is used under
848 the covers to do the export. bzrp4 can be downloaded from
849 https://launchpad.net/bzrp4/.
851 The P4PORT environment variable must be set, and you must be logged
852 into the Perforce server.
854 By default, only the HEAD changelist is exported. To export all
855 changelists, append '@all' to the source. To export a revision range,
856 append a comma-delimited pair of changelist numbers to the source,
857 e.g., '100,200'.
859 hidden = False
860 _see_also = ['fast-import', 'fast-import-filter']
861 takes_args = ['source', 'destination']
862 takes_options = []
863 encoding_type = 'exact'
864 def run(self, source, destination, verbose=False):
865 load_fastimport()
866 from bzrlib.plugins.fastimport.exporters import fast_export_from
867 custom = []
868 fast_export_from(source, destination, 'p4', verbose, custom)
871 class cmd_fast_export_from_svn(Command):
872 """Generate a fast-import file from a Subversion repository.
874 Destination is a dump file, typically named xxx.fi where xxx is
875 the name of the project. If '-' is given, standard output is used.
877 Python-Subversion (Python bindings to the Subversion APIs)
878 1.4 or later must be installed as this library is used to
879 access the source repository. The source may be a network URL
880 but using a local URL is recommended for performance reasons.
882 hidden = False
883 _see_also = ['fast-import', 'fast-import-filter']
884 takes_args = ['source', 'destination']
885 takes_options = ['verbose',
886 Option('trunk-path', type=str, argname="STR",
887 help="Path in repo to /trunk.\n"
888 "May be `regex:/cvs/(trunk)/proj1/(.*)` in "
889 "which case the first group is used as the "
890 "branch name and the second group is used "
891 "to match files.",
894 encoding_type = 'exact'
895 def run(self, source, destination, verbose=False, trunk_path=None):
896 load_fastimport()
897 from bzrlib.plugins.fastimport.exporters import fast_export_from
898 custom = []
899 if trunk_path is not None:
900 custom.extend(['--trunk-path', trunk_path])
901 fast_export_from(source, destination, 'svn', verbose, custom)