~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml5.py

  • Committer: Robert Collins
  • Date: 2006-06-26 16:23:10 UTC
  • mfrom: (1780.2.1 misc-fixen)
  • mto: This revision was merged to the branch mainline in revision 1815.
  • Revision ID: robertc@robertcollins.net-20060626162310-98f5b55b8cc19d46
(robertc) Misc minor typos and the like.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
2
 
 
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
 
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
5
5
# the Free Software Foundation; either version 2 of the License, or
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
from bzrlib.xml import ElementTree, SubElement, Element, Serializer
 
18
from bzrlib.xml_serializer import SubElement, Element, Serializer
19
19
from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry
20
20
import bzrlib.inventory as inventory
21
 
from bzrlib.revision import Revision        
 
21
from bzrlib.revision import Revision
22
22
from bzrlib.errors import BzrError
23
23
 
24
24
 
25
 
 
26
 
 
27
 
 
28
25
class Serializer_v5(Serializer):
29
26
    """Version 5 serializer
30
27
 
40
37
        e.text = '\n'
41
38
        if inv.root.file_id not in (None, ROOT_ID):
42
39
            e.set('file_id', inv.root.file_id)
 
40
        if inv.revision_id is not None:
 
41
            e.set('revision_id', inv.revision_id)
43
42
        for path, ie in inv.iter_entries():
44
43
            e.append(self._pack_entry(ie))
45
44
        return e
46
45
 
47
 
 
48
46
    def _pack_entry(self, ie):
49
47
        """Convert InventoryEntry to XML element"""
 
48
        # TODO: should just be a plain assertion
50
49
        if not InventoryEntry.versionable_kind(ie.kind):
51
50
            raise AssertionError('unsupported entry kind %s' % ie.kind)
52
51
        e = Element(ie.kind)
70
69
        if ie.parent_id != ROOT_ID:
71
70
            assert isinstance(ie.parent_id, basestring)
72
71
            e.set('parent_id', ie.parent_id)
73
 
 
74
72
        e.tail = '\n'
75
 
 
76
73
        return e
77
74
 
78
 
 
79
75
    def _pack_revision(self, rev):
80
76
        """Revision object -> xml tree"""
81
77
        root = Element('revision',
99
95
                p = SubElement(pelts, 'revision_ref')
100
96
                p.tail = '\n'
101
97
                p.set('revision_id', parent_id)
 
98
        if rev.properties:
 
99
            self._pack_revision_properties(rev, root)
102
100
        return root
103
 
    
 
101
 
 
102
 
 
103
    def _pack_revision_properties(self, rev, under_element):
 
104
        top_elt = SubElement(under_element, 'properties')
 
105
        for prop_name, prop_value in sorted(rev.properties.items()):
 
106
            assert isinstance(prop_name, basestring) 
 
107
            assert isinstance(prop_value, basestring) 
 
108
            prop_elt = SubElement(top_elt, 'property')
 
109
            prop_elt.set('name', prop_name)
 
110
            prop_elt.text = prop_value
 
111
            prop_elt.tail = '\n'
 
112
        top_elt.tail = '\n'
 
113
 
104
114
 
105
115
    def _unpack_inventory(self, elt):
106
116
        """Construct from XML Element
112
122
            if format != '5':
113
123
                raise BzrError("invalid format version %r on inventory"
114
124
                                % format)
115
 
        inv = Inventory(root_id)
 
125
        revision_id = elt.get('revision_id')
 
126
        inv = Inventory(root_id, revision_id=revision_id)
116
127
        for e in elt:
117
128
            ie = self._unpack_entry(e)
118
129
            if ie.parent_id == ROOT_ID:
173
184
            assert p.tag == 'revision_ref', \
174
185
                   "bad parent node tag %r" % p.tag
175
186
            rev.parent_ids.append(p.get('revision_id'))
176
 
 
 
187
        self._unpack_revision_properties(elt, rev)
177
188
        v = elt.get('timezone')
178
189
        rev.timezone = v and int(v)
179
 
 
180
190
        rev.message = elt.findtext('message') # text of <message>
181
191
        return rev
182
192
 
183
193
 
 
194
    def _unpack_revision_properties(self, elt, rev):
 
195
        """Unpack properties onto a revision."""
 
196
        props_elt = elt.find('properties')
 
197
        assert len(rev.properties) == 0
 
198
        if not props_elt:
 
199
            return
 
200
        for prop_elt in props_elt:
 
201
            assert prop_elt.tag == 'property', \
 
202
                "bad tag under properties list: %r" % prop_elt.tag
 
203
            name = prop_elt.get('name')
 
204
            value = prop_elt.text
 
205
            assert name not in rev.properties, \
 
206
                "repeated property %r" % name
 
207
            rev.properties[name] = value
 
208
 
 
209
 
184
210
serializer_v5 = Serializer_v5()