/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/plugins/fastimport/cmds.py

  • Committer: Jelmer Vernooij
  • Date: 2017-06-08 23:30:31 UTC
  • mto: This revision was merged to the branch mainline in revision 6690.
  • Revision ID: jelmer@jelmer.uk-20170608233031-3qavls2o7a1pqllj
Update imports.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
 
16
16
"""Fastimport/fastexport commands."""
17
17
 
 
18
from __future__ import absolute_import
 
19
 
18
20
from ... import controldir
19
21
from ...commands import Command
20
 
from ...option import Option, RegistryOption
21
 
 
 
22
from ...option import Option, ListOption, RegistryOption
22
23
 
23
24
from . import (
24
25
    helpers,
36
37
    :param user_map: if not None, the file containing the user map.
37
38
    """
38
39
    from fastimport.errors import ParsingError
39
 
    from ...errors import CommandError
 
40
    from ...errors import BzrCommandError
40
41
    from fastimport import parser
41
42
    stream = _get_source_stream(source)
42
43
    user_mapper = _get_user_mapper(user_map)
44
45
    p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
45
46
    try:
46
47
        return proc.process(p.iter_commands)
47
 
    except ParsingError as e:
48
 
        raise CommandError("%d: Parse error: %s" % (e.lineno, e))
 
48
    except ParsingError, e:
 
49
        raise BzrCommandError("%d: Parse error: %s" % (e.lineno, e))
49
50
 
50
51
 
51
52
def _get_source_stream(source):
80
81
      bzr fast-import project.fi project.bzr
81
82
 
82
83
    Numerous commands are provided for generating a fast-import file
83
 
    to use as input.
 
84
    to use as input. 
84
85
    To specify standard input as the input stream, use a
85
86
    source name of '-' (instead of project.fi). If the source name
86
87
    ends in '.gz', it is assumed to be compressed in gzip format.
237
238
    _see_also = ['fast-export', 'fast-import-filter', 'fast-import-info']
238
239
    takes_args = ['source', 'destination?']
239
240
    takes_options = ['verbose',
240
 
                     Option('user-map', type=str,
241
 
                            help="Path to file containing a map of user-ids.",
242
 
                            ),
243
 
                     Option('info', type=str,
244
 
                            help="Path to file containing caching hints.",
245
 
                            ),
246
 
                     Option('trees',
247
 
                            help="Update all working trees, not just trunk's.",
248
 
                            ),
249
 
                     Option('count', type=int,
250
 
                            help="Import this many revisions then exit.",
251
 
                            ),
252
 
                     Option('checkpoint', type=int,
253
 
                            help="Checkpoint automatically every N revisions."
254
 
                            " The default is 10000.",
255
 
                            ),
256
 
                     Option('autopack', type=int,
257
 
                            help="Pack every N checkpoints. The default is 4.",
258
 
                            ),
259
 
                     Option('inv-cache', type=int,
260
 
                            help="Number of inventories to cache.",
261
 
                            ),
262
 
                     RegistryOption.from_kwargs('mode',
263
 
                                                'The import algorithm to use.',
264
 
                                                title='Import Algorithm',
265
 
                                                default='Use the preferred algorithm (inventory deltas).',
266
 
                                                experimental="Enable experimental features.",
267
 
                                                value_switches=True, enum_switch=False,
268
 
                                                ),
269
 
                     Option('import-marks', type=str,
270
 
                            help="Import marks from file."
271
 
                            ),
272
 
                     Option('export-marks', type=str,
273
 
                            help="Export marks to file."
274
 
                            ),
275
 
                     RegistryOption('format',
276
 
                                    help='Specify a format for the created repository. See'
277
 
                                    ' "bzr help formats" for details.',
278
 
                                    lazy_registry=(
279
 
                                        'breezy.controldir', 'format_registry'),
280
 
                                    converter=lambda name: controldir.format_registry.make_controldir(
281
 
                                        name),
282
 
                                    value_switches=False, title='Repository format'),
 
241
                    Option('user-map', type=str,
 
242
                        help="Path to file containing a map of user-ids.",
 
243
                        ),
 
244
                    Option('info', type=str,
 
245
                        help="Path to file containing caching hints.",
 
246
                        ),
 
247
                    Option('trees',
 
248
                        help="Update all working trees, not just trunk's.",
 
249
                        ),
 
250
                    Option('count', type=int,
 
251
                        help="Import this many revisions then exit.",
 
252
                        ),
 
253
                    Option('checkpoint', type=int,
 
254
                        help="Checkpoint automatically every N revisions."
 
255
                             " The default is 10000.",
 
256
                        ),
 
257
                    Option('autopack', type=int,
 
258
                        help="Pack every N checkpoints. The default is 4.",
 
259
                        ),
 
260
                    Option('inv-cache', type=int,
 
261
                        help="Number of inventories to cache.",
 
262
                        ),
 
263
                    RegistryOption.from_kwargs('mode',
 
264
                        'The import algorithm to use.',
 
265
                        title='Import Algorithm',
 
266
                        default='Use the preferred algorithm (inventory deltas).',
 
267
                        classic="Use the original algorithm (mutable inventories).",
 
268
                        experimental="Enable experimental features.",
 
269
                        value_switches=True, enum_switch=False,
 
270
                        ),
 
271
                    Option('import-marks', type=str,
 
272
                        help="Import marks from file."
 
273
                        ),
 
274
                    Option('export-marks', type=str,
 
275
                        help="Export marks to file."
 
276
                        ),
 
277
                    RegistryOption('format',
 
278
                            help='Specify a format for the created repository. See'
 
279
                                 ' "bzr help formats" for details.',
 
280
                            lazy_registry=('breezy.controldir', 'format_registry'),
 
281
                            converter=lambda name: controldir.format_registry.make_bzrdir(name),
 
282
                            value_switches=False, title='Repository format'),
283
283
                     ]
284
 
 
285
284
    def run(self, source, destination='.', verbose=False, info=None,
286
 
            trees=False, count=-1, checkpoint=10000, autopack=4, inv_cache=-1,
287
 
            mode=None, import_marks=None, export_marks=None, format=None,
288
 
            user_map=None):
 
285
        trees=False, count=-1, checkpoint=10000, autopack=4, inv_cache=-1,
 
286
        mode=None, import_marks=None, export_marks=None, format=None,
 
287
        user_map=None):
289
288
        load_fastimport()
290
289
        from .processors import generic_processor
291
290
        from .helpers import (
313
312
            'export-marks': export_marks,
314
313
            }
315
314
        return _run(source, generic_processor.GenericProcessor,
316
 
                    bzrdir=control, params=params, verbose=verbose,
317
 
                    user_map=user_map)
 
315
                bzrdir=control, params=params, verbose=verbose,
 
316
                user_map=user_map)
318
317
 
319
318
    def _generate_info(self, source):
320
 
        from io import StringIO
 
319
        from cStringIO import StringIO
321
320
        from fastimport import parser
322
321
        from fastimport.errors import ParsingError
323
 
        from ...errors import CommandError
324
 
        from fastimport.processors import info_processor
 
322
        from ...errors import BzrCommandError
 
323
        from .processors import info_processor
325
324
        stream = _get_source_stream(source)
326
325
        output = StringIO()
327
326
        try:
329
328
            p = parser.ImportParser(stream)
330
329
            try:
331
330
                return_code = proc.process(p.iter_commands)
332
 
            except ParsingError as e:
333
 
                raise CommandError("%d: Parse error: %s" % (e.lineno, e))
 
331
            except ParsingError, e:
 
332
                raise BzrCommandError("%d: Parse error: %s" % (e.lineno, e))
334
333
            lines = output.getvalue().splitlines()
335
334
        finally:
336
335
            output.close()
338
337
        return lines
339
338
 
340
339
 
 
340
class cmd_fast_import_filter(Command):
 
341
    """Filter a fast-import stream to include/exclude files & directories.
 
342
 
 
343
    This command is useful for splitting a subdirectory or bunch of
 
344
    files out from a project to create a new project complete with history
 
345
    for just those files. It can also be used to create a new project
 
346
    repository that removes all references to files that should not have
 
347
    been committed, e.g. security-related information (like passwords),
 
348
    commercially sensitive material, files with an incompatible license or
 
349
    large binary files like CD images.
 
350
 
 
351
    To specify standard input as the input stream, use a source name
 
352
    of '-'. If the source name ends in '.gz', it is assumed to be
 
353
    compressed in gzip format.
 
354
 
 
355
    :File/directory filtering:
 
356
 
 
357
     This is supported by the -i and -x options. Excludes take precedence
 
358
     over includes.
 
359
 
 
360
     When filtering out a subdirectory (or file), the new stream uses the
 
361
     subdirectory (or subdirectory containing the file) as the root. As
 
362
     fast-import doesn't know in advance whether a path is a file or
 
363
     directory in the stream, you need to specify a trailing '/' on
 
364
     directories passed to the `--includes option`. If multiple files or
 
365
     directories are given, the new root is the deepest common directory.
 
366
 
 
367
     Note: If a path has been renamed, take care to specify the *original*
 
368
     path name, not the final name that it ends up with.
 
369
 
 
370
    :User mapping:
 
371
 
 
372
     Some source repositories store just the user name while Bazaar
 
373
     prefers a full email address. You can adjust user-ids
 
374
     by using the --user-map option. The argument is a
 
375
     text file with lines in the format::
 
376
 
 
377
       old-id = new-id
 
378
 
 
379
     Blank lines and lines beginning with # are ignored.
 
380
     If old-id has the special value '@', then users without an
 
381
     email address will get one created by using the matching new-id
 
382
     as the domain, unless a more explicit address is given for them.
 
383
     For example, given the user-map of::
 
384
 
 
385
       @ = example.com
 
386
       bill = William Jones <bill@example.com>
 
387
 
 
388
     then user-ids are mapped as follows::
 
389
 
 
390
      maria => maria <maria@example.com>
 
391
      bill => William Jones <bill@example.com>
 
392
 
 
393
     .. note::
 
394
 
 
395
        User mapping is supported by both the fast-import and
 
396
        fast-import-filter commands.
 
397
 
 
398
    :History rewriting:
 
399
 
 
400
     By default fast-import-filter does quite aggressive history rewriting.
 
401
     Empty commits (or commits which had all their content filtered out) will
 
402
     be removed, and so are the references to commits not included in the stream.
 
403
 
 
404
     Flag --dont-squash-empty-commits reverses this behavior and makes it possible to
 
405
     use fast-import-filter on incremental streams.
 
406
 
 
407
    :Examples:
 
408
 
 
409
     Create a new project from a library (note the trailing / on the
 
410
     directory name of the library)::
 
411
 
 
412
       front-end | bzr fast-import-filter -i lib/xxx/ > xxx.fi
 
413
       bzr fast-import xxx.fi mylibrary.bzr
 
414
       (lib/xxx/foo is now foo)
 
415
 
 
416
     Create a new repository without a sensitive file::
 
417
 
 
418
       front-end | bzr fast-import-filter -x missile-codes.txt > clean.fi
 
419
       bzr fast-import clean.fi clean.bzr
 
420
    """
 
421
    hidden = False
 
422
    _see_also = ['fast-import']
 
423
    takes_args = ['source?']
 
424
    takes_options = ['verbose',
 
425
                    ListOption('include_paths', short_name='i', type=str,
 
426
                        help="Only include commits affecting these paths."
 
427
                             " Directories should have a trailing /."
 
428
                        ),
 
429
                    ListOption('exclude_paths', short_name='x', type=str,
 
430
                        help="Exclude these paths from commits."
 
431
                        ),
 
432
                    Option('user-map', type=str,
 
433
                        help="Path to file containing a map of user-ids.",
 
434
                        ),
 
435
                    Option('dont-squash-empty-commits',
 
436
                        help="Preserve all commits and links between them"
 
437
                        ),
 
438
                     ]
 
439
    encoding_type = 'exact'
 
440
    def run(self, source=None, verbose=False, include_paths=None,
 
441
        exclude_paths=None, user_map=None, dont_squash_empty_commits=False):
 
442
        from ...errors import BzrCommandError
 
443
        load_fastimport()
 
444
        from fastimport.processors import filter_processor
 
445
        params = {
 
446
            'include_paths': include_paths,
 
447
            'exclude_paths': exclude_paths,
 
448
            }
 
449
        if ('squash_empty_commits' in
 
450
                filter_processor.FilterProcessor.known_params):
 
451
            params['squash_empty_commits'] = (not dont_squash_empty_commits)
 
452
        else:
 
453
            if dont_squash_empty_commits:
 
454
                raise BzrCommandError("installed python-fastimport does not "
 
455
                    "support not squashing empty commits. Please install "
 
456
                    " a newer python-fastimport to use "
 
457
                    "--dont-squash-empty-commits")
 
458
 
 
459
        from fastimport.errors import ParsingError
 
460
        from fastimport import parser
 
461
        stream = _get_source_stream(source)
 
462
        user_mapper = _get_user_mapper(user_map)
 
463
        proc = filter_processor.FilterProcessor(params=params, verbose=verbose)
 
464
        p = parser.ImportParser(stream, verbose=verbose, user_mapper=user_mapper)
 
465
        try:
 
466
            return proc.process(p.iter_commands)
 
467
        except ParsingError, e:
 
468
            raise BzrCommandError("%d: Parse error: %s" % (e.lineno, e))
 
469
 
 
470
 
 
471
class cmd_fast_import_info(Command):
 
472
    """Output information about a fast-import stream.
 
473
 
 
474
    This command reads a fast-import stream and outputs
 
475
    statistics and interesting properties about what it finds.
 
476
    When run in verbose mode, the information is output as a
 
477
    configuration file that can be passed to fast-import to
 
478
    assist it in intelligently caching objects.
 
479
 
 
480
    To specify standard input as the input stream, use a source name
 
481
    of '-'. If the source name ends in '.gz', it is assumed to be
 
482
    compressed in gzip format.
 
483
 
 
484
    :Examples:
 
485
 
 
486
     Display statistics about the import stream produced by front-end::
 
487
 
 
488
      front-end | bzr fast-import-info -
 
489
 
 
490
     Create a hints file for running fast-import on a large repository::
 
491
 
 
492
       front-end | bzr fast-import-info -v - > front-end.cfg
 
493
    """
 
494
    hidden = False
 
495
    _see_also = ['fast-import']
 
496
    takes_args = ['source']
 
497
    takes_options = ['verbose']
 
498
    def run(self, source, verbose=False):
 
499
        load_fastimport()
 
500
        from .processors import info_processor
 
501
        return _run(source, info_processor.InfoProcessor, verbose=verbose)
 
502
 
 
503
 
 
504
class cmd_fast_import_query(Command):
 
505
    """Query a fast-import stream displaying selected commands.
 
506
 
 
507
    To specify standard input as the input stream, use a source name
 
508
    of '-'. If the source name ends in '.gz', it is assumed to be
 
509
    compressed in gzip format.
 
510
 
 
511
    To specify a commit to display, give its mark using the
 
512
    --commit-mark option. The commit will be displayed with
 
513
    file-commands included but with inline blobs hidden.
 
514
 
 
515
    To specify the commands to display, use the -C option one or
 
516
    more times. To specify just some fields for a command, use the
 
517
    syntax::
 
518
 
 
519
      command=field1,...
 
520
 
 
521
    By default, the nominated fields for the nominated commands
 
522
    are displayed tab separated. To see the information in
 
523
    a name:value format, use verbose mode.
 
524
 
 
525
    Note: Binary fields (e.g. data for blobs) are masked out
 
526
    so it is generally safe to view the output in a terminal.
 
527
 
 
528
    :Examples:
 
529
 
 
530
     Show the commit with mark 429::
 
531
 
 
532
      bzr fast-import-query xxx.fi -m429
 
533
 
 
534
     Show all the fields of the reset and tag commands::
 
535
 
 
536
      bzr fast-import-query xxx.fi -Creset -Ctag
 
537
 
 
538
     Show the mark and merge fields of the commit commands::
 
539
 
 
540
      bzr fast-import-query xxx.fi -Ccommit=mark,merge
 
541
    """
 
542
    hidden = True
 
543
    _see_also = ['fast-import', 'fast-import-filter']
 
544
    takes_args = ['source']
 
545
    takes_options = ['verbose',
 
546
                    Option('commit-mark', short_name='m', type=str,
 
547
                        help="Mark of the commit to display."
 
548
                        ),
 
549
                    ListOption('commands', short_name='C', type=str,
 
550
                        help="Display fields for these commands."
 
551
                        ),
 
552
                     ]
 
553
    def run(self, source, verbose=False, commands=None, commit_mark=None):
 
554
        load_fastimport()
 
555
        from fastimport.processors import query_processor
 
556
        from . import helpers
 
557
        params = helpers.defines_to_dict(commands) or {}
 
558
        if commit_mark:
 
559
            params['commit-mark'] = commit_mark
 
560
        return _run(source, query_processor.QueryProcessor, params=params,
 
561
            verbose=verbose)
 
562
 
 
563
 
341
564
class cmd_fast_export(Command):
342
565
    """Generate a fast-import stream from a Bazaar branch.
343
566
 
443
666
    _see_also = ['fast-import', 'fast-import-filter']
444
667
    takes_args = ['source?', 'destination?']
445
668
    takes_options = ['verbose', 'revision',
446
 
                     Option('git-branch', short_name='b', type=str,
447
 
                            argname='FILE',
448
 
                            help='Name of the git branch to create (default=master).'
449
 
                            ),
450
 
                     Option('checkpoint', type=int, argname='N',
451
 
                            help="Checkpoint every N revisions (default=10000)."
452
 
                            ),
453
 
                     Option('marks', type=str, argname='FILE',
454
 
                            help="Import marks from and export marks to file."
455
 
                            ),
456
 
                     Option('import-marks', type=str, argname='FILE',
457
 
                            help="Import marks from file."
458
 
                            ),
459
 
                     Option('export-marks', type=str, argname='FILE',
460
 
                            help="Export marks to file."
461
 
                            ),
462
 
                     Option('plain',
463
 
                            help="Exclude metadata to maximise interoperability."
464
 
                            ),
465
 
                     Option('rewrite-tag-names',
466
 
                            help="Replace characters invalid in git with '_'"
467
 
                            " (plain mode only).",
468
 
                            ),
469
 
                     Option('baseline',
470
 
                            help="Export an 'absolute' baseline commit prior to"
471
 
                            "the first relative commit",
472
 
                            ),
473
 
                     Option('no-tags',
474
 
                            help="Don't export tags"
475
 
                            ),
 
669
                    Option('git-branch', short_name='b', type=str,
 
670
                        argname='FILE',
 
671
                        help='Name of the git branch to create (default=master).'
 
672
                        ),
 
673
                    Option('checkpoint', type=int, argname='N',
 
674
                        help="Checkpoint every N revisions (default=10000)."
 
675
                        ),
 
676
                    Option('marks', type=str, argname='FILE',
 
677
                        help="Import marks from and export marks to file."
 
678
                        ),
 
679
                    Option('import-marks', type=str, argname='FILE',
 
680
                        help="Import marks from file."
 
681
                        ),
 
682
                    Option('export-marks', type=str, argname='FILE',
 
683
                        help="Export marks to file."
 
684
                        ),
 
685
                    Option('plain',
 
686
                        help="Exclude metadata to maximise interoperability."
 
687
                        ),
 
688
                    Option('rewrite-tag-names',
 
689
                        help="Replace characters invalid in git with '_'"
 
690
                             " (plain mode only).",
 
691
                        ),
 
692
                    Option('baseline',
 
693
                        help="Export an 'absolute' baseline commit prior to"
 
694
                             "the first relative commit",
 
695
                        ),
 
696
                    Option('no-tags',
 
697
                        help="Don't export tags"
 
698
                        ),
476
699
                     ]
477
700
    encoding_type = 'exact'
478
 
 
479
701
    def run(self, source=None, destination=None, verbose=False,
480
 
            git_branch="master", checkpoint=10000, marks=None,
481
 
            import_marks=None, export_marks=None, revision=None,
482
 
            plain=True, rewrite_tag_names=False, no_tags=False, baseline=False):
 
702
        git_branch="master", checkpoint=10000, marks=None,
 
703
        import_marks=None, export_marks=None, revision=None,
 
704
        plain=True, rewrite_tag_names=False, no_tags=False, baseline=False):
483
705
        load_fastimport()
484
706
        from ...branch import Branch
485
707
        from . import exporter
492
714
            source = "."
493
715
        branch = Branch.open_containing(source)[0]
494
716
        outf = exporter._get_output_stream(destination)
495
 
        exporter = exporter.BzrFastExporter(
496
 
            branch,
497
 
            outf=outf, ref=b"refs/heads/%s" % git_branch.encode('utf-8'),
498
 
            checkpoint=checkpoint, import_marks_file=import_marks,
499
 
            export_marks_file=export_marks, revision=revision, verbose=verbose,
500
 
            plain_format=plain, rewrite_tags=rewrite_tag_names,
501
 
            no_tags=no_tags, baseline=baseline)
 
717
        exporter = exporter.BzrFastExporter(branch,
 
718
            outf=outf, ref="refs/heads/%s" % git_branch, checkpoint=checkpoint,
 
719
            import_marks_file=import_marks, export_marks_file=export_marks,
 
720
            revision=revision, verbose=verbose, plain_format=plain,
 
721
            rewrite_tags=rewrite_tag_names, no_tags=no_tags, baseline=baseline)
502
722
        return exporter.run()