/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
1
# Copyright (C) 2008 Canonical Ltd
2
#
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.
7
#
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.
12
#
13
# You should have received a copy of the GNU General Public License
0.64.334 by Jelmer Vernooij
Remove old FSF address. Thanks Dan Callaghan.
14
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
15
16
"""Fastimport/fastexport commands."""
17
18
from bzrlib import bzrdir
19
from bzrlib.commands import Command
20
from bzrlib.option import Option, ListOption, RegistryOption
21
22
from bzrlib.plugins.fastimport import load_fastimport
23
24
0.64.310 by Jelmer Vernooij
Fix fast-import-info.
25
def _run(source, processor_factory, verbose=False, user_map=None, **kwargs):
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
26
    """Create and run a processor.
27
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)
0.64.310 by Jelmer Vernooij
Fix fast-import-info.
37
    proc = processor_factory(verbose=verbose, **kwargs)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
38
    p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
39
    return proc.process(p.iter_commands)
40
41
42
def _get_source_stream(source):
0.64.321 by Jelmer Vernooij
Allow fast-import-filter to be used without first argument.
43
    if source == '-' or source is None:
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
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
53
54
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)
63
64
65
class cmd_fast_import(Command):
66
    """Backend for fast Bazaar data importers.
67
68
    This command reads a mixed command/data stream and creates
69
    branches in a Bazaar repository accordingly. The preferred
70
    recipe is::
71
72
      bzr fast-import project.fi project.bzr
73
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.
80
    
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.
84
 
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.
91
92
     .. note::
93
     
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.
98
99
    :Branch mapping rules:
100
101
     Git reference names are mapped to Bazaar branch names as follows:
102
      
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.
108
109
    :Branch creation rules:
110
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.
115
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.
119
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.
123
124
    :Working tree updates:
125
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.
129
130
    :Custom exporters:
131
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.
135
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.
140
141
    :User mapping:
142
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::
147
148
       old-id = new-id
149
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::
155
156
       @ = example.com
157
       bill = William Jones <bill@example.com>
158
159
     then user-ids are mapped as follows::
160
     
161
      maria => maria <maria@example.com>
162
      bill => William Jones <bill@example.com>
163
164
     .. note::
165
     
166
        User mapping is supported by both the fast-import and
167
        fast-import-filter commands.
168
169
    :Blob tracking:
170
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.
177
     
178
     .. note::
179
     
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.
185
186
    :Restarting an import:
187
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.
198
199
    :Examples:
200
201
     Import a Subversion repository into Bazaar::
202
203
       bzr fast-export-from-svn /svn/repo/path project.fi
204
       bzr fast-import project.fi project.bzr
205
206
     Import a CVS repository into Bazaar::
207
208
       bzr fast-export-from-cvs /cvs/repo/path project.fi
209
       bzr fast-import project.fi project.bzr
210
211
     Import a Git repository into Bazaar::
212
213
       bzr fast-export-from-git /git/repo/path project.fi
214
       bzr fast-import project.fi project.bzr
215
216
     Import a Mercurial repository into Bazaar::
217
218
       bzr fast-export-from-hg /hg/repo/path project.fi
219
       bzr fast-import project.fi project.bzr
220
221
     Import a Darcs repository into Bazaar::
222
223
       bzr fast-export-from-darcs /darcs/repo/path project.fi
224
       bzr fast-import project.fi project.bzr
225
    """
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.",
232
                        ),
233
                    Option('info', type=str,
234
                        help="Path to file containing caching hints.",
235
                        ),
236
                    Option('trees',
237
                        help="Update all working trees, not just trunk's.",
238
                        ),
239
                    Option('count', type=int,
240
                        help="Import this many revisions then exit.",
241
                        ),
242
                    Option('checkpoint', type=int,
243
                        help="Checkpoint automatically every N revisions."
244
                             " The default is 10000.",
245
                        ),
246
                    Option('autopack', type=int,
247
                        help="Pack every N checkpoints. The default is 4.",
248
                        ),
249
                    Option('inv-cache', type=int,
250
                        help="Number of inventories to cache.",
251
                        ),
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,
259
                        ),
260
                    Option('import-marks', type=str,
261
                        help="Import marks from file."
262
                        ),
263
                    Option('export-marks', type=str,
264
                        help="Export marks to file."
265
                        ),
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'),
272
                     ]
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,
281
            )
282
        control = open_destination_directory(destination, format=format)
283
284
        # If an information file was given and the source isn't stdin,
285
        # generate the information by reading the source file as a first pass
286
        if info is None and source != '-':
287
            info = self._generate_info(source)
288
289
        # Do the work
290
        if mode is None:
291
            mode = 'default'
292
        params = {
293
            'info': info,
294
            'trees': trees,
295
            'count': count,
296
            'checkpoint': checkpoint,
297
            'autopack': autopack,
298
            'inv-cache': inv_cache,
299
            'mode': mode,
300
            'import-marks': import_marks,
301
            'export-marks': export_marks,
302
            }
0.131.1 by Jelmer Vernooij
Add blackbox tests for 'bzr fast-import'.
303
        return _run(source, generic_processor.GenericProcessor,
0.131.2 by Jelmer Vernooij
Fix 'bzr fast-import' bzrdir argument and add a blackbox test.
304
                bzrdir=control, params=params, verbose=verbose,
0.131.1 by Jelmer Vernooij
Add blackbox tests for 'bzr fast-import'.
305
                user_map=user_map)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
306
307
    def _generate_info(self, source):
308
        from cStringIO import StringIO
309
        from fastimport import parser
310
        from fastimport.processors import info_processor
311
        stream = _get_source_stream(source)
312
        output = StringIO()
313
        try:
314
            proc = info_processor.InfoProcessor(verbose=True, outf=output)
315
            p = parser.ImportParser(stream)
316
            return_code = proc.process(p.iter_commands)
317
            lines = output.getvalue().splitlines()
318
        finally:
319
            output.close()
320
            stream.seek(0)
321
        return lines
322
323
324
class cmd_fast_import_filter(Command):
325
    """Filter a fast-import stream to include/exclude files & directories.
326
327
    This command is useful for splitting a subdirectory or bunch of
328
    files out from a project to create a new project complete with history
329
    for just those files. It can also be used to create a new project
330
    repository that removes all references to files that should not have
331
    been committed, e.g. security-related information (like passwords),
332
    commercially sensitive material, files with an incompatible license or
333
    large binary files like CD images.
334
335
    To specify standard input as the input stream, use a source name
336
    of '-'. If the source name ends in '.gz', it is assumed to be
337
    compressed in gzip format.
338
339
    :File/directory filtering:
340
341
     This is supported by the -i and -x options. Excludes take precedence
342
     over includes.
343
344
     When filtering out a subdirectory (or file), the new stream uses the
345
     subdirectory (or subdirectory containing the file) as the root. As
346
     fast-import doesn't know in advance whether a path is a file or
347
     directory in the stream, you need to specify a trailing '/' on
348
     directories passed to the `--includes option`. If multiple files or
349
     directories are given, the new root is the deepest common directory.
350
351
     Note: If a path has been renamed, take care to specify the *original*
352
     path name, not the final name that it ends up with.
353
354
    :User mapping:
355
356
     Some source repositories store just the user name while Bazaar
357
     prefers a full email address. You can adjust user-ids
358
     by using the --user-map option. The argument is a
359
     text file with lines in the format::
360
361
       old-id = new-id
362
363
     Blank lines and lines beginning with # are ignored.
364
     If old-id has the special value '@', then users without an
365
     email address will get one created by using the matching new-id
366
     as the domain, unless a more explicit address is given for them.
367
     For example, given the user-map of::
368
369
       @ = example.com
370
       bill = William Jones <bill@example.com>
371
372
     then user-ids are mapped as follows::
373
     
374
      maria => maria <maria@example.com>
375
      bill => William Jones <bill@example.com>
376
377
     .. note::
378
     
379
        User mapping is supported by both the fast-import and
380
        fast-import-filter commands.
381
0.134.1 by Oleksandr Usov
Add preserve_all_history flag fast-import-filter
382
    :History rewriting:
383
384
     By default fast-import-filter does quite aggressive history rewriting.
385
     Empty commits (or commits which had all their content filtered out) will
386
     be removed, and so are the references to commits not included in the stream.
387
0.134.2 by Oleksandr Usov
Command-line flag renamed to --dont-squash-empty-commits
388
     Flag --dont-squash-empty-commits reverses this behavior and makes it possible to
0.134.1 by Oleksandr Usov
Add preserve_all_history flag fast-import-filter
389
     use fast-import-filter on incremental streams.
390
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
391
    :Examples:
392
393
     Create a new project from a library (note the trailing / on the
394
     directory name of the library)::
395
396
       front-end | bzr fast-import-filter -i lib/xxx/ > xxx.fi
397
       bzr fast-import xxx.fi mylibrary.bzr
398
       (lib/xxx/foo is now foo)
399
400
     Create a new repository without a sensitive file::
401
402
       front-end | bzr fast-import-filter -x missile-codes.txt > clean.fi
403
       bzr fast-import clean.fi clean.bzr
404
    """
405
    hidden = False
406
    _see_also = ['fast-import']
0.64.293 by Jelmer Vernooij
SOURCE argument to bzr fast-import-filter is now optional, consistent with examples.
407
    takes_args = ['source?']
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
408
    takes_options = ['verbose',
409
                    ListOption('include_paths', short_name='i', type=str,
410
                        help="Only include commits affecting these paths."
411
                             " Directories should have a trailing /."
412
                        ),
413
                    ListOption('exclude_paths', short_name='x', type=str,
414
                        help="Exclude these paths from commits."
415
                        ),
416
                    Option('user-map', type=str,
417
                        help="Path to file containing a map of user-ids.",
418
                        ),
0.134.2 by Oleksandr Usov
Command-line flag renamed to --dont-squash-empty-commits
419
                    Option('dont-squash-empty-commits',
0.134.1 by Oleksandr Usov
Add preserve_all_history flag fast-import-filter
420
                        help="Preserve all commits and links between them"
421
                        ),
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
422
                     ]
423
    encoding_type = 'exact'
0.64.293 by Jelmer Vernooij
SOURCE argument to bzr fast-import-filter is now optional, consistent with examples.
424
    def run(self, source=None, verbose=False, include_paths=None,
0.134.2 by Oleksandr Usov
Command-line flag renamed to --dont-squash-empty-commits
425
        exclude_paths=None, user_map=None, dont_squash_empty_commits=False):
0.64.338 by Jelmer Vernooij
Merge in support for --dont-squash-empty-commits.
426
        from bzrlib.errors import BzrCommandError
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
427
        load_fastimport()
428
        from fastimport.processors import filter_processor
429
        params = {
430
            'include_paths': include_paths,
431
            'exclude_paths': exclude_paths,
432
            }
0.64.338 by Jelmer Vernooij
Merge in support for --dont-squash-empty-commits.
433
        if ('squash_empty_commits' in
434
                filter_processor.FilterProcessor.known_params):
435
            params['squash_empty_commits'] = (not dont_squash_empty_commits)
436
        else:
437
            if dont_squash_empty_commits:
438
                raise BzrCommandError("installed python-fastimport does not "
439
                    "support not squashing empty commits. Please install "
440
                    " a newer python-fastimport to use "
441
                    "--dont-squash-empty-commits")
442
0.64.287 by Jelmer Vernooij
Fix fast-import-filter.
443
        from fastimport import parser
444
        stream = _get_source_stream(source)
445
        user_mapper = _get_user_mapper(user_map)
446
        proc = filter_processor.FilterProcessor(params=params, verbose=verbose)
447
        p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
448
        return proc.process(p.iter_commands)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
449
450
451
class cmd_fast_import_info(Command):
452
    """Output information about a fast-import stream.
453
454
    This command reads a fast-import stream and outputs
455
    statistics and interesting properties about what it finds.
456
    When run in verbose mode, the information is output as a
457
    configuration file that can be passed to fast-import to
458
    assist it in intelligently caching objects.
459
460
    To specify standard input as the input stream, use a source name
461
    of '-'. If the source name ends in '.gz', it is assumed to be
462
    compressed in gzip format.
463
464
    :Examples:
465
466
     Display statistics about the import stream produced by front-end::
467
468
      front-end | bzr fast-import-info -
469
470
     Create a hints file for running fast-import on a large repository::
471
472
       front-end | bzr fast-import-info -v - > front-end.cfg
473
    """
474
    hidden = False
475
    _see_also = ['fast-import']
476
    takes_args = ['source']
477
    takes_options = ['verbose']
478
    def run(self, source, verbose=False):
479
        load_fastimport()
480
        from fastimport.processors import info_processor
0.64.310 by Jelmer Vernooij
Fix fast-import-info.
481
        return _run(source, info_processor.InfoProcessor, verbose=verbose)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
482
483
484
class cmd_fast_import_query(Command):
485
    """Query a fast-import stream displaying selected commands.
486
487
    To specify standard input as the input stream, use a source name
488
    of '-'. If the source name ends in '.gz', it is assumed to be
489
    compressed in gzip format.
490
491
    To specify a commit to display, give its mark using the
492
    --commit-mark option. The commit will be displayed with
493
    file-commands included but with inline blobs hidden.
494
495
    To specify the commands to display, use the -C option one or
496
    more times. To specify just some fields for a command, use the
497
    syntax::
498
499
      command=field1,...
500
501
    By default, the nominated fields for the nominated commands
502
    are displayed tab separated. To see the information in
503
    a name:value format, use verbose mode.
504
505
    Note: Binary fields (e.g. data for blobs) are masked out
506
    so it is generally safe to view the output in a terminal.
507
508
    :Examples:
509
510
     Show the commit with mark 429::
511
512
      bzr fast-import-query xxx.fi -m429
513
514
     Show all the fields of the reset and tag commands::
515
516
      bzr fast-import-query xxx.fi -Creset -Ctag
517
518
     Show the mark and merge fields of the commit commands::
519
520
      bzr fast-import-query xxx.fi -Ccommit=mark,merge
521
    """
522
    hidden = True
523
    _see_also = ['fast-import', 'fast-import-filter']
524
    takes_args = ['source']
525
    takes_options = ['verbose',
526
                    Option('commit-mark', short_name='m', type=str,
527
                        help="Mark of the commit to display."
528
                        ),
529
                    ListOption('commands', short_name='C', type=str,
530
                        help="Display fields for these commands."
531
                        ),
532
                     ]
533
    def run(self, source, verbose=False, commands=None, commit_mark=None):
534
        load_fastimport()
535
        from fastimport.processors import query_processor
536
        from bzrlib.plugins.fastimport import helpers
537
        params = helpers.defines_to_dict(commands) or {}
538
        if commit_mark:
539
            params['commit-mark'] = commit_mark
0.64.310 by Jelmer Vernooij
Fix fast-import-info.
540
        return _run(source, query_processor.QueryProcessor, params=params,
541
            verbose=verbose)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
542
543
544
class cmd_fast_export(Command):
545
    """Generate a fast-import stream from a Bazaar branch.
546
547
    This program generates a stream from a Bazaar branch in fast-import
548
    format used by tools such as bzr fast-import, git-fast-import and
549
    hg-fast-import.
550
551
    If no destination is given or the destination is '-', standard output
552
    is used. Otherwise, the destination is the name of a file. If the
553
    destination ends in '.gz', the output will be compressed into gzip
554
    format.
555
 
556
    :Round-tripping:
557
558
     Recent versions of the fast-import specification support features
0.64.341 by Jelmer Vernooij
Fix test, clarify help description for 'bzr fast-export'.
559
     that allow effective round-tripping most of the metadata in Bazaar
560
     branches. As such, fast-exporting a branch and fast-importing the data
561
     produced will create a new repository with roughly equivalent history, i.e.
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
562
     "bzr log -v -p --include-merges --forward" on the old branch and
563
     new branch should produce similar, if not identical, results.
564
565
     .. note::
566
    
567
        Be aware that the new repository may appear to have similar history
568
        but internally it is quite different with new revision-ids and
569
        file-ids assigned. As a consequence, the ability to easily merge
570
        with branches based on the old repository is lost. Depending on your
571
        reasons for producing a new repository, this may or may not be an
572
        issue.
573
574
    :Interoperability:
575
576
     fast-export can use the following "extended features" to
577
     produce a richer data stream:
578
579
     * *multiple-authors* - if a commit has multiple authors (as commonly
580
       occurs in pair-programming), all authors will be included in the
581
       output, not just the first author
582
583
     * *commit-properties* - custom metadata per commit that Bazaar stores
584
       in revision properties (e.g. branch-nick and bugs fixed by this
585
       change) will be included in the output.
586
587
     * *empty-directories* - directories, even the empty ones, will be
588
       included in the output.
589
590
     To disable these features and produce output acceptable to git 1.6,
591
     use the --plain option. To enable these features, use --no-plain.
592
     Currently, --plain is the default but that will change in the near
593
     future once the feature names and definitions are formally agreed
594
     to by the broader fast-import developer community.
595
0.64.337 by Jelmer Vernooij
Merge support for --rewrite-tag-names.
596
     Git has stricter naming rules for tags and fast-export --plain
597
     will skip tags which can't be imported into git. To replace characters
598
     unsupported in git with an underscore instead, specify
599
     --rewrite-tag-names.
600
0.135.1 by Andy Grimm
Add --baseline option
601
    :History truncation:
602
0.64.341 by Jelmer Vernooij
Fix test, clarify help description for 'bzr fast-export'.
603
     It is sometimes convenient to simply truncate the revision history at a
604
     certain point.  The --baseline option, to be used in conjunction with -r,
605
     emits a baseline commit containing the state of the entire source tree at
606
     the first requested revision.  This allows a user to produce a tree
607
     identical to the original without munging multiple exports.
0.135.1 by Andy Grimm
Add --baseline option
608
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
609
    :Examples:
610
611
     To produce data destined for import into Bazaar::
612
613
       bzr fast-export --no-plain my-bzr-branch my.fi.gz
614
615
     To produce data destined for Git 1.6::
616
617
       bzr fast-export --plain my-bzr-branch my.fi
618
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::
622
    
623
       bzr fast-export --export-marks=marks.bzr project.dev |
624
              GIT_DIR=project/.git git-fast-import --export-marks=marks.git
625
626
       bzr fast-export --import-marks=marks.bzr -b other project.other |
627
              GIT_DIR=project/.git git-fast-import --import-marks=marks.git
628
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.
631
    """
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).'
639
                        ),
640
                    Option('checkpoint', type=int, argname='N',
641
                        help="Checkpoint every N revisions (default=10000)."
642
                        ),
643
                    Option('marks', type=str, argname='FILE',
644
                        help="Import marks from and export marks to file."
645
                        ),
646
                    Option('import-marks', type=str, argname='FILE',
647
                        help="Import marks from file."
648
                        ),
649
                    Option('export-marks', type=str, argname='FILE',
650
                        help="Export marks to file."
651
                        ),
652
                    Option('plain',
653
                        help="Exclude metadata to maximise interoperability."
654
                        ),
0.133.2 by Oleksandr Usov
Rewrite tag names when exporting plain stream
655
                    Option('rewrite-tag-names',
0.64.337 by Jelmer Vernooij
Merge support for --rewrite-tag-names.
656
                        help="Replace characters invalid in git with '_'"
657
                             " (plain mode only).",
0.133.2 by Oleksandr Usov
Rewrite tag names when exporting plain stream
658
                        ),
0.135.1 by Andy Grimm
Add --baseline option
659
                    Option('baseline',
0.135.2 by Andy Grimm
fix --baseline bugs, and add a couple of tests
660
                        help="Export an 'absolute' baseline commit prior to"
0.135.1 by Andy Grimm
Add --baseline option
661
                             "the first relative commit",
662
                        ),
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
663
                     ]
664
    encoding_type = 'exact'
665
    def run(self, source, destination=None, verbose=False,
666
        git_branch="master", checkpoint=10000, marks=None,
667
        import_marks=None, export_marks=None, revision=None,
0.135.1 by Andy Grimm
Add --baseline option
668
        plain=True, rewrite_tag_names=False, baseline=False):
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
669
        load_fastimport()
0.64.339 by Jelmer Vernooij
Some refactoring of exporter.
670
        from bzrlib.branch import Branch
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
671
        from bzrlib.plugins.fastimport import exporter
672
673
        if marks:
674
            import_marks = export_marks = marks
0.64.339 by Jelmer Vernooij
Some refactoring of exporter.
675
676
        # Open the source
677
        branch = Branch.open_containing(source)[0]
678
        outf = exporter._get_output_stream(destination)
679
        exporter = exporter.BzrFastExporter(branch,
680
            outf=outf, git_branch=git_branch, checkpoint=checkpoint,
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
681
            import_marks_file=import_marks, export_marks_file=export_marks,
0.133.2 by Oleksandr Usov
Rewrite tag names when exporting plain stream
682
            revision=revision, verbose=verbose, plain_format=plain,
0.135.1 by Andy Grimm
Add --baseline option
683
            rewrite_tags=rewrite_tag_names, baseline=baseline)
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
684
        return exporter.run()
685
686
687
class cmd_fast_export_from_cvs(Command):
688
    """Generate a fast-import file from a CVS repository.
689
690
    Destination is a dump file, typically named xxx.fi where xxx is
691
    the name of the project. If '-' is given, standard output is used.
692
693
    cvs2svn 2.3 or later must be installed as its cvs2bzr script is used
694
    under the covers to do the export.
695
    
696
    The source must be the path on your filesystem to the part of the
697
    repository you wish to convert. i.e. either that path or a parent
698
    directory must contain a CVSROOT subdirectory. The path may point to
699
    either the top of a repository or to a path within it. In the latter
700
    case, only that project within the repository will be converted.
701
702
    .. note::
703
       Remote access to the repository is not sufficient - the path
704
       must point into a copy of the repository itself. See
705
       http://cvs2svn.tigris.org/faq.html#repoaccess for instructions
706
       on how to clone a remote CVS repository locally.
707
708
    By default, the trunk, branches and tags are all exported. If you
709
    only want the trunk, use the `--trunk-only` option.
710
711
    By default, filenames, log messages and author names are expected
712
    to be encoded in ascii. Use the `--encoding` option to specify an
713
    alternative. If multiple encodings are used, specify the option
714
    multiple times. For a list of valid encoding names, see
715
    http://docs.python.org/lib/standard-encodings.html.
716
717
    Windows users need to install GNU sort and use the `--sort`
718
    option to specify its location. GNU sort can be downloaded from
719
    http://unxutils.sourceforge.net/.
720
    """
721
    hidden = False
722
    _see_also = ['fast-import', 'fast-import-filter']
723
    takes_args = ['source', 'destination']
724
    takes_options = ['verbose',
725
                    Option('trunk-only',
726
                        help="Export just the trunk, ignoring tags and branches."
727
                        ),
728
                    ListOption('encoding', type=str, argname='CODEC',
729
                        help="Encoding used for filenames, commit messages "
730
                             "and author names if not ascii."
731
                        ),
732
                    Option('sort', type=str, argname='PATH',
733
                        help="GNU sort program location if not on the path."
734
                        ),
735
                    ]
736
    encoding_type = 'exact'
737
    def run(self, source, destination, verbose=False, trunk_only=False,
738
        encoding=None, sort=None):
739
        load_fastimport()
740
        from bzrlib.plugins.fastimport.exporters import fast_export_from
741
        custom = []
742
        if trunk_only:
743
            custom.append("--trunk-only")
744
        if encoding:
745
            for enc in encoding:
746
                custom.extend(['--encoding', enc])
747
        if sort:
748
            custom.extend(['--sort', sort])
749
        fast_export_from(source, destination, 'cvs', verbose, custom)
750
751
752
class cmd_fast_export_from_darcs(Command):
753
    """Generate a fast-import file from a Darcs repository.
754
755
    Destination is a dump file, typically named xxx.fi where xxx is
756
    the name of the project. If '-' is given, standard output is used.
757
758
    Darcs 2.2 or later must be installed as various subcommands are
759
    used to access the source repository. The source may be a network
760
    URL but using a local URL is recommended for performance reasons.
761
    """
762
    hidden = False
763
    _see_also = ['fast-import', 'fast-import-filter']
764
    takes_args = ['source', 'destination']
765
    takes_options = ['verbose',
766
                    Option('encoding', type=str, argname='CODEC',
767
                        help="Encoding used for commit messages if not utf-8."
768
                        ),
769
                    ]
770
    encoding_type = 'exact'
771
    def run(self, source, destination, verbose=False, encoding=None):
772
        from bzrlib.plugins.fastimport.exporters import fast_export_from
773
        custom = None
774
        if encoding is not None:
775
            custom = ['--encoding', encoding]
776
        fast_export_from(source, destination, 'darcs', verbose, custom)
777
778
779
class cmd_fast_export_from_hg(Command):
780
    """Generate a fast-import file from a Mercurial repository.
781
782
    Destination is a dump file, typically named xxx.fi where xxx is
783
    the name of the project. If '-' is given, standard output is used.
784
785
    Mercurial 1.2 or later must be installed as its libraries are used
786
    to access the source repository. Given the APIs currently used,
787
    the source repository must be a local file, not a network URL.
788
    """
789
    hidden = False
790
    _see_also = ['fast-import', 'fast-import-filter']
791
    takes_args = ['source', 'destination']
792
    takes_options = ['verbose']
793
    encoding_type = 'exact'
794
    def run(self, source, destination, verbose=False):
795
        load_fastimport()
796
        from bzrlib.plugins.fastimport.exporters import fast_export_from
797
        fast_export_from(source, destination, 'hg', verbose)
798
799
800
class cmd_fast_export_from_git(Command):
801
    """Generate a fast-import file from a Git repository.
802
803
    Destination is a dump file, typically named xxx.fi where xxx is
804
    the name of the project. If '-' is given, standard output is used.
805
806
    Git 1.6 or later must be installed as the git fast-export
807
    subcommand is used under the covers to generate the stream.
808
    The source must be a local directory.
809
810
    .. note::
811
    
812
       Earlier versions of Git may also work fine but are
813
       likely to receive less active support if problems arise.
814
    """
815
    hidden = False
816
    _see_also = ['fast-import', 'fast-import-filter']
817
    takes_args = ['source', 'destination']
818
    takes_options = ['verbose']
819
    encoding_type = 'exact'
820
    def run(self, source, destination, verbose=False):
821
        load_fastimport()
822
        from bzrlib.plugins.fastimport.exporters import fast_export_from
823
        fast_export_from(source, destination, 'git', verbose)
824
825
826
class cmd_fast_export_from_mtn(Command):
827
    """Generate a fast-import file from a Monotone repository.
828
829
    Destination is a dump file, typically named xxx.fi where xxx is
830
    the name of the project. If '-' is given, standard output is used.
831
832
    Monotone 0.43 or later must be installed as the mtn git_export
833
    subcommand is used under the covers to generate the stream.
834
    The source must be a local directory.
835
    """
836
    hidden = False
837
    _see_also = ['fast-import', 'fast-import-filter']
838
    takes_args = ['source', 'destination']
839
    takes_options = ['verbose']
840
    encoding_type = 'exact'
841
    def run(self, source, destination, verbose=False):
842
        load_fastimport()
843
        from bzrlib.plugins.fastimport.exporters import fast_export_from
844
        fast_export_from(source, destination, 'mtn', verbose)
845
846
847
class cmd_fast_export_from_p4(Command):
848
    """Generate a fast-import file from a Perforce repository.
849
850
    Source is a Perforce depot path, e.g., //depot/project
851
852
    Destination is a dump file, typically named xxx.fi where xxx is
853
    the name of the project. If '-' is given, standard output is used.
854
855
    bzrp4 must be installed as its p4_fast_export.py module is used under
856
    the covers to do the export.  bzrp4 can be downloaded from
857
    https://launchpad.net/bzrp4/.
858
859
    The P4PORT environment variable must be set, and you must be logged
860
    into the Perforce server.
861
862
    By default, only the HEAD changelist is exported.  To export all
863
    changelists, append '@all' to the source.  To export a revision range,
864
    append a comma-delimited pair of changelist numbers to the source,
865
    e.g., '100,200'.
866
    """
867
    hidden = False
868
    _see_also = ['fast-import', 'fast-import-filter']
869
    takes_args = ['source', 'destination']
870
    takes_options = []
871
    encoding_type = 'exact'
872
    def run(self, source, destination, verbose=False):
873
        load_fastimport()
874
        from bzrlib.plugins.fastimport.exporters import fast_export_from
875
        custom = []
876
        fast_export_from(source, destination, 'p4', verbose, custom)
877
878
879
class cmd_fast_export_from_svn(Command):
880
    """Generate a fast-import file from a Subversion repository.
881
882
    Destination is a dump file, typically named xxx.fi where xxx is
883
    the name of the project. If '-' is given, standard output is used.
884
885
    Python-Subversion (Python bindings to the Subversion APIs)
886
    1.4 or later must be installed as this library is used to
887
    access the source repository. The source may be a network URL
888
    but using a local URL is recommended for performance reasons.
889
    """
890
    hidden = False
891
    _see_also = ['fast-import', 'fast-import-filter']
892
    takes_args = ['source', 'destination']
893
    takes_options = ['verbose',
894
                    Option('trunk-path', type=str, argname="STR",
895
                        help="Path in repo to /trunk.\n"
896
                              "May be `regex:/cvs/(trunk)/proj1/(.*)` in "
897
                              "which case the first group is used as the "
898
                              "branch name and the second group is used "
899
                              "to match files.",
900
                        ),
901
                    ]
902
    encoding_type = 'exact'
0.64.327 by Jelmer Vernooij
Remove --branches-path and --tags-path options, which are not implemented by the underlying code yet.
903
    def run(self, source, destination, verbose=False, trunk_path=None):
0.64.286 by Jelmer Vernooij
Move command implementations into a separate cmds module.
904
        load_fastimport()
905
        from bzrlib.plugins.fastimport.exporters import fast_export_from
906
        custom = []
907
        if trunk_path is not None:
908
            custom.extend(['--trunk-path', trunk_path])
909
        fast_export_from(source, destination, 'svn', verbose, custom)