/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 bzrlib/xml4.py

  • Committer: Robert Collins
  • Date: 2007-10-05 02:41:37 UTC
  • mto: (2592.3.166 repository)
  • mto: This revision was merged to the branch mainline in revision 2896.
  • Revision ID: robertc@robertcollins.net-20071005024137-kn7brcu07nu8cwl1
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
  ``KnitRepository`` by parameters to the constructor. (Robert Collins)
* ``bzrlib.xml_serializer.Serializer`` is now responsible for checking that
  mandatory attributes are present on serialisation and deserialisation.
  This fixes some holes in API usage and allows better separation between
  physical storage and object serialisation. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 Canonical Ltd
2
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
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
from bzrlib.xml_serializer import (
18
 
    Element,
19
 
    SubElement,
20
 
    XMLSerializer,
21
 
    escape_invalid_chars,
22
 
    )
23
 
from bzrlib.inventory import ROOT_ID, Inventory
 
17
from bzrlib.xml_serializer import ElementTree, SubElement, Element, Serializer
 
18
from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry
24
19
import bzrlib.inventory as inventory
25
20
from bzrlib.revision import Revision
26
21
from bzrlib.errors import BzrError
27
22
 
28
23
 
29
 
class _Serializer_v4(XMLSerializer):
 
24
class _Serializer_v4(Serializer):
30
25
    """Version 0.0.4 serializer
31
26
 
32
27
    You should use the serializer_v4 singleton.
33
 
 
 
28
    
34
29
    v4 serialisation is no longer supported, only deserialisation.
35
30
    """
36
 
 
 
31
    
37
32
    __slots__ = []
38
 
 
 
33
    
39
34
    def _pack_entry(self, ie):
40
35
        """Convert InventoryEntry to XML element"""
41
36
        e = Element('entry')
55
50
        # for now, leaving them as null in the xml form.  in a future
56
51
        # version it will be implied by nested elements.
57
52
        if ie.parent_id != ROOT_ID:
 
53
            assert isinstance(ie.parent_id, basestring)
58
54
            e.set('parent_id', ie.parent_id)
59
55
 
60
56
        e.tail = '\n'
62
58
        return e
63
59
 
64
60
 
65
 
    def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
66
 
                          return_from_cache=False):
 
61
    def _unpack_inventory(self, elt, revision_id=None):
67
62
        """Construct from XML Element
68
63
 
69
64
        :param revision_id: Ignored parameter used by xml5.
70
65
        """
 
66
        assert elt.tag == 'inventory'
71
67
        root_id = elt.get('file_id') or ROOT_ID
72
68
        inv = Inventory(root_id)
73
69
        for e in elt:
74
 
            ie = self._unpack_entry(e, entry_cache=entry_cache,
75
 
                                    return_from_cache=return_from_cache)
 
70
            ie = self._unpack_entry(e)
76
71
            if ie.parent_id == ROOT_ID:
77
72
                ie.parent_id = root_id
78
73
            inv.add(ie)
79
74
        return inv
80
75
 
81
76
 
82
 
    def _unpack_entry(self, elt, entry_cache=None, return_from_cache=False):
 
77
    def _unpack_entry(self, elt):
 
78
        assert elt.tag == 'entry'
 
79
 
83
80
        ## original format inventories don't have a parent_id for
84
81
        ## nodes in the root directory, but it's cleaner to use one
85
82
        ## internally.
127
124
        root.text = '\n'
128
125
 
129
126
        msg = SubElement(root, 'message')
130
 
        msg.text = escape_invalid_chars(rev.message)[0]
 
127
        msg.text = rev.message
131
128
        msg.tail = '\n'
132
129
 
133
130
        if rev.parents:
136
133
            for i, parent_id in enumerate(rev.parents):
137
134
                p = SubElement(pelts, 'revision_ref')
138
135
                p.tail = '\n'
 
136
                assert parent_id
139
137
                p.set('revision_id', parent_id)
140
138
                if i < len(rev.parent_sha1s):
141
139
                    p.set('revision_sha1', rev.parent_sha1s[i])
142
140
        return root
143
141
 
144
 
 
 
142
    
145
143
    def _unpack_revision(self, elt):
146
144
        """XML Element -> Revision object"""
147
 
 
 
145
        
148
146
        # <changeset> is deprecated...
149
147
        if elt.tag not in ('revision', 'changeset'):
150
148
            raise BzrError("unexpected tag in revision file: %r" % elt)
163
161
 
164
162
        if pelts:
165
163
            for p in pelts:
 
164
                assert p.tag == 'revision_ref', \
 
165
                       "bad parent node tag %r" % p.tag
166
166
                rev.parent_ids.append(p.get('revision_id'))
167
167
                rev.parent_sha1s.append(p.get('revision_sha1'))
168
168
            if precursor:
169
169
                # must be consistent
170
170
                prec_parent = rev.parent_ids[0]
 
171
                assert prec_parent == precursor
171
172
        elif precursor:
172
173
            # revisions written prior to 0.0.5 have a single precursor
173
174
            # give as an attribute