~bzr-pqm/bzr/bzr.dev

5752.3.8 by John Arbash Meinel
Merge bzr.dev 5764 to resolve release-notes (aka NEWS) conflicts
1
# Copyright (C) 2005-2011 Canonical Ltd
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
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
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
6379.6.3 by Jelmer Vernooij
Use absolute_import.
16
0.5.1 by John Arbash Meinel
Just an initial working step.
17
"""\
18
This is an attempt to take the internal delta object, and represent
19
it as a single-file text-only changeset.
20
This should have commands for both generating a changeset,
21
and for applying a changeset.
22
"""
23
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
24
from __future__ import absolute_import
25
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
26
from cStringIO import StringIO
1185.82.78 by Aaron Bentley
Cleanups
27
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
28
from bzrlib.lazy_import import lazy_import
29
lazy_import(globals(), """
30
from bzrlib import (
31
    branch,
32
    errors,
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
33
    merge_directive,
2490.2.28 by Aaron Bentley
Fix handling of null revision
34
    revision as _mod_revision,
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
35
    urlutils,
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
36
    transport,
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
37
    )
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
38
from bzrlib.i18n import gettext
1996.3.8 by John Arbash Meinel
lazy_import bundle and bundle.commands
39
""")
40
41
from bzrlib.commands import Command
1185.82.78 by Aaron Bentley
Cleanups
42
0.5.1 by John Arbash Meinel
Just an initial working step.
43
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
44
class cmd_bundle_info(Command):
5131.2.1 by Martin
Permit bzrlib to run under python -OO by explictly assigning to __doc__ for user-visible docstrings
45
    __doc__ = """Output interesting stats about a bundle"""
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
46
47
    hidden = True
48
    takes_args = ['location']
1551.18.4 by Aaron Bentley
Restore bundle-info -v, fix multiparent detection
49
    takes_options = ['verbose']
2520.4.44 by Aaron Bentley
Fix encoding handling in bundle-info
50
    encoding_type = 'exact'
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
51
52
    def run(self, location, verbose=False):
53
        from bzrlib.bundle.serializer import read_bundle
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
54
        from bzrlib.bundle import read_mergeable_from_url
2520.4.44 by Aaron Bentley
Fix encoding handling in bundle-info
55
        from bzrlib import osutils
56
        term_encoding = osutils.get_terminal_encoding()
2520.5.4 by Aaron Bentley
Replace 'bundle-revisions' with 'submit' command
57
        bundle_info = read_mergeable_from_url(location)
5086.3.1 by Jelmer Vernooij
``bzrlib.merge_directive._BaseMergeDirective`` has been renamed to
58
        if isinstance(bundle_info, merge_directive.BaseMergeDirective):
1551.18.4 by Aaron Bentley
Restore bundle-info -v, fix multiparent detection
59
            bundle_file = StringIO(bundle_info.get_raw_bundle())
60
            bundle_info = read_bundle(bundle_file)
61
        else:
62
            if verbose:
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
63
                raise errors.BzrCommandError(gettext(
64
                            '--verbose requires a merge directive'))
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
65
        reader_method = getattr(bundle_info, 'get_bundle_reader', None)
66
        if reader_method is None:
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
67
            raise errors.BzrCommandError(gettext('Bundle format not supported'))
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
68
69
        by_kind = {}
70
        file_ids = set()
71
        for bytes, parents, repo_kind, revision_id, file_id\
72
            in reader_method().iter_records():
73
            by_kind.setdefault(repo_kind, []).append(
74
                (bytes, parents, repo_kind, revision_id, file_id))
75
            if file_id is not None:
76
                file_ids.add(file_id)
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
77
        self.outf.write(gettext('Records\n'))
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
78
        for kind, records in sorted(by_kind.iteritems()):
1551.18.4 by Aaron Bentley
Restore bundle-info -v, fix multiparent detection
79
            multiparent = sum(1 for b, m, k, r, f in records if
80
                              len(m.get('parents', [])) > 1)
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
81
            self.outf.write(gettext('{0}: {1} ({2} multiparent)\n').format(
6150.3.11 by Jonathan Riddell
syntax fixes
82
                kind, len(records), multiparent))
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
83
        self.outf.write(gettext('unique files: %d\n') % len(file_ids))
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
84
        self.outf.write('\n')
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
85
        nicks = set()
86
        committers = set()
87
        for revision in bundle_info.real_revisions:
2520.4.42 by Aaron Bentley
Don't assume every revision has a branch nick
88
            if 'branch-nick' in revision.properties:
89
                nicks.add(revision.properties['branch-nick'])
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
90
            committers.add(revision.committer)
91
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
92
        self.outf.write(gettext('Revisions\n'))
93
        self.outf.write((gettext('nicks: %s\n')
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
94
            % ', '.join(sorted(nicks))).encode(term_encoding, 'replace'))
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
95
        self.outf.write((gettext('committers: \n%s\n') %
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
96
        '\n'.join(sorted(committers)).encode(term_encoding, 'replace')))
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
97
        if verbose:
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
98
            self.outf.write('\n')
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
99
            bundle_file.seek(0)
2520.4.74 by Aaron Bentley
bzr info handles patchless bundles
100
            line = bundle_file.readline()
101
            line = bundle_file.readline()
2520.4.76 by Aaron Bentley
Move base64-encoding into merge directives
102
            content = bundle_file.read().decode('bz2')
6150.3.3 by Jonathan Riddell
gettext() bzrlib/bundle
103
            self.outf.write(gettext("Decoded contents\n"))
2520.4.35 by Aaron Bentley
zap obsolete changeset commands, add bundle-info command
104
            self.outf.write(content)
2911.6.1 by Blake Winton
Change 'print >> f,'s to 'f.write('s.
105
            self.outf.write('\n')