33
31
from xml.etree.cElementTree import (ElementTree, SubElement, Element,
34
32
XMLTreeBuilder, fromstring, tostring)
35
33
import xml.etree as elementtree
36
# Also import ElementTree module so monkey-patching below always works
37
import xml.etree.ElementTree
38
34
except ImportError:
39
35
from cElementTree import (ElementTree, SubElement, Element,
40
36
XMLTreeBuilder, fromstring, tostring)
59
55
squashes_xml_invalid_characters = True
61
57
def read_inventory_from_string(self, xml_string, revision_id=None,
62
entry_cache=None, return_from_cache=False):
63
59
"""Read xml_string into an inventory object.
65
61
:param xml_string: The xml to read.
73
69
:param entry_cache: An optional cache of InventoryEntry objects. If
74
70
supplied we will look up entries via (file_id, revision_id) which
75
71
should map to a valid InventoryEntry (File/Directory/etc) object.
76
:param return_from_cache: Return entries directly from the cache,
77
rather than copying them first. This is only safe if the caller
78
promises not to mutate the returned inventory entries, but it can
79
make some operations significantly faster.
82
74
return self._unpack_inventory(fromstring(xml_string), revision_id,
83
entry_cache=entry_cache,
84
return_from_cache=return_from_cache)
75
entry_cache=entry_cache)
85
76
except ParseError, e:
86
77
raise errors.UnexpectedInventoryFormat(e)
88
79
def read_inventory(self, f, revision_id=None):
91
return self._unpack_inventory(self._read_element(f),
81
return self._unpack_inventory(self._read_element(f),
95
83
except ParseError, e:
96
84
raise errors.UnexpectedInventoryFormat(e)
115
103
return ElementTree().parse(f)
106
# performance tuning for elementree's serialiser. This should be
107
# sent upstream - RBC 20060523.
108
# the functions here are patched into elementtree at runtime.
110
escape_re = re.compile("[&'\"<>]")
113
"'":"'", # FIXME: overkill
118
def _escape_replace(match, map=escape_map):
119
return map[match.group()]
121
def _escape_attrib(text, encoding=None, replace=None):
122
# escape attribute value
126
text = elementtree.ElementTree._encode(text, encoding)
128
return elementtree.ElementTree._encode_entity(text)
130
return escape_re.sub(_escape_replace, text)
132
text = replace(text, "&", "&")
133
text = replace(text, "'", "'") # FIXME: overkill
134
text = replace(text, "\"", """)
135
text = replace(text, "<", "<")
136
text = replace(text, ">", ">")
138
except (TypeError, AttributeError):
139
elementtree.ElementTree._raise_serialization_error(text)
141
elementtree.ElementTree._escape_attrib = _escape_attrib
143
escape_cdata_re = re.compile("[&<>]")
149
def _escape_cdata_replace(match, map=escape_cdata_map):
150
return map[match.group()]
152
def _escape_cdata(text, encoding=None, replace=None):
153
# escape character data
157
text = elementtree.ElementTree._encode(text, encoding)
159
return elementtree.ElementTree._encode_entity(text)
161
return escape_cdata_re.sub(_escape_cdata_replace, text)
163
text = replace(text, "&", "&")
164
text = replace(text, "<", "<")
165
text = replace(text, ">", ">")
167
except (TypeError, AttributeError):
168
elementtree.ElementTree._raise_serialization_error(text)
170
elementtree.ElementTree._escape_cdata = _escape_cdata
118
173
def escape_invalid_chars(message):
119
174
"""Escape the XML-invalid characters in a commit message.