/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005-2010 Canonical Ltd
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
2
#
1297 by Martin Pool
- split old xml v4 serialization into separate file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
7
#
1297 by Martin Pool
- split old xml v4 serialization into separate file
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.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
12
#
1297 by Martin Pool
- split old xml v4 serialization into separate file
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1297 by Martin Pool
- split old xml v4 serialization into separate file
16
6379.6.3 by Jelmer Vernooij
Use absolute_import.
17
from __future__ import absolute_import
18
6670.4.10 by Jelmer Vernooij
Move serializer to bzr.
19
from ...bzr.xml_serializer import (
4237.3.1 by Jelmer Vernooij
Add new module with generic serializer information; keep XML-specific bits in
20
    Element,
21
    SubElement,
22
    XMLSerializer,
4416.5.1 by Jelmer Vernooij
Move squashing of XML-invalid characters to XMLSerializer.
23
    escape_invalid_chars,
4237.3.1 by Jelmer Vernooij
Add new module with generic serializer information; keep XML-specific bits in
24
    )
6670.4.1 by Jelmer Vernooij
Update imports.
25
from ...bzr.inventory import ROOT_ID, Inventory
6670.4.12 by Jelmer Vernooij
Move inventorytree to breezy.bzr.
26
from ...bzr import inventory
6624 by Jelmer Vernooij
Merge Python3 porting work ('py3 pokes')
27
from ...revision import Revision
28
from ...errors import BzrError
1297 by Martin Pool
- split old xml v4 serialization into separate file
29
30
4237.3.1 by Jelmer Vernooij
Add new module with generic serializer information; keep XML-specific bits in
31
class _Serializer_v4(XMLSerializer):
1297 by Martin Pool
- split old xml v4 serialization into separate file
32
    """Version 0.0.4 serializer
33
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
34
    You should use the serializer_v4 singleton.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
35
2817.2.1 by Robert Collins
* Inventory serialisation no longer double-sha's the content.
36
    v4 serialisation is no longer supported, only deserialisation.
37
    """
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
38
1297 by Martin Pool
- split old xml v4 serialization into separate file
39
    __slots__ = []
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
40
1297 by Martin Pool
- split old xml v4 serialization into separate file
41
    def _pack_entry(self, ie):
42
        """Convert InventoryEntry to XML element"""
43
        e = Element('entry')
44
        e.set('name', ie.name)
6973.7.10 by Jelmer Vernooij
More fixes.
45
        e.set('file_id', ie.file_id.decode('ascii'))
1297 by Martin Pool
- split old xml v4 serialization into separate file
46
        e.set('kind', ie.kind)
47
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
48
        if ie.text_size is not None:
1297 by Martin Pool
- split old xml v4 serialization into separate file
49
            e.set('text_size', '%d' % ie.text_size)
50
1092.2.20 by Robert Collins
symlink and weaves, whaddya know
51
        for f in ['text_id', 'text_sha1', 'symlink_target']:
1297 by Martin Pool
- split old xml v4 serialization into separate file
52
            v = getattr(ie, f)
1963.2.6 by Robey Pointer
pychecker is on crack; go back to using 'is None'.
53
            if v is not None:
1297 by Martin Pool
- split old xml v4 serialization into separate file
54
                e.set(f, v)
55
56
        # to be conservative, we don't externalize the root pointers
57
        # for now, leaving them as null in the xml form.  in a future
58
        # version it will be implied by nested elements.
59
        if ie.parent_id != ROOT_ID:
60
            e.set('parent_id', ie.parent_id)
61
62
        e.tail = '\n'
63
64
        return e
65
4849.4.2 by John Arbash Meinel
Change from being a per-serializer attribute to being a per-repo attribute.
66
    def _unpack_inventory(self, elt, revision_id=None, entry_cache=None,
67
                          return_from_cache=False):
1297 by Martin Pool
- split old xml v4 serialization into separate file
68
        """Construct from XML Element
2889.1.1 by Robert Collins
* The class ``bzrlib.repofmt.knitrepo.KnitRepository3`` has been folded into
69
70
        :param revision_id: Ignored parameter used by xml5.
1297 by Martin Pool
- split old xml v4 serialization into separate file
71
        """
6973.7.10 by Jelmer Vernooij
More fixes.
72
        root_id = elt.get('file_id')
73
        root_id = (root_id.encode('ascii') if root_id else ROOT_ID)
1297 by Martin Pool
- split old xml v4 serialization into separate file
74
        inv = Inventory(root_id)
75
        for e in elt:
4849.4.2 by John Arbash Meinel
Change from being a per-serializer attribute to being a per-repo attribute.
76
            ie = self._unpack_entry(e, entry_cache=entry_cache,
77
                                    return_from_cache=return_from_cache)
1297 by Martin Pool
- split old xml v4 serialization into separate file
78
            if ie.parent_id == ROOT_ID:
79
                ie.parent_id = root_id
80
            inv.add(ie)
81
        return inv
82
4849.4.2 by John Arbash Meinel
Change from being a per-serializer attribute to being a per-repo attribute.
83
    def _unpack_entry(self, elt, entry_cache=None, return_from_cache=False):
7143.15.2 by Jelmer Vernooij
Run autopep8.
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.
1297 by Martin Pool
- split old xml v4 serialization into separate file
87
        parent_id = elt.get('parent_id')
6973.7.10 by Jelmer Vernooij
More fixes.
88
        parent_id = (parent_id.encode('ascii') if parent_id else ROOT_ID)
1297 by Martin Pool
- split old xml v4 serialization into separate file
89
6973.7.10 by Jelmer Vernooij
More fixes.
90
        file_id = elt.get('file_id').encode('ascii')
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
91
        kind = elt.get('kind')
92
        if kind == 'directory':
6973.7.10 by Jelmer Vernooij
More fixes.
93
            ie = inventory.InventoryDirectory(file_id,
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
94
                                              elt.get('name'),
95
                                              parent_id)
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
96
        elif kind == 'file':
6973.7.10 by Jelmer Vernooij
More fixes.
97
            ie = inventory.InventoryFile(file_id,
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
98
                                         elt.get('name'),
99
                                         parent_id)
100
            ie.text_id = elt.get('text_id')
7045.4.10 by Jelmer Vernooij
Fix a couple more tests.
101
            if ie.text_id is not None:
102
                ie.text_id = ie.text_id.encode('utf-8')
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
103
            ie.text_sha1 = elt.get('text_sha1')
6973.7.10 by Jelmer Vernooij
More fixes.
104
            if ie.text_sha1 is not None:
105
                ie.text_sha1 = ie.text_sha1.encode('ascii')
1399.1.9 by Robert Collins
factor out file related logic from InventoryEntry to InventoryFile
106
            v = elt.get('text_size')
107
            ie.text_size = v and int(v)
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
108
        elif kind == 'symlink':
6973.7.10 by Jelmer Vernooij
More fixes.
109
            ie = inventory.InventoryLink(file_id,
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
110
                                         elt.get('name'),
111
                                         parent_id)
112
            ie.symlink_target = elt.get('symlink_target')
1399.1.8 by Robert Collins
factor out inventory directory logic into 'InventoryDirectory' class
113
        else:
1399.1.10 by Robert Collins
remove kind from the InventoryEntry constructor - only child classes should be created now
114
            raise BzrError("unknown kind %r" % kind)
1297 by Martin Pool
- split old xml v4 serialization into separate file
115
1185.31.4 by John Arbash Meinel
Fixing mutter() calls to not have to do string processing.
116
        ## mutter("read inventoryentry: %r", elt.attrib)
1297 by Martin Pool
- split old xml v4 serialization into separate file
117
118
        return ie
119
120
    def _pack_revision(self, rev):
121
        """Revision object -> xml tree"""
122
        root = Element('revision',
7143.15.2 by Jelmer Vernooij
Run autopep8.
123
                       committer=rev.committer,
124
                       timestamp='%.9f' % rev.timestamp,
125
                       revision_id=rev.revision_id,
126
                       inventory_id=rev.inventory_id,
127
                       inventory_sha1=rev.inventory_sha1,
1297 by Martin Pool
- split old xml v4 serialization into separate file
128
                       )
129
        if rev.timezone:
130
            root.set('timezone', str(rev.timezone))
131
        root.text = '\n'
132
133
        msg = SubElement(root, 'message')
4416.5.1 by Jelmer Vernooij
Move squashing of XML-invalid characters to XMLSerializer.
134
        msg.text = escape_invalid_chars(rev.message)[0]
1297 by Martin Pool
- split old xml v4 serialization into separate file
135
        msg.tail = '\n'
136
137
        if rev.parents:
138
            pelts = SubElement(root, 'parents')
139
            pelts.tail = pelts.text = '\n'
1311 by Martin Pool
- remove RevisionReference; just hold parent ids directly
140
            for i, parent_id in enumerate(rev.parents):
1297 by Martin Pool
- split old xml v4 serialization into separate file
141
                p = SubElement(pelts, 'revision_ref')
142
                p.tail = '\n'
1311 by Martin Pool
- remove RevisionReference; just hold parent ids directly
143
                p.set('revision_id', parent_id)
144
                if i < len(rev.parent_sha1s):
145
                    p.set('revision_sha1', rev.parent_sha1s[i])
1297 by Martin Pool
- split old xml v4 serialization into separate file
146
        return root
147
7290.46.1 by Jelmer Vernooij
Add custom generator for XML revisions.
148
    def write_revision_to_string(self, rev):
149
        return tostring(self._pack_revision(rev)) + b'\n'
150
151
    def _write_element(self, elt, f):
152
        ElementTree(elt).write(f, 'utf-8')
153
        f.write(b'\n')
154
1297 by Martin Pool
- split old xml v4 serialization into separate file
155
    def _unpack_revision(self, elt):
156
        """XML Element -> Revision object"""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
157
1297 by Martin Pool
- split old xml v4 serialization into separate file
158
        # <changeset> is deprecated...
159
        if elt.tag not in ('revision', 'changeset'):
160
            raise BzrError("unexpected tag in revision file: %r" % elt)
161
7143.15.2 by Jelmer Vernooij
Run autopep8.
162
        rev = Revision(committer=elt.get('committer'),
163
                       timestamp=float(elt.get('timestamp')),
164
                       revision_id=elt.get('revision_id'),
165
                       inventory_id=elt.get('inventory_id'),
166
                       inventory_sha1=elt.get('inventory_sha1')
1297 by Martin Pool
- split old xml v4 serialization into separate file
167
                       )
168
169
        precursor = elt.get('precursor')
170
        precursor_sha1 = elt.get('precursor_sha1')
171
172
        pelts = elt.find('parents')
173
174
        if pelts:
175
            for p in pelts:
1313 by Martin Pool
- rename to Revision.parent_ids to avoid confusion with old usage
176
                rev.parent_ids.append(p.get('revision_id'))
1311 by Martin Pool
- remove RevisionReference; just hold parent ids directly
177
                rev.parent_sha1s.append(p.get('revision_sha1'))
1297 by Martin Pool
- split old xml v4 serialization into separate file
178
            if precursor:
179
                # must be consistent
1314 by Martin Pool
- Fix up one more RevisionReference bit
180
                prec_parent = rev.parent_ids[0]
1297 by Martin Pool
- split old xml v4 serialization into separate file
181
        elif precursor:
182
            # revisions written prior to 0.0.5 have a single precursor
183
            # give as an attribute
1313 by Martin Pool
- rename to Revision.parent_ids to avoid confusion with old usage
184
            rev.parent_ids.append(precursor)
1311 by Martin Pool
- remove RevisionReference; just hold parent ids directly
185
            rev.parent_sha1s.append(precursor_sha1)
1297 by Martin Pool
- split old xml v4 serialization into separate file
186
187
        v = elt.get('timezone')
188
        rev.timezone = v and int(v)
189
7143.15.2 by Jelmer Vernooij
Run autopep8.
190
        rev.message = elt.findtext('message')  # text of <message>
1297 by Martin Pool
- split old xml v4 serialization into separate file
191
        return rev
192
193
194
"""singleton instance"""
195
serializer_v4 = _Serializer_v4()