~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/xml5.py

  • Committer: Martin Pool
  • Date: 2005-08-24 08:59:32 UTC
  • Revision ID: mbp@sourcefrog.net-20050824085932-c61f1f1f1c930e13
- Add a simple UIFactory 

  The idea of this is to let a client of bzrlib set some 
  policy about how output is displayed.

  In this revision all that's done is that progress bars
  are constructed by a policy established by the application
  rather than being randomly constructed in the library 
  or passed down the calls.  This avoids progress bars
  popping up while running the test suite and cleans up
  some code.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
 
 
17
 
 
18
 
from bzrlib.xml import ElementTree, SubElement, Element, Serializer
19
 
from bzrlib.inventory import ROOT_ID, Inventory, InventoryEntry
20
 
from bzrlib.revision import Revision, RevisionReference        
21
 
from bzrlib.errors import BzrError
22
 
 
23
 
 
24
 
 
25
 
 
26
 
 
27
 
class Serializer_v5(Serializer):
28
 
    """Version 5 serializer
29
 
 
30
 
    Packs objects into XML and vice versa.
31
 
    """
32
 
    
33
 
    __slots__ = []
34
 
    
35
 
    def _pack_inventory(self, inv):
36
 
        """Convert to XML Element"""
37
 
        e = Element('inventory')
38
 
        e.text = '\n'
39
 
        if inv.root.file_id not in (None, ROOT_ID):
40
 
            e.set('file_id', inv.root.file_id)
41
 
        for path, ie in inv.iter_entries():
42
 
            e.append(self._pack_entry(ie))
43
 
        return e
44
 
 
45
 
 
46
 
    def _pack_entry(self, ie):
47
 
        """Convert InventoryEntry to XML element"""
48
 
        assert ie.kind == 'directory' or ie.kind == 'file'
49
 
        e = Element(ie.kind)
50
 
        e.set('name', ie.name)
51
 
        e.set('file_id', ie.file_id)
52
 
 
53
 
        if ie.text_size != None:
54
 
            e.set('text_size', '%d' % ie.text_size)
55
 
 
56
 
        for f in ['text_version', 'text_sha1', 'entry_version']:
57
 
            v = getattr(ie, f)
58
 
            if v != None:
59
 
                e.set(f, v)
60
 
 
61
 
        # to be conservative, we don't externalize the root pointers
62
 
        # for now, leaving them as null in the xml form.  in a future
63
 
        # version it will be implied by nested elements.
64
 
        if ie.parent_id != ROOT_ID:
65
 
            assert isinstance(ie.parent_id, basestring)
66
 
            e.set('parent_id', ie.parent_id)
67
 
 
68
 
        e.tail = '\n'
69
 
 
70
 
        return e
71
 
 
72
 
 
73
 
    def _pack_revision(self, rev):
74
 
        """Revision object -> xml tree"""
75
 
        root = Element('revision',
76
 
                       committer = rev.committer,
77
 
                       timestamp = '%.9f' % rev.timestamp,
78
 
                       revision_id = rev.revision_id,
79
 
                       inventory_sha1 = rev.inventory_sha1,
80
 
                       )
81
 
        if rev.timezone:
82
 
            root.set('timezone', str(rev.timezone))
83
 
        root.text = '\n'
84
 
 
85
 
        msg = SubElement(root, 'message')
86
 
        msg.text = rev.message
87
 
        msg.tail = '\n'
88
 
 
89
 
        if rev.parents:
90
 
            pelts = SubElement(root, 'parents')
91
 
            pelts.tail = pelts.text = '\n'
92
 
            for rr in rev.parents:
93
 
                assert isinstance(rr, RevisionReference)
94
 
                p = SubElement(pelts, 'revision_ref')
95
 
                p.tail = '\n'
96
 
                assert rr.revision_id
97
 
                p.set('revision_id', rr.revision_id)
98
 
 
99
 
        return root
100
 
 
101
 
    
102
 
 
103
 
    def _unpack_inventory(self, elt):
104
 
        """Construct from XML Element
105
 
        """
106
 
        assert elt.tag == 'inventory'
107
 
        root_id = elt.get('file_id') or ROOT_ID
108
 
        inv = Inventory(root_id)
109
 
        for e in elt:
110
 
            ie = self._unpack_entry(e)
111
 
            if ie.parent_id == ROOT_ID:
112
 
                ie.parent_id = root_id
113
 
            inv.add(ie)
114
 
        return inv
115
 
 
116
 
 
117
 
    def _unpack_entry(self, elt):
118
 
        kind = elt.tag
119
 
        assert kind == 'directory' or kind == 'file'
120
 
 
121
 
        parent_id = elt.get('parent_id')
122
 
        if parent_id == None:
123
 
            parent_id = ROOT_ID
124
 
 
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)
134
 
 
135
 
        return ie
136
 
 
137
 
 
138
 
    def _unpack_revision(self, elt):
139
 
        """XML Element -> Revision object"""
140
 
        assert elt.tag == 'revision'
141
 
        
142
 
        rev = Revision(committer = elt.get('committer'),
143
 
                       timestamp = float(elt.get('timestamp')),
144
 
                       revision_id = elt.get('revision_id'),
145
 
                       inventory_sha1 = elt.get('inventory_sha1')
146
 
                       )
147
 
 
148
 
        parents = elt.find('parents') or []
149
 
        for p in parents:
150
 
            assert p.tag == 'revision_ref', \
151
 
                   "bad parent node tag %r" % p.tag
152
 
            rev_ref = RevisionReference(p.get('revision_id'))
153
 
            rev.parents.append(rev_ref)
154
 
 
155
 
        v = elt.get('timezone')
156
 
        rev.timezone = v and int(v)
157
 
 
158
 
        rev.message = elt.findtext('message') # text of <message>
159
 
        return rev
160
 
 
161
 
 
162
 
 
163
 
serializer_v5 = Serializer_v5()