/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: Vincent Ladeuil
  • Date: 2010-01-25 15:55:48 UTC
  • mto: (4985.1.4 add-attr-cleanup)
  • mto: This revision was merged to the branch mainline in revision 4988.
  • Revision ID: v.ladeuil+lp@free.fr-20100125155548-0l352pujvt5bzl5e
Deploy addAttrCleanup on the whole test suite.

Several use case worth mentioning:

- setting a module or any other object attribute is the majority
by far. In some cases the setting itself is deferred but most of
the time we want to set at the same time we add the cleanup.

- there multiple occurrences of protecting hooks or ui factory
which are now useless (the test framework takes care of that now),

- there was some lambda uses that can now be avoided.

That first cleanup already simplifies things a lot.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005, 2006 Canonical 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
from bzrlib.xml_serializer import (
 
18
    Element,
 
19
    ElementTree,
 
20
    SubElement,
 
21
    XMLSerializer,
 
22
    escape_invalid_chars,
 
23
    )
 
24
from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry
 
25
import bzrlib.inventory as inventory
 
26
from bzrlib.revision import Revision
 
27
from bzrlib.errors import BzrError
 
28
 
 
29
 
 
30
class _Serializer_v4(XMLSerializer):
 
31
    """Version 0.0.4 serializer
 
32
 
 
33
    You should use the serializer_v4 singleton.
 
34
 
 
35
    v4 serialisation is no longer supported, only deserialisation.
 
36
    """
 
37
 
 
38
    __slots__ = []
 
39
 
 
40
    def _pack_entry(self, ie):
 
41
        """Convert InventoryEntry to XML element"""
 
42
        e = Element('entry')
 
43
        e.set('name', ie.name)
 
44
        e.set('file_id', ie.file_id)
 
45
        e.set('kind', ie.kind)
 
46
 
 
47
        if ie.text_size is not None:
 
48
            e.set('text_size', '%d' % ie.text_size)
 
49
 
 
50
        for f in ['text_id', 'text_sha1', 'symlink_target']:
 
51
            v = getattr(ie, f)
 
52
            if v is not None:
 
53
                e.set(f, v)
 
54
 
 
55
        # to be conservative, we don't externalize the root pointers
 
56
        # for now, leaving them as null in the xml form.  in a future
 
57
        # version it will be implied by nested elements.
 
58
        if ie.parent_id != ROOT_ID:
 
59
            e.set('parent_id', ie.parent_id)
 
60
 
 
61
        e.tail = '\n'
 
62
 
 
63
        return e
 
64
 
 
65
 
 
66
    def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
 
67
                          return_from_cache=False):
 
68
        """Construct from XML Element
 
69
 
 
70
        :param revision_id: Ignored parameter used by xml5.
 
71
        """
 
72
        root_id = elt.get('file_id') or ROOT_ID
 
73
        inv = Inventory(root_id)
 
74
        for e in elt:
 
75
            ie = self._unpack_entry(e, entry_cache=entry_cache,
 
76
                                    return_from_cache=return_from_cache)
 
77
            if ie.parent_id == ROOT_ID:
 
78
                ie.parent_id = root_id
 
79
            inv.add(ie)
 
80
        return inv
 
81
 
 
82
 
 
83
    def _unpack_entry(self, elt, entry_cache=None, return_from_cache=False):
 
84
        ## original format inventories don't have a parent_id for
 
85
        ## nodes in the root directory, but it's cleaner to use one
 
86
        ## internally.
 
87
        parent_id = elt.get('parent_id')
 
88
        if parent_id is None:
 
89
            parent_id = ROOT_ID
 
90
 
 
91
        kind = elt.get('kind')
 
92
        if kind == 'directory':
 
93
            ie = inventory.InventoryDirectory(elt.get('file_id'),
 
94
                                              elt.get('name'),
 
95
                                              parent_id)
 
96
        elif kind == 'file':
 
97
            ie = inventory.InventoryFile(elt.get('file_id'),
 
98
                                         elt.get('name'),
 
99
                                         parent_id)
 
100
            ie.text_id = elt.get('text_id')
 
101
            ie.text_sha1 = elt.get('text_sha1')
 
102
            v = elt.get('text_size')
 
103
            ie.text_size = v and int(v)
 
104
        elif kind == 'symlink':
 
105
            ie = inventory.InventoryLink(elt.get('file_id'),
 
106
                                         elt.get('name'),
 
107
                                         parent_id)
 
108
            ie.symlink_target = elt.get('symlink_target')
 
109
        else:
 
110
            raise BzrError("unknown kind %r" % kind)
 
111
 
 
112
        ## mutter("read inventoryentry: %r", elt.attrib)
 
113
 
 
114
        return ie
 
115
 
 
116
 
 
117
    def _pack_revision(self, rev):
 
118
        """Revision object -> xml tree"""
 
119
        root = Element('revision',
 
120
                       committer = rev.committer,
 
121
                       timestamp = '%.9f' % rev.timestamp,
 
122
                       revision_id = rev.revision_id,
 
123
                       inventory_id = rev.inventory_id,
 
124
                       inventory_sha1 = rev.inventory_sha1,
 
125
                       )
 
126
        if rev.timezone:
 
127
            root.set('timezone', str(rev.timezone))
 
128
        root.text = '\n'
 
129
 
 
130
        msg = SubElement(root, 'message')
 
131
        msg.text = escape_invalid_chars(rev.message)[0]
 
132
        msg.tail = '\n'
 
133
 
 
134
        if rev.parents:
 
135
            pelts = SubElement(root, 'parents')
 
136
            pelts.tail = pelts.text = '\n'
 
137
            for i, parent_id in enumerate(rev.parents):
 
138
                p = SubElement(pelts, 'revision_ref')
 
139
                p.tail = '\n'
 
140
                p.set('revision_id', parent_id)
 
141
                if i < len(rev.parent_sha1s):
 
142
                    p.set('revision_sha1', rev.parent_sha1s[i])
 
143
        return root
 
144
 
 
145
 
 
146
    def _unpack_revision(self, elt):
 
147
        """XML Element -> Revision object"""
 
148
 
 
149
        # <changeset> is deprecated...
 
150
        if elt.tag not in ('revision', 'changeset'):
 
151
            raise BzrError("unexpected tag in revision file: %r" % elt)
 
152
 
 
153
        rev = Revision(committer = elt.get('committer'),
 
154
                       timestamp = float(elt.get('timestamp')),
 
155
                       revision_id = elt.get('revision_id'),
 
156
                       inventory_id = elt.get('inventory_id'),
 
157
                       inventory_sha1 = elt.get('inventory_sha1')
 
158
                       )
 
159
 
 
160
        precursor = elt.get('precursor')
 
161
        precursor_sha1 = elt.get('precursor_sha1')
 
162
 
 
163
        pelts = elt.find('parents')
 
164
 
 
165
        if pelts:
 
166
            for p in pelts:
 
167
                rev.parent_ids.append(p.get('revision_id'))
 
168
                rev.parent_sha1s.append(p.get('revision_sha1'))
 
169
            if precursor:
 
170
                # must be consistent
 
171
                prec_parent = rev.parent_ids[0]
 
172
        elif precursor:
 
173
            # revisions written prior to 0.0.5 have a single precursor
 
174
            # give as an attribute
 
175
            rev.parent_ids.append(precursor)
 
176
            rev.parent_sha1s.append(precursor_sha1)
 
177
 
 
178
        v = elt.get('timezone')
 
179
        rev.timezone = v and int(v)
 
180
 
 
181
        rev.message = elt.findtext('message') # text of <message>
 
182
        return rev
 
183
 
 
184
 
 
185
 
 
186
 
 
187
"""singleton instance"""
 
188
serializer_v4 = _Serializer_v4()
 
189