~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml5.py

  • Committer: Martin Pool
  • Date: 2005-09-12 09:50:44 UTC
  • Revision ID: mbp@sourcefrog.net-20050912095044-6acfdb5611729987
- no tests in bzrlib.fetch anymore

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