~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/changeset/serializer/__init__.py

  • Committer: John Arbash Meinel
  • Date: 2005-11-19 04:22:51 UTC
  • mto: (1185.82.108 w-changeset)
  • mto: This revision was merged to the branch mainline in revision 1738.
  • Revision ID: john@arbash-meinel.com-20051119042251-aaa8514b7d68c29f
Working on creating a factor for serializing changesets.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# (C) 2005 Canonical Development 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
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
"""Serializer factory for reading and writing changesets.
 
18
"""
 
19
 
 
20
import re
 
21
 
 
22
import bzrlib.errors as errors
 
23
 
 
24
# New changesets should try to use this header format
 
25
CHANGESET_HEADER = '# Bazaar changeset v'
 
26
CHANGESET_HEADER_RE = re.compile(r'^# Bazaar changeset v(?P<version>\d+[\w.]*)\n$')
 
27
CHANGESET_OLD_HEADER_RE = re.compile(r'^# Bazaar-NG changeset v(?P<version>\d+[\w.]*)\n$')
 
28
 
 
29
 
 
30
_serializers = {} 
 
31
 
 
32
 
 
33
def _get_filename(f):
 
34
    if hasattr(f, 'name'):
 
35
        return f.name
 
36
    return '<unknown>'
 
37
 
 
38
 
 
39
def read(f):
 
40
    """Read in a changeset from a filelike object.
 
41
 
 
42
    :param f: A file-like object
 
43
    :return: A list of Changeset objects
 
44
    """
 
45
    version = None
 
46
    for line in f:
 
47
        m = CHANGESET_HEADER_RE.match(line)
 
48
        if m:
 
49
            version = m.group('version')
 
50
            break
 
51
        m = CHANGESET_OLD_HEADER_RE.match(line)
 
52
        if m:
 
53
            version = m.group('version')
 
54
            raise errors.ChangesetNotSupported(version, 'old format changesets not supported')
 
55
 
 
56
    if version is None:
 
57
        raise errors.NoChangesetFound(_get_filename(f))
 
58
 
 
59
    # Now we have a version, to figure out how to read the changeset
 
60
    if not _serializers.has_key(version):
 
61
        raise errors.ChangesetNotSupported(version, 'version not listed in known versions')
 
62
 
 
63
    serializer = _serializers[version](version)
 
64
 
 
65
    return serializer.read(f)
 
66
 
 
67
 
 
68
def write(csets, f, version=None):
 
69
    """Serialize a list of changesets to a filelike object.
 
70
 
 
71
    :param csets: The list of changesets to serialize
 
72
    :param f: The file to output to
 
73
    :param version: [optional] target serialization version
 
74
    """
 
75
 
 
76
    if not _serializers.has_key(version):
 
77
        raise errors.ChangesetNotSupported(version, 'unknown changeset format')
 
78
 
 
79
    serializer = serializer[version](version)
 
80
    return serializer.write(csets, f) 
 
81
 
 
82
 
 
83
def ChangesetSerializer(object):
 
84
    """The base class for Serializers.
 
85
 
 
86
    Common functionality should be included here.
 
87
    """
 
88
    def __init__(self, version):
 
89
        self.version = version
 
90
 
 
91
    def read(self, f):
 
92
        """Read the rest of the changesets from the supplied file.
 
93
 
 
94
        :param f: The file to read from
 
95
        :return: A list of changesets
 
96
        """
 
97
        raise NotImplementedError
 
98
 
 
99
    def write(self, csets, f):
 
100
        """Write the changesets to the supplied files.
 
101
 
 
102
        :param csets: A list of changesets to be serialized
 
103
        :param f: The file to write to
 
104
        """
 
105
 
 
106
def register(version, klass, overwrite=False):
 
107
    """Register a ChangesetSerializer version.
 
108
 
 
109
    :param version: The version associated with this format
 
110
    :param klass: The class to instantiate, which must take a version argument
 
111
    """
 
112
    global _serializers
 
113
    if overwrite:
 
114
        _serializers[version] = klass
 
115
        return
 
116
 
 
117
    if not _serializers.has_key(version):
 
118
        _serializers[version] = klass
 
119
 
 
120
 
 
121
def register_lazy(version, module, classname, overwrite=False):
 
122
    """Register lazy-loaded changeset serializer.
 
123
 
 
124
    :param version: The version associated with this reader
 
125
    :param module: String indicating what module should be loaded
 
126
    :param classname: Name of the class that will be instantiated
 
127
    :param overwrite: Should this version override a default
 
128
    """
 
129
    def _loader(version):
 
130
        mod = __import__(module, globals(), locals(), [classname])
 
131
        klass = getattr(mod, classname)
 
132
        return klass(version)
 
133
    register(scheme, _loader, overwrite=overwrite)
 
134
 
 
135
 
 
136
register_lazy('0.6', 'bzrlib.changeset.serializer.v06', 'ChangesetSerializerV06')
 
137