~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml5.py

  • Committer: Robert Collins
  • Date: 2005-10-09 23:42:12 UTC
  • Revision ID: robertc@robertcollins.net-20051009234212-7973344d900afb0b
merge in niemeyers prefixed-store patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
from bzrlib.xml import ElementTree, SubElement, Element, Serializer
19
19
from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry
20
 
from bzrlib.revision import Revision, RevisionReference        
 
20
import bzrlib.inventory as inventory
 
21
from bzrlib.revision import Revision        
21
22
from bzrlib.errors import BzrError
22
23
 
23
24
 
34
35
    
35
36
    def _pack_inventory(self, inv):
36
37
        """Convert to XML Element"""
37
 
        e = Element('inventory')
 
38
        e = Element('inventory',
 
39
                    format='5')
38
40
        e.text = '\n'
39
41
        if inv.root.file_id not in (None, ROOT_ID):
40
42
            e.set('file_id', inv.root.file_id)
45
47
 
46
48
    def _pack_entry(self, ie):
47
49
        """Convert InventoryEntry to XML element"""
48
 
        assert ie.kind == 'directory' or ie.kind == 'file'
 
50
        if not InventoryEntry.versionable_kind(ie.kind):
 
51
            raise AssertionError('unsupported entry kind %s' % ie.kind)
49
52
        e = Element(ie.kind)
50
53
        e.set('name', ie.name)
51
54
        e.set('file_id', ie.file_id)
53
56
        if ie.text_size != None:
54
57
            e.set('text_size', '%d' % ie.text_size)
55
58
 
56
 
        for f in ['text_version', 'text_sha1', 'entry_version']:
 
59
        for f in ['text_sha1', 'revision', 'symlink_target']:
57
60
            v = getattr(ie, f)
58
61
            if v != None:
59
62
                e.set(f, v)
60
63
 
 
64
        if ie.executable:
 
65
            e.set('executable', 'yes')
 
66
 
61
67
        # to be conservative, we don't externalize the root pointers
62
68
        # for now, leaving them as null in the xml form.  in a future
63
69
        # version it will be implied by nested elements.
77
83
                       timestamp = '%.9f' % rev.timestamp,
78
84
                       revision_id = rev.revision_id,
79
85
                       inventory_sha1 = rev.inventory_sha1,
 
86
                       format='5',
80
87
                       )
81
88
        if rev.timezone:
82
89
            root.set('timezone', str(rev.timezone))
83
90
        root.text = '\n'
84
 
 
85
91
        msg = SubElement(root, 'message')
86
92
        msg.text = rev.message
87
93
        msg.tail = '\n'
88
 
 
89
 
        if rev.parents:
 
94
        if rev.parent_ids:
90
95
            pelts = SubElement(root, 'parents')
91
96
            pelts.tail = pelts.text = '\n'
92
 
            for rr in rev.parents:
93
 
                assert isinstance(rr, RevisionReference)
 
97
            for parent_id in rev.parent_ids:
 
98
                assert isinstance(parent_id, basestring)
94
99
                p = SubElement(pelts, 'revision_ref')
95
100
                p.tail = '\n'
96
 
                assert rr.revision_id
97
 
                p.set('revision_id', rr.revision_id)
98
 
 
 
101
                p.set('revision_id', parent_id)
99
102
        return root
100
 
 
101
103
    
102
104
 
103
105
    def _unpack_inventory(self, elt):
105
107
        """
106
108
        assert elt.tag == 'inventory'
107
109
        root_id = elt.get('file_id') or ROOT_ID
 
110
        format = elt.get('format')
 
111
        if format is not None:
 
112
            if format != '5':
 
113
                raise BzrError("invalid format version %r on inventory"
 
114
                                % format)
108
115
        inv = Inventory(root_id)
109
116
        for e in elt:
110
117
            ie = self._unpack_entry(e)
116
123
 
117
124
    def _unpack_entry(self, elt):
118
125
        kind = elt.tag
119
 
        assert kind == 'directory' or kind == 'file'
 
126
        if not InventoryEntry.versionable_kind(kind):
 
127
            raise AssertionError('unsupported entry kind %s' % kind)
120
128
 
121
129
        parent_id = elt.get('parent_id')
122
130
        if parent_id == None:
123
131
            parent_id = ROOT_ID
124
132
 
125
 
        ie = InventoryEntry(elt.get('file_id'),
126
 
                            elt.get('name'),
127
 
                            kind,
128
 
                            parent_id)
129
 
        ie.text_version = elt.get('text_version')
130
 
        ie.entry_version = elt.get('entry_version')
131
 
        ie.text_sha1 = elt.get('text_sha1')
132
 
        v = elt.get('text_size')
133
 
        ie.text_size = v and int(v)
 
133
        if kind == 'directory':
 
134
            ie = inventory.InventoryDirectory(elt.get('file_id'),
 
135
                                              elt.get('name'),
 
136
                                              parent_id)
 
137
        elif kind == 'file':
 
138
            ie = inventory.InventoryFile(elt.get('file_id'),
 
139
                                         elt.get('name'),
 
140
                                         parent_id)
 
141
            ie.text_sha1 = elt.get('text_sha1')
 
142
            if elt.get('executable') == 'yes':
 
143
                ie.executable = True
 
144
            v = elt.get('text_size')
 
145
            ie.text_size = v and int(v)
 
146
        elif kind == 'symlink':
 
147
            ie = inventory.InventoryLink(elt.get('file_id'),
 
148
                                         elt.get('name'),
 
149
                                         parent_id)
 
150
            ie.symlink_target = elt.get('symlink_target')
 
151
        else:
 
152
            raise BzrError("unknown kind %r" % kind)
 
153
        ie.revision = elt.get('revision')
134
154
 
135
155
        return ie
136
156
 
138
158
    def _unpack_revision(self, elt):
139
159
        """XML Element -> Revision object"""
140
160
        assert elt.tag == 'revision'
141
 
        
 
161
        format = elt.get('format')
 
162
        if format is not None:
 
163
            if format != '5':
 
164
                raise BzrError("invalid format version %r on inventory"
 
165
                                % format)
142
166
        rev = Revision(committer = elt.get('committer'),
143
167
                       timestamp = float(elt.get('timestamp')),
144
168
                       revision_id = elt.get('revision_id'),
145
169
                       inventory_sha1 = elt.get('inventory_sha1')
146
170
                       )
147
 
 
148
171
        parents = elt.find('parents') or []
149
172
        for p in parents:
150
173
            assert p.tag == 'revision_ref', \
151
174
                   "bad parent node tag %r" % p.tag
152
 
            rev_ref = RevisionReference(p.get('revision_id'))
153
 
            rev.parents.append(rev_ref)
 
175
            rev.parent_ids.append(p.get('revision_id'))
154
176
 
155
177
        v = elt.get('timezone')
156
178
        rev.timezone = v and int(v)
159
181
        return rev
160
182
 
161
183
 
162
 
 
163
184
serializer_v5 = Serializer_v5()