/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5452.4.3 by John Arbash Meinel
Merge bzr.dev to resolve bzr-2.3.txt (aka NEWS)
1
# Copyright (C) 2005, 2006, 2007, 2009, 2010 Canonical Ltd
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
2
#
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
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
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
16
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
17
"""Serializer factory for reading and writing bundles.
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
18
"""
19
6379.6.7 by Jelmer Vernooij
Move importing from future until after doc string, otherwise the doc string will disappear.
20
from __future__ import absolute_import
21
1185.82.96 by Aaron Bentley
Got first binary test passing
22
import base64
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
23
import re
24
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
25
from ... import (
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
26
    errors,
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
27
    registry,
5436.2.1 by Andrew Bennetts
Add bzrlib.pyutils, which has get_named_object, a wrapper around __import__.
28
    )
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
29
from ...diff import internal_diff
30
from ...revision import NULL_REVISION
31
from ...sixish import (
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
32
    BytesIO,
33
    )
1551.12.46 by Aaron Bentley
Import highres date functions to old location
34
# For backwards-compatibility
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
35
from ...timestamp import unpack_highres_date, format_highres_date
1551.12.46 by Aaron Bentley
Import highres date functions to old location
36
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
37
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
38
# New bundles should try to use this header format
6855.4.5 by Jelmer Vernooij
Fix more bees, use with rather than try/finally for some files.
39
BUNDLE_HEADER = b'# Bazaar revision bundle v'
1907.2.2 by Hermann Kraus
Detect wrong eol markers.
40
BUNDLE_HEADER_RE = re.compile(
6855.3.1 by Jelmer Vernooij
Several more fixes.
41
    br'^# Bazaar revision bundle v(?P<version>\d+[\w.]*)(?P<lineending>\r?)\n$')
1907.2.2 by Hermann Kraus
Detect wrong eol markers.
42
CHANGESET_OLD_HEADER_RE = re.compile(
6855.3.1 by Jelmer Vernooij
Several more fixes.
43
    br'^# Bazaar-NG changeset v(?P<version>\d+[\w.]*)(?P<lineending>\r?)\n$')
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
44
45
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
46
serializer_registry = registry.Registry()
2520.4.123 by Aaron Bentley
Cleanup of bundle code
47
48
2520.4.14 by Aaron Bentley
Get most tests passing, use format header
49
def _get_bundle_header(version):
6973.7.8 by Jelmer Vernooij
Fix more tests.
50
    return b''.join([BUNDLE_HEADER, version.encode('ascii'), b'\n'])
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
51
7143.15.2 by Jelmer Vernooij
Run autopep8.
52
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
53
def _get_filename(f):
1963.2.4 by Robey Pointer
remove usage of hasattr
54
    return getattr(f, 'name', '<unknown>')
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
55
56
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
57
def read_bundle(f):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
58
    """Read in a bundle from a filelike object.
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
59
60
    :param f: A file-like object
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
61
    :return: A list of Bundle objects
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
62
    """
63
    version = None
64
    for line in f:
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
65
        m = BUNDLE_HEADER_RE.match(line)
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
66
        if m:
6973.7.10 by Jelmer Vernooij
More fixes.
67
            if m.group('lineending') != b'':
1907.2.2 by Hermann Kraus
Detect wrong eol markers.
68
                raise errors.UnsupportedEOLMarker()
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
69
            version = m.group('version')
70
            break
1793.2.7 by Aaron Bentley
Fix reporting of malformed, (especially, crlf) bundles
71
        elif line.startswith(BUNDLE_HEADER):
1907.2.1 by Hermann Kraus
Convert bundle errors from Exception to BzrNewError.
72
            raise errors.MalformedHeader(
73
                'Extra characters after version number')
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
74
        m = CHANGESET_OLD_HEADER_RE.match(line)
75
        if m:
76
            version = m.group('version')
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
77
            raise errors.BundleNotSupported(version,
7143.15.2 by Jelmer Vernooij
Run autopep8.
78
                                            'old format bundles not supported')
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
79
80
    if version is None:
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
81
        raise errors.NotABundle('Did not find an opening header')
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
82
6973.7.11 by Jelmer Vernooij
Merge trunk.
83
    return get_serializer(version.decode('ascii')).read(f)
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
84
85
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
86
def get_serializer(version):
87
    try:
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
88
        serializer = serializer_registry.get(version)
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
89
    except KeyError:
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
90
        raise errors.BundleNotSupported(version,
7143.15.2 by Jelmer Vernooij
Run autopep8.
91
                                        'unknown bundle format')
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
92
93
    return serializer(version)
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
94
95
1185.82.74 by Aaron Bentley
Allow custom base for any revision
96
def write(source, revision_ids, f, version=None, forced_bases={}):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
97
    """Serialize a list of bundles to a filelike object.
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
98
1185.82.4 by John Arbash Meinel
Created output format, slightly simplified code
99
    :param source: A source for revision information
100
    :param revision_ids: The list of revision ids to serialize
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
101
    :param f: The file to output to
102
    :param version: [optional] target serialization version
103
    """
104
6754.8.4 by Jelmer Vernooij
Use new context stuff.
105
    with source.lock_read():
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
106
        return get_serializer(version).write(source, revision_ids,
107
                                             forced_bases, f)
1185.82.4 by John Arbash Meinel
Created output format, slightly simplified code
108
109
1910.2.50 by Aaron Bentley
start work on format 0.9 serializer
110
def write_bundle(repository, revision_id, base_revision_id, out, format=None):
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
111
    """Write a bundle of revisions.
112
113
    :param repository: Repository containing revisions to serialize.
114
    :param revision_id: Head revision_id of the bundle.
115
    :param base_revision_id: Revision assumed to be present in repositories
116
         applying the bundle.
117
    :param out: Output file.
7029.2.1 by Jelmer Vernooij
don't make assumptions about the order in which revision ids are returned by write_bundle.
118
    :return: List of revision ids written
1910.7.17 by Andrew Bennetts
Various cosmetic changes.
119
    """
6754.8.4 by Jelmer Vernooij
Use new context stuff.
120
    with repository.lock_read():
2520.4.54 by Aaron Bentley
Hang a create_bundle method off repository
121
        return get_serializer(format).write_bundle(repository, revision_id,
122
                                                   base_revision_id, out)
1185.82.53 by Aaron Bentley
Factored out write_changeset to select revisions
123
124
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
125
class BundleSerializer(object):
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
126
    """The base class for Serializers.
127
128
    Common functionality should be included here.
129
    """
7143.15.2 by Jelmer Vernooij
Run autopep8.
130
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
131
    def __init__(self, version):
132
        self.version = version
133
134
    def read(self, f):
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
135
        """Read the rest of the bundles from the supplied file.
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
136
137
        :param f: The file to read from
1185.82.130 by Aaron Bentley
Rename changesets to revision bundles
138
        :return: A list of bundle trees
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
139
        """
140
        raise NotImplementedError
141
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
142
    def write_bundle(self, repository, target, base, fileobj):
143
        """Write the bundle to the supplied file.
144
145
        :param repository: The repository to retrieve revision data from
146
        :param target: The revision to provide data for
147
        :param base: The most recent of ancestor of the revision that does not
148
            need to be included in the bundle
149
        :param fileobj: The file to output to
7029.2.1 by Jelmer Vernooij
don't make assumptions about the order in which revision ids are returned by write_bundle.
150
        :return: List of revision ids written
2520.4.53 by Aaron Bentley
refactor bundle serialization to make write_bundle primary
151
        """
152
        raise NotImplementedError
153
1185.82.3 by John Arbash Meinel
Working on creating a factor for serializing changesets.
154
1185.82.96 by Aaron Bentley
Got first binary test passing
155
def binary_diff(old_filename, old_lines, new_filename, new_lines, to_file):
6621.22.2 by Martin
Use BytesIO or StringIO from bzrlib.sixish
156
    temp = BytesIO()
1185.82.96 by Aaron Bentley
Got first binary test passing
157
    internal_diff(old_filename, old_lines, new_filename, new_lines, temp,
158
                  allow_binary=True)
159
    temp.seek(0)
160
    base64.encode(temp, to_file)
7045.1.1 by Jelmer Vernooij
Fix another 300 tests.
161
    to_file.write(b'\n')
1185.82.96 by Aaron Bentley
Got first binary test passing
162
7143.15.2 by Jelmer Vernooij
Run autopep8.
163
164
serializer_registry.register_lazy(
165
    '0.8', 'breezy.bundle.serializer.v08', 'BundleSerializerV08')
166
serializer_registry.register_lazy(
167
    '0.9', 'breezy.bundle.serializer.v09', 'BundleSerializerV09')
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
168
serializer_registry.register_lazy('4', 'breezy.bundle.serializer.v4',
7143.15.2 by Jelmer Vernooij
Run autopep8.
169
                                  'BundleSerializerV4')
6989.1.1 by Jelmer Vernooij
Use format registry for bundles.
170
serializer_registry.default_key = '4'