/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: wang
  • Date: 2006-10-29 13:41:32 UTC
  • mto: (2104.4.1 wang_65714)
  • mto: This revision was merged to the branch mainline in revision 2109.
  • Revision ID: wang@ubuntu-20061029134132-3d7f4216f20c4aef
Replace python's difflib by patiencediff because the worst case 
performance is cubic for difflib and people commiting large data 
files are often hurt by this. The worst case performance of patience is 
quadratic. Fix bug 65714.

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
 
from bzrlib.revision import Revision
 
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
 
    You should use the serializer_v4 singleton.
33
 
 
34
 
    v4 serialisation is no longer supported, only deserialisation.
35
 
    """
36
 
 
 
27
    You should use the serializer_v4 singleton."""
 
28
    
37
29
    __slots__ = []
 
30
    
 
31
    def _pack_inventory(self, inv):
 
32
        """Convert to XML Element"""
 
33
        # v4 serialization is not used any more.
 
34
        raise NotImplementedError(self._pack_inventory)
 
35
        e = Element('inventory')
 
36
        e.text = '\n'
 
37
        if inv.root.file_id not in (None, ROOT_ID):
 
38
            e.set('file_id', inv.root.file_id)
 
39
        for path, ie in inv.iter_entries():
 
40
            e.append(self._pack_entry(ie))
 
41
        return e
 
42
 
38
43
 
39
44
    def _pack_entry(self, ie):
40
45
        """Convert InventoryEntry to XML element"""
55
60
        # for now, leaving them as null in the xml form.  in a future
56
61
        # version it will be implied by nested elements.
57
62
        if ie.parent_id != ROOT_ID:
 
63
            assert isinstance(ie.parent_id, basestring)
58
64
            e.set('parent_id', ie.parent_id)
59
65
 
60
66
        e.tail = '\n'
62
68
        return e
63
69
 
64
70
 
65
 
    def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
66
 
                          return_from_cache=False):
 
71
    def _unpack_inventory(self, elt):
67
72
        """Construct from XML Element
68
 
 
69
 
        :param revision_id: Ignored parameter used by xml5.
70
73
        """
 
74
        assert elt.tag == 'inventory'
71
75
        root_id = elt.get('file_id') or ROOT_ID
72
76
        inv = Inventory(root_id)
73
77
        for e in elt:
74
 
            ie = self._unpack_entry(e, entry_cache=entry_cache,
75
 
                                    return_from_cache=return_from_cache)
 
78
            ie = self._unpack_entry(e)
76
79
            if ie.parent_id == ROOT_ID:
77
80
                ie.parent_id = root_id
78
81
            inv.add(ie)
79
82
        return inv
80
83
 
81
84
 
82
 
    def _unpack_entry(self, elt, entry_cache=None, return_from_cache=False):
 
85
    def _unpack_entry(self, elt):
 
86
        assert elt.tag == 'entry'
 
87
 
83
88
        ## original format inventories don't have a parent_id for
84
89
        ## nodes in the root directory, but it's cleaner to use one
85
90
        ## internally.
127
132
        root.text = '\n'
128
133
 
129
134
        msg = SubElement(root, 'message')
130
 
        msg.text = escape_invalid_chars(rev.message)[0]
 
135
        msg.text = rev.message
131
136
        msg.tail = '\n'
132
137
 
133
138
        if rev.parents:
136
141
            for i, parent_id in enumerate(rev.parents):
137
142
                p = SubElement(pelts, 'revision_ref')
138
143
                p.tail = '\n'
 
144
                assert parent_id
139
145
                p.set('revision_id', parent_id)
140
146
                if i < len(rev.parent_sha1s):
141
147
                    p.set('revision_sha1', rev.parent_sha1s[i])
142
148
        return root
143
149
 
144
 
 
 
150
    
145
151
    def _unpack_revision(self, elt):
146
152
        """XML Element -> Revision object"""
147
 
 
 
153
        
148
154
        # <changeset> is deprecated...
149
155
        if elt.tag not in ('revision', 'changeset'):
150
156
            raise BzrError("unexpected tag in revision file: %r" % elt)
163
169
 
164
170
        if pelts:
165
171
            for p in pelts:
 
172
                assert p.tag == 'revision_ref', \
 
173
                       "bad parent node tag %r" % p.tag
166
174
                rev.parent_ids.append(p.get('revision_id'))
167
175
                rev.parent_sha1s.append(p.get('revision_sha1'))
168
176
            if precursor:
169
177
                # must be consistent
170
178
                prec_parent = rev.parent_ids[0]
 
179
                assert prec_parent == precursor
171
180
        elif precursor:
172
181
            # revisions written prior to 0.0.5 have a single precursor
173
182
            # give as an attribute