From 8df4f8ed584bbfe9d3e4a5dd9088013f58bbc235 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 17:56:37 +0000 Subject: [PATCH 01/52] SRV-439 - performance optimizations for string handling in xml formatting A number of small perf optimizations: * use 'translate' to translate all xml characters at once instead of doing multiple string translation passes. * construct strings inline using writelines instead of doing it through a function, in order to save function call cost --- llsd/serde_xml.py | 348 ++++++++++++++++++++++++++++++++++------------ tests/bench.py | 69 +++++++++ 2 files changed, 325 insertions(+), 92 deletions(-) diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 7dfeaa2..3c57678 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -1,11 +1,13 @@ import base64 +import binascii +from collections import deque import io import re -import types +import uuid from llsd.base import (_LLSD, ALL_CHARS, LLSDBaseParser, LLSDBaseFormatter, XML_HEADER, LLSDParseError, LLSDSerializationError, UnicodeType, - _format_datestr, _str_to_bytes, _to_python, is_unicode) + _format_datestr, _str_to_bytes, is_unicode, PY2, uri, binary, _parse_datestr) from llsd.fastest_elementtree import ElementTreeError, fromstring, parse as _parse INVALID_XML_BYTES = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c'\ @@ -14,7 +16,22 @@ INVALID_XML_RE = re.compile(r'[\x00-\x08\x0b\x0c\x0e-\x1f]') +XML_ESC_TRANS = {} +if not PY2: + XML_ESC_TRANS = str.maketrans({'&': '&', + '<':'<', + '>':'>', + u'\uffff':None, # cannot be parsed + u'\ufffe':None}) # cannot be parsed + + for x in INVALID_XML_BYTES: + XML_ESC_TRANS[x] = None + + def remove_invalid_xml_bytes(b): + """ + Remove characters that aren't allowed in xml. + """ try: # Dropping chars that cannot be parsed later on. The # translate() function was benchmarked to be the fastest way @@ -25,6 +42,24 @@ def remove_invalid_xml_bytes(b): # unit tests) return INVALID_XML_RE.sub('', b) +# only python2, which is not covered by coverage tests +def xml_esc(v): # pragma: no cover + "Escape string or unicode object v for xml output" + + # Use is_unicode() instead of is_string() because in python 2, str is + # bytes, not unicode, and should not be "encode()"d. Attempts to + # encode("utf-8") a bytes type will result in an implicit + # decode("ascii") that will throw a UnicodeDecodeError if the string + # contains non-ascii characters. + if is_unicode(v): + # we need to drop these invalid characters because they + # cannot be parsed (and encode() doesn't drop them for us) + v = v.replace(u'\uffff', u'') + v = v.replace(u'\ufffe', u'') + v = v.encode('utf-8') + v = remove_invalid_xml_bytes(v) + return v.replace(b'&',b'&').replace(b'<',b'<').replace(b'>',b'>') + class LLSDXMLFormatter(LLSDBaseFormatter): """ @@ -37,75 +72,78 @@ class LLSDXMLFormatter(LLSDBaseFormatter): this class since the module level format_xml() is the most convenient interface to this functionality. """ - def _elt(self, name, contents=None): - """ - Serialize a single element. - If 'contents' is omitted, write . - If 'contents' is bytes, write contents. - If 'contents' is str, write contents.encode('utf8'). - """ - if not contents: - self.stream.writelines([b"<", name, b" />"]) - else: - self.stream.writelines([b"<", name, b">", - _str_to_bytes(contents), - b""]) - - def xml_esc(self, v): - "Escape string or unicode object v for xml output" - - # Use is_unicode() instead of is_string() because in python 2, str is - # bytes, not unicode, and should not be "encode()"d. Attempts to - # encode("utf-8") a bytes type will result in an implicit - # decode("ascii") that will throw a UnicodeDecodeError if the string - # contains non-ascii characters. - if is_unicode(v): - # we need to drop these invalid characters because they - # cannot be parsed (and encode() doesn't drop them for us) - v = v.replace(u'\uffff', u'') - v = v.replace(u'\ufffe', u'') - v = v.encode('utf-8') - v = remove_invalid_xml_bytes(v) - return v.replace(b'&',b'&').replace(b'<',b'<').replace(b'>',b'>') + def __init__(self, indent_atom = None): + "Construct a serializer." + # Call the super class constructor so that we have the type map + super(LLSDXMLFormatter, self).__init__() + self._indent_atom = b'' + self._eol = b'' + self._indent_level = 0 + + def _indent(self): + pass def _LLSD(self, v): return self._generate(v.thing) def _UNDEF(self, _v): - return self._elt(b'undef') + self.stream.writelines([b'', self._eol]) def _BOOLEAN(self, v): if v: - return self._elt(b'boolean', b'true') - else: - return self._elt(b'boolean', b'false') + return self.stream.writelines([b'true', self._eol]) + self.stream.writelines([b'false', self._eol]) def _INTEGER(self, v): - return self._elt(b'integer', str(v)) + self.stream.writelines([b'', str(v).encode('utf-8'), b'', self._eol]) def _REAL(self, v): - return self._elt(b'real', repr(v)) + self.stream.writelines([b'', str(v).encode('utf-8'), b'', self._eol]) def _UUID(self, v): if v.int == 0: - return self._elt(b'uuid') - else: - return self._elt(b'uuid', str(v)) + return self.stream.writelines([b'', self._eol]) + self.stream.writelines([b'', str(v).encode('utf-8'), b'', self._eol]) def _BINARY(self, v): - return self._elt(b'binary', base64.b64encode(v).strip()) + self.stream.writelines([b'', base64.b64encode(v).strip(), b'', self._eol]) def _STRING(self, v): - return self._elt(b'string', self.xml_esc(v)) + # We don't simply have a function that encapsulates the PY2 vs PY3 calls, + # as that results in another function call and is slightly less performant + if PY2: # pragma: no cover + return self.stream.writelines([b'', _str_to_bytes(xml_esc(v)), b'', self._eol]) + self.stream.writelines([b'', v.translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) def _URI(self, v): - return self._elt(b'uri', self.xml_esc(str(v))) + # We don't simply have a function that encapsulates the PY2 vs PY3 calls, + # as that results in another function call and is slightly less performant + if PY2: # pragma: no cover + return self.stream.writelines([b'', _str_to_bytes(xml_esc(v)), b'', self._eol]) + self.stream.writelines([b'', str(v).translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) def _DATE(self, v): - return self._elt(b'date', _format_datestr(v)) + self.stream.writelines([b'', _format_datestr(v), b'', self._eol]) def _ARRAY(self, v): - self.stream.write(b'') + self.stream.writelines([b'', self._eol]) + self._indent_level = self._indent_level + 1 for item in v: + self._indent() self._generate(item) - self.stream.write(b'') + self._indent_level = self._indent_level - 1 + self.stream.writelines([b'', self._eol]) def _MAP(self, v): - self.stream.write(b'') + self.stream.writelines([b'', self._eol]) + self._indent_level = self._indent_level + 1 for key, value in v.items(): - self._elt(b'key', self.xml_esc(UnicodeType(key))) + self._indent() + if PY2: # pragma: no cover + self.stream.writelines([b'', + xml_esc(UnicodeType(key)), + b'', + self._eol]) + else: + self.stream.writelines([b'', + UnicodeType(key).translate(XML_ESC_TRANS).encode('utf-8'), + b'', + self._eol]) + self._indent() self._generate(value) - self.stream.write(b'') + self._indent_level = self._indent_level - 1 + self._indent() + self.stream.writelines([b'', self._eol]) def _generate(self, something): "Generate xml from a single python object." @@ -121,11 +159,10 @@ def _generate(self, something): def _write(self, something): """ Serialize a python object to self.stream as application/llsd+xml. - :param something: A python object (typically a dict) to be serialized. """ - self.stream.write(b'' - b'') + self.stream.writelines([b'', self._eol, + b'', self._eol]) self._generate(something) self.stream.write(b'') @@ -154,49 +191,12 @@ def __init__(self, indent_atom = None): self._indent_atom = b' ' else: self._indent_atom = indent_atom + self._eol = b'\n' def _indent(self): "Write an indentation based on the atom and indentation level." self.stream.writelines([self._indent_atom] * self._indent_level) - def _ARRAY(self, v): - "Recursively format an array with pretty turned on." - self.stream.write(b'\n') - self._indent_level += 1 - for item in v: - self._indent() - self._generate(item) - self.stream.write(b'\n') - self._indent_level -= 1 - self._indent() - self.stream.write(b'') - - def _MAP(self, v): - "Recursively format a map with pretty turned on." - self.stream.write(b'\n') - self._indent_level += 1 - # sorted list of keys - for key in sorted(v): - self._indent() - self._elt(b'key', UnicodeType(key)) - self.stream.write(b'\n') - self._indent() - self._generate(v[key]) - self.stream.write(b'\n') - self._indent_level -= 1 - self._indent() - self.stream.write(b'') - - def _write(self, something): - """ - Serialize a python object to self.stream as 'pretty' application/llsd+xml. - - :param something: a python object (typically a dict) to be serialized. - """ - self.stream.write(b'\n') - self._generate(something) - self.stream.write(b'\n') - def format_pretty_xml(something): """ @@ -237,6 +237,168 @@ def write_pretty_xml(stream, something): return LLSDXMLPrettyFormatter().write(stream, something) +class LLSDXMLParser: + def __init__(self): + "Construct an xml node parser." + + self.NODE_HANDLERS = { + "undef": lambda x: None, + "boolean": self._bool_to_python, + "integer": self._int_to_python, + "real": self._real_to_python, + "uuid": self._uuid_to_python, + "string": self._str_to_python, + "binary": self._bin_to_python, + "date": self._date_to_python, + "uri": self._uri_to_python, + "map": self._map_to_python, + "array": self._array_to_python, + } + + self.parse_stack = deque([]) + + def _bool_to_python(self, node): + "Convert boolean node to a python object." + val = node.text or '' + try: + # string value, accept 'true' or 'True' or whatever + return (val.lower() in ('true', '1', '1.0')) + except AttributeError: + # not a string (no lower() method), use normal Python rules + return bool(val) + + def _int_to_python(self, node): + "Convert integer node to a python object." + val = node.text or '' + if not val.strip(): + return 0 + return int(val) + + def _real_to_python(self, node): + "Convert floating point node to a python object." + val = node.text or '' + if not val.strip(): + return 0.0 + return float(val) + + def _uuid_to_python(self, node): + "Convert uuid node to a python object." + if node.text: + return uuid.UUID(hex=node.text) + return uuid.UUID(int=0) + + def _str_to_python(self, node): + "Convert string node to a python object." + return node.text or '' + + def _bin_to_python(self, node): + base = node.get('encoding') or 'base64' + try: + if base == 'base16': + # parse base16 encoded data + return binary(base64.b16decode(node.text or '')) + if base == 'base64': + # parse base64 encoded data + return binary(base64.b64decode(node.text or '')) + raise LLSDParseError("Parser doesn't support %s encoding" % base) + + except binascii.Error as exc: + # convert exception class so it's more catchable + raise LLSDParseError("Encoded binary data: " + str(exc)) + except TypeError as exc: + # convert exception class so it's more catchable + raise LLSDParseError("Bad binary data: " + str(exc)) + + def _date_to_python(self, node): + "Convert date node to a python object." + val = node.text or '' + if not val: + val = "1970-01-01T00:00:00Z" + return _parse_datestr(val) + + def _uri_to_python(self, node): + "Convert uri node to a python object." + val = node.text or '' + return uri(val) + + def _map_to_python(self, node): + "Convert map node to a python object." + new_result = {} + new_stack_entry = [iter(node), node, new_result] + self.parse_stack.appendleft(new_stack_entry) + return new_result + + def _array_to_python(self, node): + "Convert array node to a python object." + new_result = [] + new_stack_entry = [iter(node), node, new_result] + self.parse_stack.appendleft(new_stack_entry) + return new_result + + def parse_node(self, something): + """ + Parse an ElementTree tree + This parser is iterative instead of recursive. It uses + Each element in parse_stack is an iterator into either the list + or the dict in the tree. This limits depth by size of free memory + instead of size of the function call stack, allowing us to render + deeper trees than a recursive model. + :param something: The xml node to parse. + :returns: Returns a python object. + """ + + # if the passed in element is not a map or array, simply return + # its value. Otherwise, create a dict or array to receive + # child/leaf elements. + if something.tag == "map": + cur_result = {} + elif something.tag == "array": + cur_result = [] + else: + if something.tag not in self.NODE_HANDLERS: + raise LLSDParseError("Unknown value type %s" % something.tag) + return self.NODE_HANDLERS[something.tag](something) + + # start by pushing the current element iterator data onto + # the stack + # 0 - iterator indicating the current position in the given level of the tree + # this can be either a list iterator position, or an iterator of + # keys for the dict. + # 1 - the actual element object. + # 2 - the result for this level in the tree, onto which + # children or leafs will be appended/set + self.parse_stack.appendleft([iter(something), something, cur_result]) + while True: + node_iter, iterable, cur_result = self.parse_stack[0] + try: + value = next(node_iter) + + except StopIteration: + node_iter, iterable, cur_result = self.parse_stack.popleft() + if len(self.parse_stack) == 0: + break + else: + if iterable.tag == "map": + if value.tag != "key": + raise LLSDParseError("Expected 'key', got %s" % value.tag) + key = value.text + if key is None: + key = '' + try: + value = next(node_iter) + except StopIteration: + raise LLSDParseError("No value for map item %s" % key) + try: + cur_result[key] = self.NODE_HANDLERS[value.tag](value) + except KeyError as err: + raise LLSDParseError("Unknown value type: " + str(err)) + elif iterable.tag == "array": + try: + cur_result.append(self.NODE_HANDLERS[value.tag](value)) + except KeyError as err: + raise LLSDParseError("Unknown value type: " + str(err)) + return cur_result + def parse_xml(something): """ This is the basic public interface for parsing llsd+xml. @@ -252,6 +414,8 @@ def parse_xml(something): return parse_xml_nohdr(parser) + + def parse_xml_nohdr(baseparser): """ Parse llsd+xml known to be without an header. May still @@ -280,7 +444,7 @@ def parse_xml_nohdr(baseparser): if element.tag != 'llsd': raise LLSDParseError("Invalid XML Declaration") # Extract its contents. - return _to_python(element[0]) + return LLSDXMLParser().parse_node(element[0]) def format_xml(something): diff --git a/tests/bench.py b/tests/bench.py index f907997..707107e 100644 --- a/tests/bench.py +++ b/tests/bench.py @@ -45,6 +45,9 @@ """ _bench_data = llsd.parse_xml(BENCH_DATA_XML) + + + BENCH_DATA_BINARY = llsd.format_binary(_bench_data) BENCH_DATA_NOTATION = llsd.format_notation(_bench_data) @@ -78,6 +81,40 @@ def binary_stream(): f.seek(0) yield f +def build_deep_xml(): + deep_data = {} + curr_data = deep_data + for i in range(250): + curr_data["curr_data"] = {} + curr_data["integer"] = 7 + curr_data["string"] = "string" + curr_data["map"] = { "item1": 2.345, "item2": [1,2,3], "item3": {"item4": llsd.uri("http://foo.bar.com")}} + curr_data = curr_data["curr_data"] + + return deep_data +_deep_bench_data = build_deep_xml() + +def build_wide_xml(): + + wide_xml = b""" +wide_array" +""" + wide_data = {} + for i in range(100000): + wide_data["item"+str(i)] = {"item1":2.345, "item2": [1,2,3], "item3": "string", "item4":{"subitem": llsd.uri("http://foo.bar.com")}} + return wide_data +_wide_bench_data = build_wide_xml() + +def build_wide_array_xml(): + + wide_xml = b""" +wide_array" +""" + wide_data = [] + for i in range(100000): + wide_data.append([2.345,[1,2,3], "string", [llsd.uri("http://foo.bar.com")]]) + return wide_data +_wide_array_bench_data = build_wide_array_xml() def bench_stream(parse, stream): ret = parse(stream) @@ -125,3 +162,35 @@ def test_format_notation(benchmark): def test_format_binary(benchmark): benchmark(llsd.format_binary, _bench_data) + +def test_format_xml_deep(benchmark): + benchmark(llsd.format_xml, _deep_bench_data) + +def test_format_xml_wide(benchmark): + benchmark(llsd.format_xml, _wide_bench_data) + +def test_format_notation_deep(benchmark): + benchmark(llsd.format_notation, _deep_bench_data) + +def test_format_notation_wide(benchmark): + benchmark(llsd.format_notation, _wide_bench_data) + +def test_format_notation_wide_array(benchmark): + benchmark(llsd.format_notation, _wide_array_bench_data) + +def test_format_binary_deep(benchmark): + benchmark(llsd.format_binary, _deep_bench_data) + +def test_format_binary_wide(benchmark): + benchmark(llsd.format_binary, _wide_bench_data) + +def test_format_binary_wide_array(benchmark): + benchmark(llsd.format_binary, _wide_array_bench_data) + +def test_parse_xml_deep(benchmark): + deep_data = llsd.format_xml(_deep_bench_data) + benchmark(llsd.parse_xml, deep_data) + +def test_parse_binary_deep(benchmark): + deep_data = llsd.format_binary(_deep_bench_data) + benchmark(llsd.parse_binary, deep_data) From 7f1b5ae99feea49e24181e63a3807b17d3de559d Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:36:00 +0000 Subject: [PATCH 02/52] Build in python containers, so we can get 2.7 --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8ad9b57..0835c54 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,6 +13,7 @@ jobs: matrix: python-version: ['2.7', '3.7', '3.8', '3.10'] runs-on: [ubuntu-latest] + container: python:${{ matrix.python-version }} env: PYTHON: ${{ matrix.python-version }} steps: From e44367bd1f15beb123e42536f8f98667b5f4ccac Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:37:41 +0000 Subject: [PATCH 03/52] fix syntax error --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0835c54..c450a52 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,7 +13,8 @@ jobs: matrix: python-version: ['2.7', '3.7', '3.8', '3.10'] runs-on: [ubuntu-latest] - container: python:${{ matrix.python-version }} + container: + image: 'python:${{ matrix.python-version }}' env: PYTHON: ${{ matrix.python-version }} steps: From 437db6b78acba7088919bbbdf8888cf16630f6c0 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:42:26 +0000 Subject: [PATCH 04/52] try a different form for containers --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c450a52..18ccddf 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,9 +12,10 @@ jobs: strategy: matrix: python-version: ['2.7', '3.7', '3.8', '3.10'] + container: ["python:2.7", "python:3.7", "python:3.8", "python:3.10"] runs-on: [ubuntu-latest] container: - image: 'python:${{ matrix.python-version }}' + image: ${{ matrix.containert }} env: PYTHON: ${{ matrix.python-version }} steps: From c6ca424f491c65642aff4793679271b32740e909 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:43:16 +0000 Subject: [PATCH 05/52] test --- .github/workflows/ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 18ccddf..017d224 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,8 +14,6 @@ jobs: python-version: ['2.7', '3.7', '3.8', '3.10'] container: ["python:2.7", "python:3.7", "python:3.8", "python:3.10"] runs-on: [ubuntu-latest] - container: - image: ${{ matrix.containert }} env: PYTHON: ${{ matrix.python-version }} steps: From 18dfa775559326d7b9980b35a26192a579d5ae9d Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:44:44 +0000 Subject: [PATCH 06/52] Spacing change --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 017d224..39a376f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,6 +14,8 @@ jobs: python-version: ['2.7', '3.7', '3.8', '3.10'] container: ["python:2.7", "python:3.7", "python:3.8", "python:3.10"] runs-on: [ubuntu-latest] + container: + image: ${{ matrix.containert }} env: PYTHON: ${{ matrix.python-version }} steps: From 2059a06f54fe361a385d0c6939f680583eb5a808 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:45:54 +0000 Subject: [PATCH 07/52] Another fix --- .github/workflows/ci.yaml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 39a376f..d7d697f 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -12,10 +12,9 @@ jobs: strategy: matrix: python-version: ['2.7', '3.7', '3.8', '3.10'] - container: ["python:2.7", "python:3.7", "python:3.8", "python:3.10"] runs-on: [ubuntu-latest] container: - image: ${{ matrix.containert }} + image: "python:${{ matrix.python-version }}" env: PYTHON: ${{ matrix.python-version }} steps: From a7a9ca3043147fc87cc10d8f5af23120ca0d1a5c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:50:49 +0000 Subject: [PATCH 08/52] Sudo pip installs (in container) --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d7d697f..4935fcb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,8 +28,8 @@ jobs: - name: Install python dependencies run: | - pip install wheel build tox - pip install .[dev] + sudo -H pip install wheel build tox + sudo -H pip install .[dev] - name: Determine pyenv id: pyenv From 58ee3480e2ad0131c0f6d0564a488995f8301502 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 18:56:52 +0000 Subject: [PATCH 09/52] upgrade pip --- .github/workflows/ci.yaml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 4935fcb..9cc4cc6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,8 +28,9 @@ jobs: - name: Install python dependencies run: | - sudo -H pip install wheel build tox - sudo -H pip install .[dev] + pip install --upgrade pip + pip install wheel build tox + pip install .[dev] - name: Determine pyenv id: pyenv From a844d052cfe163170c3150d3f80ebd14541c27d6 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:04:02 +0000 Subject: [PATCH 10/52] Update scm version settings --- setup.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/setup.py b/setup.py index db8beb0..2864c11 100644 --- a/setup.py +++ b/setup.py @@ -20,6 +20,9 @@ setup_requires=["setuptools_scm<6"], use_scm_version={ 'local_scheme': 'no-local-version', # disable local-version to allow uploads to test.pypi.org + 'version_scheme': 'post-release', + 'relative_to': __file__, + 'root': '..', }, extras_require={ "dev": ["pytest", "pytest-benchmark", "pytest-cov<3"], From 5c6f3024b640ed19c0a5d4ee617b85b1e62e24bc Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:08:01 +0000 Subject: [PATCH 11/52] Try alpine container --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9cc4cc6..c624081 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ jobs: python-version: ['2.7', '3.7', '3.8', '3.10'] runs-on: [ubuntu-latest] container: - image: "python:${{ matrix.python-version }}" + image: "python:${{ matrix.python-version }}-alpine" env: PYTHON: ${{ matrix.python-version }} steps: From 30808b438124d6dcdd79acf0d92775031213559c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:10:15 +0000 Subject: [PATCH 12/52] Don't upgrade pip --- .github/workflows/ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c624081..1b9b27e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,7 +28,6 @@ jobs: - name: Install python dependencies run: | - pip install --upgrade pip pip install wheel build tox pip install .[dev] From 21b1945f4557e82cef44950ce9b8779f5b0a0ce4 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:16:18 +0000 Subject: [PATCH 13/52] Don't use alpine --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1b9b27e..9cc4cc6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ jobs: python-version: ['2.7', '3.7', '3.8', '3.10'] runs-on: [ubuntu-latest] container: - image: "python:${{ matrix.python-version }}-alpine" + image: "python:${{ matrix.python-version }}" env: PYTHON: ${{ matrix.python-version }} steps: @@ -28,6 +28,7 @@ jobs: - name: Install python dependencies run: | + pip install --upgrade pip pip install wheel build tox pip install .[dev] From f0e00824e24e74d70e91c89431995878d1167f08 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:19:43 +0000 Subject: [PATCH 14/52] Show tags --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9cc4cc6..05eef29 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,6 +28,7 @@ jobs: - name: Install python dependencies run: | + git tag pip install --upgrade pip pip install wheel build tox pip install .[dev] From 67712a26500c97d3bc046cae5be6cc59015dfe12 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:23:11 +0000 Subject: [PATCH 15/52] what user are we running under? --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 05eef29..d03c635 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,6 +28,7 @@ jobs: - name: Install python dependencies run: | + set git tag pip install --upgrade pip pip install wheel build tox From 4c2cfafd97413a7cd64e71596a73933661f36b3c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:28:54 +0000 Subject: [PATCH 16/52] Try sudo --- .github/workflows/ci.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d03c635..0d3cfad 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -28,11 +28,11 @@ jobs: - name: Install python dependencies run: | - set - git tag + apt-get update + apt-get -y install sudo pip install --upgrade pip - pip install wheel build tox - pip install .[dev] + sudo -H pip install wheel build tox + sudo -H pip install .[dev] - name: Determine pyenv id: pyenv From ab0c5f67402e8e637f77ad021e8d5d4c502499ce Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:31:12 +0000 Subject: [PATCH 17/52] Do we have a .git --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0d3cfad..b71ff21 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -32,6 +32,7 @@ jobs: apt-get -y install sudo pip install --upgrade pip sudo -H pip install wheel build tox + ls -la sudo -H pip install .[dev] - name: Determine pyenv From 0f8cb0ed5ba2f65afbe5fc4801320e9ad36e40a9 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:32:50 +0000 Subject: [PATCH 18/52] Possibly don't need action to install python --- .github/workflows/ci.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b71ff21..afe34dd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,10 +22,6 @@ jobs: with: fetch-depth: 0 # fetch all history for setuptools_scm to be able to read tags - - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - name: Install python dependencies run: | apt-get update From 466bd570c5a230d2886b1836396fc690230685f0 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:34:10 +0000 Subject: [PATCH 19/52] show tags --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index afe34dd..0798d13 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,6 +27,7 @@ jobs: apt-get update apt-get -y install sudo pip install --upgrade pip + sudo git tag sudo -H pip install wheel build tox ls -la sudo -H pip install .[dev] From 95671ab31f6523b4a44fa32b5da51d90f9b77348 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:36:24 +0000 Subject: [PATCH 20/52] mark directory as safe --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0798d13..cf9f345 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,6 +27,7 @@ jobs: apt-get update apt-get -y install sudo pip install --upgrade pip + git config --global --add safe.directory . sudo git tag sudo -H pip install wheel build tox ls -la From e201ac4fdc71efb57c246980ec1118250e3931de Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:38:02 +0000 Subject: [PATCH 21/52] try direct safe directory --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cf9f345..7d96700 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,8 +26,8 @@ jobs: run: | apt-get update apt-get -y install sudo + git config --global --add safe.directory /__w/python-llsd/python-llsd pip install --upgrade pip - git config --global --add safe.directory . sudo git tag sudo -H pip install wheel build tox ls -la From b573bf8b91dd6c5aa870675666c1f434048c9440 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:42:50 +0000 Subject: [PATCH 22/52] Make all directories safe --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7d96700..f5d953c 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,7 +26,7 @@ jobs: run: | apt-get update apt-get -y install sudo - git config --global --add safe.directory /__w/python-llsd/python-llsd + git config --global --add safe.directory '*' pip install --upgrade pip sudo git tag sudo -H pip install wheel build tox From fc959dcd2ddf3212437b77cde2f64c97533fa2ba Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:50:30 +0000 Subject: [PATCH 23/52] more diagnostics --- .github/workflows/ci.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f5d953c..3788113 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,7 +26,10 @@ jobs: run: | apt-get update apt-get -y install sudo + echo "MARKING DIRECTORIES AS SAFE" git config --global --add safe.directory '*' + echo "DONE MARKING DIRECTORIES AS SAFE" + ls -la /home pip install --upgrade pip sudo git tag sudo -H pip install wheel build tox From f288dc615071e78f5d00766d6aebe9d11f10755c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:54:06 +0000 Subject: [PATCH 24/52] more diagnostics --- .github/workflows/ci.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 3788113..93c26eb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,8 +30,9 @@ jobs: git config --global --add safe.directory '*' echo "DONE MARKING DIRECTORIES AS SAFE" ls -la /home + echo $USER pip install --upgrade pip - sudo git tag + sudo -H git tag sudo -H pip install wheel build tox ls -la sudo -H pip install .[dev] From d01b6adfb50c64dc046fab9d06e3361aec4776d3 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 19:56:05 +0000 Subject: [PATCH 25/52] show current user --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 93c26eb..ba5b389 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -30,7 +30,7 @@ jobs: git config --global --add safe.directory '*' echo "DONE MARKING DIRECTORIES AS SAFE" ls -la /home - echo $USER + who pip install --upgrade pip sudo -H git tag sudo -H pip install wheel build tox From 308045d4bcb46350c6a6d47422adf5636bf631ed Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:02:45 +0000 Subject: [PATCH 26/52] Try buster --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ba5b389..389d520 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,7 +14,7 @@ jobs: python-version: ['2.7', '3.7', '3.8', '3.10'] runs-on: [ubuntu-latest] container: - image: "python:${{ matrix.python-version }}" + image: "python:${{ matrix.python-version }}-buster" env: PYTHON: ${{ matrix.python-version }} steps: From 8bf587e6a8872b2773a5f6f6a989cf44c3835ce5 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:10:10 +0000 Subject: [PATCH 27/52] try venv --- .github/workflows/ci.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 389d520..e0e267a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,6 +26,8 @@ jobs: run: | apt-get update apt-get -y install sudo + python -m venv /tmp/venv + source /tmp/venv/bin/activate echo "MARKING DIRECTORIES AS SAFE" git config --global --add safe.directory '*' echo "DONE MARKING DIRECTORIES AS SAFE" From b8745bbd58425bf5e1dc837994af5f0ce037d839 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:11:52 +0000 Subject: [PATCH 28/52] be more assertive --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e0e267a..5575e81 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,8 +26,8 @@ jobs: run: | apt-get update apt-get -y install sudo - python -m venv /tmp/venv - source /tmp/venv/bin/activate + sudo python -m venv /tmp/venv + sudo source /tmp/venv/bin/activate echo "MARKING DIRECTORIES AS SAFE" git config --global --add safe.directory '*' echo "DONE MARKING DIRECTORIES AS SAFE" From 91431ae6f3fe1a7b7382136e035d4993a5506330 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:14:45 +0000 Subject: [PATCH 29/52] Try again --- .github/workflows/ci.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5575e81..c9eff45 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,13 +26,11 @@ jobs: run: | apt-get update apt-get -y install sudo - sudo python -m venv /tmp/venv - sudo source /tmp/venv/bin/activate - echo "MARKING DIRECTORIES AS SAFE" - git config --global --add safe.directory '*' - echo "DONE MARKING DIRECTORIES AS SAFE" + python -m venv /tmp/venv + source /tmp/venv/bin/activate + echo "VIRTUAL ENV: $VIRTUAL_ENV" ls -la /home - who + set pip install --upgrade pip sudo -H git tag sudo -H pip install wheel build tox From 5be2d148f63a0ef8dd7d667c12786b99e9dbc540 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:16:57 +0000 Subject: [PATCH 30/52] venv didn't work --- .github/workflows/ci.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c9eff45..92cfd71 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,9 +26,6 @@ jobs: run: | apt-get update apt-get -y install sudo - python -m venv /tmp/venv - source /tmp/venv/bin/activate - echo "VIRTUAL ENV: $VIRTUAL_ENV" ls -la /home set pip install --upgrade pip From f15fa8ecd82c339dc8905281d9e9c0df1cd35454 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:20:54 +0000 Subject: [PATCH 31/52] show directory --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 92cfd71..9f41e5d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,10 +26,10 @@ jobs: run: | apt-get update apt-get -y install sudo - ls -la /home + ls -la set pip install --upgrade pip - sudo -H git tag + git tag sudo -H pip install wheel build tox ls -la sudo -H pip install .[dev] From 289459c8381bf514770d6c4d06fe09b2064bdbf0 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:25:56 +0000 Subject: [PATCH 32/52] make root of git user root --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9f41e5d..79a0691 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,6 +29,7 @@ jobs: ls -la set pip install --upgrade pip + sudo chown . root git tag sudo -H pip install wheel build tox ls -la From c5ea1f38f9400f815fde09c1ba224ce795472279 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:27:22 +0000 Subject: [PATCH 33/52] oopse --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 79a0691..dcc997a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -29,7 +29,7 @@ jobs: ls -la set pip install --upgrade pip - sudo chown . root + sudo chown root . git tag sudo -H pip install wheel build tox ls -la From d3c22a3e342fe60d1a0d0def9a0f604621ddb5cb Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:29:21 +0000 Subject: [PATCH 34/52] more diagnostics --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dcc997a..8f8a7a0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -31,6 +31,7 @@ jobs: pip install --upgrade pip sudo chown root . git tag + git status sudo -H pip install wheel build tox ls -la sudo -H pip install .[dev] From c6e1e8cb0009ec5656859127e26197f7c5745ade Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:49:25 +0000 Subject: [PATCH 35/52] fixup setup --- setup.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/setup.py b/setup.py index 2864c11..db8beb0 100644 --- a/setup.py +++ b/setup.py @@ -20,9 +20,6 @@ setup_requires=["setuptools_scm<6"], use_scm_version={ 'local_scheme': 'no-local-version', # disable local-version to allow uploads to test.pypi.org - 'version_scheme': 'post-release', - 'relative_to': __file__, - 'root': '..', }, extras_require={ "dev": ["pytest", "pytest-benchmark", "pytest-cov<3"], From 1994a95e2e112b06b68d5c0a0ffb6ed0e1dbfb10 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 20:54:19 +0000 Subject: [PATCH 36/52] cleanup --- .github/workflows/ci.yaml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8f8a7a0..acaa97b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,14 +26,9 @@ jobs: run: | apt-get update apt-get -y install sudo - ls -la - set pip install --upgrade pip sudo chown root . - git tag - git status sudo -H pip install wheel build tox - ls -la sudo -H pip install .[dev] - name: Determine pyenv From 00a4c7da9f54d7b4f4aebd1bc5430f15c20ae98c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Wed, 28 Jun 2023 21:08:49 +0000 Subject: [PATCH 37/52] Remove iterative xml parsing --- llsd/serde_xml.py | 171 +--------------------------------------------- 1 file changed, 2 insertions(+), 169 deletions(-) diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 3c57678..62c9fa6 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -1,13 +1,10 @@ import base64 -import binascii -from collections import deque import io import re -import uuid from llsd.base import (_LLSD, ALL_CHARS, LLSDBaseParser, LLSDBaseFormatter, XML_HEADER, LLSDParseError, LLSDSerializationError, UnicodeType, - _format_datestr, _str_to_bytes, is_unicode, PY2, uri, binary, _parse_datestr) + _format_datestr, _str_to_bytes, _to_python, is_unicode, PY2) from llsd.fastest_elementtree import ElementTreeError, fromstring, parse as _parse INVALID_XML_BYTES = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c'\ @@ -237,168 +234,6 @@ def write_pretty_xml(stream, something): return LLSDXMLPrettyFormatter().write(stream, something) -class LLSDXMLParser: - def __init__(self): - "Construct an xml node parser." - - self.NODE_HANDLERS = { - "undef": lambda x: None, - "boolean": self._bool_to_python, - "integer": self._int_to_python, - "real": self._real_to_python, - "uuid": self._uuid_to_python, - "string": self._str_to_python, - "binary": self._bin_to_python, - "date": self._date_to_python, - "uri": self._uri_to_python, - "map": self._map_to_python, - "array": self._array_to_python, - } - - self.parse_stack = deque([]) - - def _bool_to_python(self, node): - "Convert boolean node to a python object." - val = node.text or '' - try: - # string value, accept 'true' or 'True' or whatever - return (val.lower() in ('true', '1', '1.0')) - except AttributeError: - # not a string (no lower() method), use normal Python rules - return bool(val) - - def _int_to_python(self, node): - "Convert integer node to a python object." - val = node.text or '' - if not val.strip(): - return 0 - return int(val) - - def _real_to_python(self, node): - "Convert floating point node to a python object." - val = node.text or '' - if not val.strip(): - return 0.0 - return float(val) - - def _uuid_to_python(self, node): - "Convert uuid node to a python object." - if node.text: - return uuid.UUID(hex=node.text) - return uuid.UUID(int=0) - - def _str_to_python(self, node): - "Convert string node to a python object." - return node.text or '' - - def _bin_to_python(self, node): - base = node.get('encoding') or 'base64' - try: - if base == 'base16': - # parse base16 encoded data - return binary(base64.b16decode(node.text or '')) - if base == 'base64': - # parse base64 encoded data - return binary(base64.b64decode(node.text or '')) - raise LLSDParseError("Parser doesn't support %s encoding" % base) - - except binascii.Error as exc: - # convert exception class so it's more catchable - raise LLSDParseError("Encoded binary data: " + str(exc)) - except TypeError as exc: - # convert exception class so it's more catchable - raise LLSDParseError("Bad binary data: " + str(exc)) - - def _date_to_python(self, node): - "Convert date node to a python object." - val = node.text or '' - if not val: - val = "1970-01-01T00:00:00Z" - return _parse_datestr(val) - - def _uri_to_python(self, node): - "Convert uri node to a python object." - val = node.text or '' - return uri(val) - - def _map_to_python(self, node): - "Convert map node to a python object." - new_result = {} - new_stack_entry = [iter(node), node, new_result] - self.parse_stack.appendleft(new_stack_entry) - return new_result - - def _array_to_python(self, node): - "Convert array node to a python object." - new_result = [] - new_stack_entry = [iter(node), node, new_result] - self.parse_stack.appendleft(new_stack_entry) - return new_result - - def parse_node(self, something): - """ - Parse an ElementTree tree - This parser is iterative instead of recursive. It uses - Each element in parse_stack is an iterator into either the list - or the dict in the tree. This limits depth by size of free memory - instead of size of the function call stack, allowing us to render - deeper trees than a recursive model. - :param something: The xml node to parse. - :returns: Returns a python object. - """ - - # if the passed in element is not a map or array, simply return - # its value. Otherwise, create a dict or array to receive - # child/leaf elements. - if something.tag == "map": - cur_result = {} - elif something.tag == "array": - cur_result = [] - else: - if something.tag not in self.NODE_HANDLERS: - raise LLSDParseError("Unknown value type %s" % something.tag) - return self.NODE_HANDLERS[something.tag](something) - - # start by pushing the current element iterator data onto - # the stack - # 0 - iterator indicating the current position in the given level of the tree - # this can be either a list iterator position, or an iterator of - # keys for the dict. - # 1 - the actual element object. - # 2 - the result for this level in the tree, onto which - # children or leafs will be appended/set - self.parse_stack.appendleft([iter(something), something, cur_result]) - while True: - node_iter, iterable, cur_result = self.parse_stack[0] - try: - value = next(node_iter) - - except StopIteration: - node_iter, iterable, cur_result = self.parse_stack.popleft() - if len(self.parse_stack) == 0: - break - else: - if iterable.tag == "map": - if value.tag != "key": - raise LLSDParseError("Expected 'key', got %s" % value.tag) - key = value.text - if key is None: - key = '' - try: - value = next(node_iter) - except StopIteration: - raise LLSDParseError("No value for map item %s" % key) - try: - cur_result[key] = self.NODE_HANDLERS[value.tag](value) - except KeyError as err: - raise LLSDParseError("Unknown value type: " + str(err)) - elif iterable.tag == "array": - try: - cur_result.append(self.NODE_HANDLERS[value.tag](value)) - except KeyError as err: - raise LLSDParseError("Unknown value type: " + str(err)) - return cur_result - def parse_xml(something): """ This is the basic public interface for parsing llsd+xml. @@ -414,8 +249,6 @@ def parse_xml(something): return parse_xml_nohdr(parser) - - def parse_xml_nohdr(baseparser): """ Parse llsd+xml known to be without an header. May still @@ -444,7 +277,7 @@ def parse_xml_nohdr(baseparser): if element.tag != 'llsd': raise LLSDParseError("Invalid XML Declaration") # Extract its contents. - return LLSDXMLParser().parse_node(element[0]) + return _to_python(element[0]) def format_xml(something): From 95584f6592691fbdfff393d76b4eff6cdbd98dde Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Thu, 29 Jun 2023 21:23:09 +0000 Subject: [PATCH 38/52] Improve test code coverage --- llsd/serde_xml.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 62c9fa6..7e4b0dc 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -177,17 +177,14 @@ class LLSDXMLPrettyFormatter(LLSDXMLFormatter): This class is not necessarily suited for serializing very large objects. It sorts on dict (llsd map) keys alphabetically to ease human reading. """ - def __init__(self, indent_atom = None): + def __init__(self, indent_atom = b' '): "Construct a pretty serializer." # Call the super class constructor so that we have the type map super(LLSDXMLPrettyFormatter, self).__init__() # Private data used for indentation. self._indent_level = 1 - if indent_atom is None: - self._indent_atom = b' ' - else: - self._indent_atom = indent_atom + self._indent_atom = indent_atom self._eol = b'\n' def _indent(self): From e00171d7bc03f043cff1da3508580119d9272bd8 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Fri, 7 Jul 2023 17:55:04 +0000 Subject: [PATCH 39/52] SL-19707 throw an error if we exceed 200 depth in formatting or parsing --- llsd/base.py | 2 +- llsd/serde_binary.py | 23 +++++++------ llsd/serde_notation.py | 14 +++++++- llsd/serde_xml.py | 18 +++++----- tests/bench.py | 2 +- tests/llsd_test.py | 74 ++++++++++++++++++++++++++++++++++-------- 6 files changed, 97 insertions(+), 36 deletions(-) diff --git a/llsd/base.py b/llsd/base.py index cbeab54..3d0c4f8 100644 --- a/llsd/base.py +++ b/llsd/base.py @@ -31,7 +31,7 @@ ALL_CHARS = str(bytearray(range(256))) if PY2 else bytes(range(256)) - +MAX_FORMAT_DEPTH = 200 class _LLSD: __metaclass__ = abc.ABCMeta diff --git a/llsd/serde_binary.py b/llsd/serde_binary.py index 6f0d93e..54f45c8 100644 --- a/llsd/serde_binary.py +++ b/llsd/serde_binary.py @@ -5,7 +5,7 @@ import uuid from llsd.base import (_LLSD, LLSDBaseParser, LLSDSerializationError, BINARY_HEADER, - _str_to_bytes, binary, is_integer, is_string, uri) + MAX_FORMAT_DEPTH,_str_to_bytes, binary, is_integer, is_string, uri) try: @@ -15,7 +15,6 @@ # Python 3: 'range()' is already lazy pass - class LLSDBinaryParser(LLSDBaseParser): """ Parse application/llsd+binary to a python object. @@ -164,15 +163,19 @@ def format_binary(something): def write_binary(stream, something): stream.write(b'\n') - _write_binary_recurse(stream, something) + _write_binary_recurse(stream, something, 0) -def _write_binary_recurse(stream, something): +def _write_binary_recurse(stream, something, depth): "Binary formatter workhorse." + + if depth > MAX_FORMAT_DEPTH: + raise LLSDSerializationError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) + if something is None: stream.write(b'!') elif isinstance(something, _LLSD): - _write_binary_recurse(stream, something.thing) + _write_binary_recurse(stream, something.thing, depth) elif isinstance(something, bool): stream.write(b'1' if something else b'0') elif is_integer(something): @@ -202,27 +205,27 @@ def _write_binary_recurse(stream, something): seconds_since_epoch = calendar.timegm(something.timetuple()) stream.writelines([b'd', struct.pack(' MAX_FORMAT_DEPTH: + raise LLSDSerializationError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) + t = type(something) handler = self.type_map.get(t) if handler: diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 7e4b0dc..63b342a 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -3,7 +3,7 @@ import re from llsd.base import (_LLSD, ALL_CHARS, LLSDBaseParser, LLSDBaseFormatter, XML_HEADER, - LLSDParseError, LLSDSerializationError, UnicodeType, + MAX_FORMAT_DEPTH, LLSDParseError, LLSDSerializationError, UnicodeType, _format_datestr, _str_to_bytes, _to_python, is_unicode, PY2) from llsd.fastest_elementtree import ElementTreeError, fromstring, parse as _parse @@ -24,7 +24,6 @@ for x in INVALID_XML_BYTES: XML_ESC_TRANS[x] = None - def remove_invalid_xml_bytes(b): """ Remove characters that aren't allowed in xml. @@ -76,7 +75,7 @@ def __init__(self, indent_atom = None): super(LLSDXMLFormatter, self).__init__() self._indent_atom = b'' self._eol = b'' - self._indent_level = 0 + self._depth = 1 def _indent(self): pass @@ -115,15 +114,15 @@ def _DATE(self, v): self.stream.writelines([b'', _format_datestr(v), b'', self._eol]) def _ARRAY(self, v): self.stream.writelines([b'', self._eol]) - self._indent_level = self._indent_level + 1 + self._depth = self._depth + 1 for item in v: self._indent() self._generate(item) - self._indent_level = self._indent_level - 1 + self._depth = self._depth - 1 self.stream.writelines([b'', self._eol]) def _MAP(self, v): self.stream.writelines([b'', self._eol]) - self._indent_level = self._indent_level + 1 + self._depth = self._depth + 1 for key, value in v.items(): self._indent() if PY2: # pragma: no cover @@ -138,12 +137,14 @@ def _MAP(self, v): self._eol]) self._indent() self._generate(value) - self._indent_level = self._indent_level - 1 + self._depth = self._depth - 1 self._indent() self.stream.writelines([b'', self._eol]) def _generate(self, something): "Generate xml from a single python object." + if self._depth - 1 > MAX_FORMAT_DEPTH: + raise LLSDSerializationError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) t = type(something) if t in self.type_map: return self.type_map[t](something) @@ -183,13 +184,12 @@ def __init__(self, indent_atom = b' '): super(LLSDXMLPrettyFormatter, self).__init__() # Private data used for indentation. - self._indent_level = 1 self._indent_atom = indent_atom self._eol = b'\n' def _indent(self): "Write an indentation based on the atom and indentation level." - self.stream.writelines([self._indent_atom] * self._indent_level) + self.stream.writelines([self._indent_atom] * self._depth) def format_pretty_xml(something): diff --git a/tests/bench.py b/tests/bench.py index 707107e..722e67b 100644 --- a/tests/bench.py +++ b/tests/bench.py @@ -84,7 +84,7 @@ def binary_stream(): def build_deep_xml(): deep_data = {} curr_data = deep_data - for i in range(250): + for i in range(198): curr_data["curr_data"] = {} curr_data["integer"] = 7 curr_data["string"] = "string" diff --git a/tests/llsd_test.py b/tests/llsd_test.py index 46f64fe..3c5d364 100644 --- a/tests/llsd_test.py +++ b/tests/llsd_test.py @@ -527,6 +527,26 @@ def testParseNotationHalfTruncatedHex(self): def testParseNotationInvalidHex(self): self.assertRaises(llsd.LLSDParseError, self.llsd.parse, b"'\\xzz'") + def testDeepMap(self): + """ + Test formatting of a deeply nested map + """ + + test_map = {"foo":"bar", "depth":0} + max_depth = 199 + for depth in range(max_depth): + test_map = {"foo":"bar", "depth":depth, "next":test_map} + + # this should not throw an exception. + test_notation_out = self.llsd.as_notation(test_map) + + test_notation_parsed = self.llsd.parse(io.BytesIO(test_notation_out)) + self.assertEqual(test_map, test_notation_parsed) + + test_map = {"foo":"bar", "depth":depth, "next":test_map} + # this should throw an exception. + self.assertRaises(llsd.LLSDSerializationError, self.llsd.as_notation, test_map) + class LLSDBinaryUnitTest(unittest.TestCase): """ @@ -964,6 +984,26 @@ def testParseDelimitedString(self): self.assertEqual('\t\x07\x08\x0c\n\r\t\x0b\x0fp', llsd.parse(delimited_string)) + def testDeepMap(self): + """ + Test formatting of a deeply nested map + """ + + test_map = {"foo":"bar", "depth":0} + max_depth = 199 + for depth in range(max_depth): + test_map = {"foo":"bar", "depth":depth, "next":test_map} + + # this should not throw an exception. + test_binary_out = self.llsd.as_binary(test_map) + + test_binary_parsed = self.llsd.parse(io.BytesIO(test_binary_out)) + self.assertEqual(test_map, test_binary_parsed) + + test_map = {"foo":"bar", "depth":depth, "next":test_map} + # this should throw an exception. + self.assertRaises(llsd.LLSDSerializationError, self.llsd.as_binary, test_map) + class LLSDPythonXMLUnitTest(unittest.TestCase): @@ -1345,20 +1385,6 @@ def testMap(self): map_within_map_xml) self.assertXMLRoundtrip({}, blank_map_xml) - def testDeepMap(self): - """ - Test that formatting a deeply nested map does not cause a RecursionError - """ - - test_map = {"foo":"bar", "depth":0, "next":None} - max_depth = 200 - for depth in range(max_depth): - test_map = {"foo":"bar", "depth":depth, "next":test_map} - - # this should not throw an exception. - test_xml = self.llsd.as_xml(test_map) - - def testBinary(self): """ Test the parse and serialization of input type : binary. @@ -1493,6 +1519,26 @@ def testFormatPrettyXML(self): self.assertEqual(result[result.find(b"?>") + 2: len(result)], format_xml_result[format_xml_result.find(b"?>") + 2: len(format_xml_result)]) + def testDeepMap(self): + """ + Test formatting of a deeply nested map + """ + + test_map = {"foo":"bar", "depth":0} + max_depth = 199 + for depth in range(max_depth): + test_map = {"foo":"bar", "depth":depth, "next":test_map} + + # this should not throw an exception. + test_xml_out = self.llsd.as_xml(test_map) + + test_xml_parsed = self.llsd.parse(io.BytesIO(test_xml_out)) + self.assertEqual(test_map, test_xml_parsed) + + test_map = {"foo":"bar", "depth":depth, "next":test_map} + # this should throw an exception. + self.assertRaises(llsd.LLSDSerializationError, self.llsd.as_xml, test_map) + def testLLSDSerializationFailure(self): """ Test serialization function as_xml with an object of non-supported type. From 78601c000c515a4ccb318122cc0b4e560452152a Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Fri, 7 Jul 2023 19:00:51 +0000 Subject: [PATCH 40/52] SL-19707 - maximum parse depth is now 200 --- llsd/base.py | 37 +++++++++++++++++++++---------------- llsd/serde_binary.py | 12 ++++++++++-- llsd/serde_notation.py | 10 ++++++++-- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/llsd/base.py b/llsd/base.py index 3d0c4f8..4288068 100644 --- a/llsd/base.py +++ b/llsd/base.py @@ -32,6 +32,8 @@ ALL_CHARS = str(bytearray(range(256))) if PY2 else bytes(range(256)) MAX_FORMAT_DEPTH = 200 +MAX_PARSE_DEPTH = 200 + class _LLSD: __metaclass__ = abc.ABCMeta @@ -209,7 +211,7 @@ def _parse_datestr(datestr): return datetime.datetime(year, month, day, hour, minute, second, usec) -def _bool_to_python(node): +def _bool_to_python(node, depth=0): "Convert boolean node to a python object." val = node.text or '' try: @@ -220,7 +222,7 @@ def _bool_to_python(node): return bool(val) -def _int_to_python(node): +def _int_to_python(node, depth=0): "Convert integer node to a python object." val = node.text or '' if not val.strip(): @@ -228,7 +230,7 @@ def _int_to_python(node): return int(val) -def _real_to_python(node): +def _real_to_python(node, depth=0): "Convert floating point node to a python object." val = node.text or '' if not val.strip(): @@ -236,19 +238,19 @@ def _real_to_python(node): return float(val) -def _uuid_to_python(node): +def _uuid_to_python(node, depth=0): "Convert uuid node to a python object." if node.text: return uuid.UUID(hex=node.text) return uuid.UUID(int=0) -def _str_to_python(node): +def _str_to_python(node, depth=0): "Convert string node to a python object." return node.text or '' -def _bin_to_python(node): +def _bin_to_python(node, depth=0): base = node.get('encoding') or 'base64' try: if base == 'base16': @@ -267,7 +269,7 @@ def _bin_to_python(node): return LLSDParseError("Bad binary data: " + str(exc)) -def _date_to_python(node): +def _date_to_python(node, depth=0): "Convert date node to a python object." val = node.text or '' if not val: @@ -275,30 +277,30 @@ def _date_to_python(node): return _parse_datestr(val) -def _uri_to_python(node): +def _uri_to_python(node, depth=0): "Convert uri node to a python object." val = node.text or '' return uri(val) -def _map_to_python(node): +def _map_to_python(node, depth=0): "Convert map node to a python object." result = {} for index in range(len(node))[::2]: if node[index].text is None: - result[''] = _to_python(node[index+1]) + result[''] = _to_python(node[index+1], depth+1) else: - result[node[index].text] = _to_python(node[index+1]) + result[node[index].text] = _to_python(node[index+1], depth+1) return result -def _array_to_python(node): +def _array_to_python(node, depth=0): "Convert array node to a python object." - return [_to_python(child) for child in node] + return [_to_python(child, depth+1) for child in node] NODE_HANDLERS = dict( - undef=lambda x: None, + undef=lambda x,y: None, boolean=_bool_to_python, integer=_int_to_python, real=_real_to_python, @@ -312,9 +314,12 @@ def _array_to_python(node): ) -def _to_python(node): +def _to_python(node, depth=0): "Convert node to a python object." - return NODE_HANDLERS[node.tag](node) + if depth > MAX_PARSE_DEPTH: + raise LLSDParseError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) + + return NODE_HANDLERS[node.tag](node, depth) class LLSDBaseFormatter(object): diff --git a/llsd/serde_binary.py b/llsd/serde_binary.py index 54f45c8..9e1c076 100644 --- a/llsd/serde_binary.py +++ b/llsd/serde_binary.py @@ -5,7 +5,7 @@ import uuid from llsd.base import (_LLSD, LLSDBaseParser, LLSDSerializationError, BINARY_HEADER, - MAX_FORMAT_DEPTH,_str_to_bytes, binary, is_integer, is_string, uri) + MAX_FORMAT_DEPTH, MAX_PARSE_DEPTH, _str_to_bytes, binary, is_integer, is_string, uri) try: @@ -21,7 +21,7 @@ class LLSDBinaryParser(LLSDBaseParser): See http://wiki.secondlife.com/wiki/LLSD#Binary_Serialization """ - __slots__ = ['_dispatch', '_keep_binary'] + __slots__ = ['_dispatch', '_keep_binary', '_depth'] def __init__(self): super(LLSDBinaryParser, self).__init__() @@ -62,6 +62,7 @@ def __init__(self): # entries in _dispatch. for c, func in _dispatch_dict.items(): self._dispatch[ord(c)] = func + self._depth = 0 def parse(self, something, ignore_binary = False): """ @@ -81,6 +82,9 @@ def parse(self, something, ignore_binary = False): def _parse(self): "The actual parser which is called recursively when necessary." + if self._depth > MAX_PARSE_DEPTH: + self._error("Parse depth exceeded max.") + cc = self._getc() try: func = self._dispatch[ord(cc)] @@ -96,6 +100,7 @@ def _parse_map(self): count = 0 cc = self._getc() key = b'' + self._depth = self._depth + 1 while (cc != b'}') and (count < size): if cc == b'k': key = self._parse_string() @@ -109,16 +114,19 @@ def _parse_map(self): cc = self._getc() if cc != b'}': self._error("invalid map close token") + self._depth = self._depth - 1 return rv def _parse_array(self): "Parse a single llsd array" rv = [] + self._depth = self._depth + 1 size = struct.unpack("!i", self._getc(4))[0] for count in range(size): rv.append(self._parse()) if self._getc() != b']': self._error("invalid array close token") + self._depth = self._depth - 1 return rv def _parse_string(self): diff --git a/llsd/serde_notation.py b/llsd/serde_notation.py index 22c3422..38a847c 100644 --- a/llsd/serde_notation.py +++ b/llsd/serde_notation.py @@ -4,7 +4,7 @@ import uuid from llsd.base import (_LLSD, B, LLSDBaseFormatter, LLSDBaseParser, NOTATION_HEADER, - MAX_FORMAT_DEPTH, LLSDParseError, LLSDSerializationError, UnicodeType, + MAX_FORMAT_DEPTH, MAX_PARSE_DEPTH, LLSDParseError, LLSDSerializationError, UnicodeType, _format_datestr, _parse_datestr, _str_to_bytes, binary, uri) @@ -70,6 +70,7 @@ def __init__(self): # Then fill in specific entries based on the dict above. for c, func in _dispatch_dict.items(): self._dispatch[ord(c)] = func + self._depth = 0 def parse(self, something, ignore_binary = False): """ @@ -107,6 +108,8 @@ def _get_until(self, delim): def _parse(self, cc): "The notation parser workhorse." + if self._depth > MAX_PARSE_DEPTH: + self._error("Parse depth exceeded max.") try: func = self._dispatch[ord(cc)] except IndexError: @@ -182,6 +185,7 @@ def _parse_map(self, cc): rv = {} key = b'' found_key = False + self._depth = self._depth + 1 # skip the beginning '{' cc = self._getc() while (cc != b'}'): @@ -207,6 +211,7 @@ def _parse_map(self, cc): else: self._error("missing separator") cc = self._getc() + self._depth = self._depth - 1 return rv @@ -217,6 +222,7 @@ def _parse_array(self, cc): array: [ object, object, object ] """ rv = [] + self._depth = self._depth + 1 # skip the beginning '[' cc = self._getc() while (cc != b']'): @@ -227,7 +233,7 @@ def _parse_array(self, cc): continue rv.append(self._parse(cc)) cc = self._getc() - + self._depth = self._depth - 1 return rv def _parse_uuid(self, cc): From 65863088f9fb2238f63e0b3e933eed8a3f047a1c Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Fri, 18 Aug 2023 17:20:00 +0000 Subject: [PATCH 41/52] CR changes --- llsd/base.py | 2 +- llsd/serde_binary.py | 6 +++--- llsd/serde_notation.py | 2 +- llsd/serde_xml.py | 14 +++++--------- tests/llsd_test.py | 8 ++++---- 5 files changed, 14 insertions(+), 18 deletions(-) diff --git a/llsd/base.py b/llsd/base.py index 4288068..71040d2 100644 --- a/llsd/base.py +++ b/llsd/base.py @@ -317,7 +317,7 @@ def _array_to_python(node, depth=0): def _to_python(node, depth=0): "Convert node to a python object." if depth > MAX_PARSE_DEPTH: - raise LLSDParseError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) + raise LLSDSerializationError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) return NODE_HANDLERS[node.tag](node, depth) diff --git a/llsd/serde_binary.py b/llsd/serde_binary.py index 9e1c076..1a4ce48 100644 --- a/llsd/serde_binary.py +++ b/llsd/serde_binary.py @@ -83,7 +83,7 @@ def parse(self, something, ignore_binary = False): def _parse(self): "The actual parser which is called recursively when necessary." if self._depth > MAX_PARSE_DEPTH: - self._error("Parse depth exceeded max.") + self._error("Parse depth exceeded maximum depth of %d." % MAX_PARSE_DEPTH) cc = self._getc() try: @@ -100,7 +100,7 @@ def _parse_map(self): count = 0 cc = self._getc() key = b'' - self._depth = self._depth + 1 + self._depth += 1 while (cc != b'}') and (count < size): if cc == b'k': key = self._parse_string() @@ -114,7 +114,7 @@ def _parse_map(self): cc = self._getc() if cc != b'}': self._error("invalid map close token") - self._depth = self._depth - 1 + self._depth -= 1 return rv def _parse_array(self): diff --git a/llsd/serde_notation.py b/llsd/serde_notation.py index 38a847c..bf522e4 100644 --- a/llsd/serde_notation.py +++ b/llsd/serde_notation.py @@ -109,7 +109,7 @@ def _get_until(self, delim): def _parse(self, cc): "The notation parser workhorse." if self._depth > MAX_PARSE_DEPTH: - self._error("Parse depth exceeded max.") + self._error("Parse depth exceeded max of %d" % MAX_PARSE_DEPTH) try: func = self._dispatch[ord(cc)] except IndexError: diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 63b342a..7ec45cf 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -69,12 +69,12 @@ class LLSDXMLFormatter(LLSDBaseFormatter): interface to this functionality. """ - def __init__(self, indent_atom = None): + def __init__(self, indent_atom = b'', eol = b''): "Construct a serializer." # Call the super class constructor so that we have the type map super(LLSDXMLFormatter, self).__init__() - self._indent_atom = b'' - self._eol = b'' + self._indent_atom = indent_atom + self._eol = eol self._depth = 1 def _indent(self): @@ -178,14 +178,10 @@ class LLSDXMLPrettyFormatter(LLSDXMLFormatter): This class is not necessarily suited for serializing very large objects. It sorts on dict (llsd map) keys alphabetically to ease human reading. """ - def __init__(self, indent_atom = b' '): + def __init__(self, indent_atom = b' ', eol = b'\n'): "Construct a pretty serializer." # Call the super class constructor so that we have the type map - super(LLSDXMLPrettyFormatter, self).__init__() - - # Private data used for indentation. - self._indent_atom = indent_atom - self._eol = b'\n' + super(LLSDXMLPrettyFormatter, self).__init__(indent_atom = indent_atom, eol = eol) def _indent(self): "Write an indentation based on the atom and indentation level." diff --git a/tests/llsd_test.py b/tests/llsd_test.py index 3c5d364..b274a39 100644 --- a/tests/llsd_test.py +++ b/tests/llsd_test.py @@ -16,7 +16,7 @@ import pytest import llsd -from llsd.base import PY2, is_integer, is_string, is_unicode +from llsd.base import PY2, is_integer, is_string, is_unicode, MAX_FORMAT_DEPTH, MAX_PARSE_DEPTH from llsd.serde_xml import remove_invalid_xml_bytes from tests.fuzz import LLSDFuzzer @@ -533,7 +533,7 @@ def testDeepMap(self): """ test_map = {"foo":"bar", "depth":0} - max_depth = 199 + max_depth = MAX_FORMAT_DEPTH - 1 for depth in range(max_depth): test_map = {"foo":"bar", "depth":depth, "next":test_map} @@ -990,7 +990,7 @@ def testDeepMap(self): """ test_map = {"foo":"bar", "depth":0} - max_depth = 199 + max_depth = MAX_FORMAT_DEPTH -1 for depth in range(max_depth): test_map = {"foo":"bar", "depth":depth, "next":test_map} @@ -1525,7 +1525,7 @@ def testDeepMap(self): """ test_map = {"foo":"bar", "depth":0} - max_depth = 199 + max_depth = MAX_FORMAT_DEPTH - 1 for depth in range(max_depth): test_map = {"foo":"bar", "depth":depth, "next":test_map} From c5e41c8eb96d6024545012b09e215cc6b9ce9572 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Thu, 7 Sep 2023 19:13:17 +0000 Subject: [PATCH 42/52] CR fixes --- llsd/base.py | 2 +- llsd/serde_binary.py | 4 ++-- llsd/serde_notation.py | 16 ++++++++-------- llsd/serde_xml.py | 8 ++++---- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/llsd/base.py b/llsd/base.py index 71040d2..2a03219 100644 --- a/llsd/base.py +++ b/llsd/base.py @@ -317,7 +317,7 @@ def _array_to_python(node, depth=0): def _to_python(node, depth=0): "Convert node to a python object." if depth > MAX_PARSE_DEPTH: - raise LLSDSerializationError("Cannot serialize depth of more than %d" % MAX_FORMAT_DEPTH) + raise LLSDParseError("Cannot parse depth of more than %d" % MAX_FORMAT_DEPTH) return NODE_HANDLERS[node.tag](node, depth) diff --git a/llsd/serde_binary.py b/llsd/serde_binary.py index 1a4ce48..e4ac7c5 100644 --- a/llsd/serde_binary.py +++ b/llsd/serde_binary.py @@ -120,13 +120,13 @@ def _parse_map(self): def _parse_array(self): "Parse a single llsd array" rv = [] - self._depth = self._depth + 1 + self._depth += 1 size = struct.unpack("!i", self._getc(4))[0] for count in range(size): rv.append(self._parse()) if self._getc() != b']': self._error("invalid array close token") - self._depth = self._depth - 1 + self._depth -= 1 return rv def _parse_string(self): diff --git a/llsd/serde_notation.py b/llsd/serde_notation.py index bf522e4..8e1d3e2 100644 --- a/llsd/serde_notation.py +++ b/llsd/serde_notation.py @@ -185,7 +185,7 @@ def _parse_map(self, cc): rv = {} key = b'' found_key = False - self._depth = self._depth + 1 + self._depth += 1 # skip the beginning '{' cc = self._getc() while (cc != b'}'): @@ -211,7 +211,7 @@ def _parse_map(self, cc): else: self._error("missing separator") cc = self._getc() - self._depth = self._depth - 1 + self._depth -= 1 return rv @@ -222,7 +222,7 @@ def _parse_array(self, cc): array: [ object, object, object ] """ rv = [] - self._depth = self._depth + 1 + self._depth += 1 # skip the beginning '[' cc = self._getc() while (cc != b']'): @@ -233,7 +233,7 @@ def _parse_array(self, cc): continue rv.append(self._parse(cc)) cc = self._getc() - self._depth = self._depth - 1 + self._depth -= 1 return rv def _parse_uuid(self, cc): @@ -454,22 +454,22 @@ def _DATE(self, v): def _ARRAY(self, v): self.stream.write(b'[') delim = b'' - self._depth = self._depth + 1 + self._depth += 1 for item in v: self.stream.write(delim) self._generate(item) delim = b',' - self._depth = self._depth - 1 + self._depth -= 1 self.stream.write(b']') def _MAP(self, v): self.stream.write(b'{') delim = b'' - self._depth = self._depth + 1 + self._depth += 1 for key, value in v.items(): self.stream.writelines([delim, b"'", self._esc(UnicodeType(key)), b"':"]) self._generate(value) delim = b',' - self._depth = self._depth - 1 + self._depth -= 1 self.stream.write(b'}') def _esc(self, data, quote=b"'"): diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index 7ec45cf..e3367b6 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -114,15 +114,15 @@ def _DATE(self, v): self.stream.writelines([b'', _format_datestr(v), b'', self._eol]) def _ARRAY(self, v): self.stream.writelines([b'', self._eol]) - self._depth = self._depth + 1 + self._depth += 1 for item in v: self._indent() self._generate(item) - self._depth = self._depth - 1 + self._depth -= 1 self.stream.writelines([b'', self._eol]) def _MAP(self, v): self.stream.writelines([b'', self._eol]) - self._depth = self._depth + 1 + self._depth += 1 for key, value in v.items(): self._indent() if PY2: # pragma: no cover @@ -137,7 +137,7 @@ def _MAP(self, v): self._eol]) self._indent() self._generate(value) - self._depth = self._depth - 1 + self._depth -= 1 self._indent() self.stream.writelines([b'', self._eol]) From 2432466eb861ac3c01347d88dffabbb67c576846 Mon Sep 17 00:00:00 2001 From: Roxie Linden Date: Thu, 7 Sep 2023 19:47:21 +0000 Subject: [PATCH 43/52] CR fixes --- llsd/base.py | 2 +- llsd/serde_xml.py | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/llsd/base.py b/llsd/base.py index 2a03219..e7204ca 100644 --- a/llsd/base.py +++ b/llsd/base.py @@ -317,7 +317,7 @@ def _array_to_python(node, depth=0): def _to_python(node, depth=0): "Convert node to a python object." if depth > MAX_PARSE_DEPTH: - raise LLSDParseError("Cannot parse depth of more than %d" % MAX_FORMAT_DEPTH) + raise LLSDParseError("Cannot parse depth of more than %d" % MAX_PARSE_DEPTH) return NODE_HANDLERS[node.tag](node, depth) diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index e3367b6..a7da4e7 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -98,18 +98,18 @@ def _UUID(self, v): self.stream.writelines([b'', str(v).encode('utf-8'), b'', self._eol]) def _BINARY(self, v): self.stream.writelines([b'', base64.b64encode(v).strip(), b'', self._eol]) - def _STRING(self, v): - # We don't simply have a function that encapsulates the PY2 vs PY3 calls, - # as that results in another function call and is slightly less performant - if PY2: # pragma: no cover + + if PY2: + def _STRING(self, v): return self.stream.writelines([b'', _str_to_bytes(xml_esc(v)), b'', self._eol]) - self.stream.writelines([b'', v.translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) - def _URI(self, v): - # We don't simply have a function that encapsulates the PY2 vs PY3 calls, - # as that results in another function call and is slightly less performant - if PY2: # pragma: no cover + def _URI(self, v): return self.stream.writelines([b'', _str_to_bytes(xml_esc(v)), b'', self._eol]) - self.stream.writelines([b'', str(v).translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) + else: + def _STRING(self, v): + self.stream.writelines([b'', v.translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) + def _URI(self, v): + self.stream.writelines([b'', str(v).translate(XML_ESC_TRANS).encode('utf-8'), b'', self._eol]) + def _DATE(self, v): self.stream.writelines([b'', _format_datestr(v), b'', self._eol]) def _ARRAY(self, v): From 55e30dd67e237dde9141a00f488d208839a9f182 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Oct 2023 12:33:27 +0000 Subject: [PATCH 44/52] Bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/bench.yaml | 2 +- .github/workflows/ci.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/bench.yaml b/.github/workflows/bench.yaml index f3ca6fc..daa2381 100644 --- a/.github/workflows/bench.yaml +++ b/.github/workflows/bench.yaml @@ -14,7 +14,7 @@ jobs: name: Run benchmarks runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index acaa97b..07c6b2a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: env: PYTHON: ${{ matrix.python-version }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 # fetch all history for setuptools_scm to be able to read tags From 599ad80e9d6e07c1a3c910598833a9d7f1f3175c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:44:30 +0000 Subject: [PATCH 45/52] Bump actions/setup-python from 4 to 5 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 4 to 5. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-python dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/bench.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/bench.yaml b/.github/workflows/bench.yaml index daa2381..a12206b 100644 --- a/.github/workflows/bench.yaml +++ b/.github/workflows/bench.yaml @@ -16,7 +16,7 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: "3.10" From edd38f2eb131988ddf8203a6aa2dc8b389d47e02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:44:34 +0000 Subject: [PATCH 46/52] Bump actions/download-artifact from 3 to 4 Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 3 to 4. - [Release notes](https://github.com/actions/download-artifact/releases) - [Commits](https://github.com/actions/download-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/download-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 07c6b2a..90ef9f5 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -66,7 +66,7 @@ jobs: id-token: write if: github.event_name != 'pull_request' steps: - - uses: actions/download-artifact@v3 + - uses: actions/download-artifact@v4 - name: Organize files for upload run: | From 814e450a1d932a0a4c832cd163aaa86c0d1fa592 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:44:36 +0000 Subject: [PATCH 47/52] Bump actions/upload-artifact from 3 to 4 Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 3 to 4. - [Release notes](https://github.com/actions/upload-artifact/releases) - [Commits](https://github.com/actions/upload-artifact/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/upload-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 07c6b2a..f60bcdb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,7 @@ jobs: fail_ci_if_error: true files: .coverage.${{ steps.pyenv.outputs.value }}.xml - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@v4 if: matrix.python-version == '2.7' || matrix.python-version == '3.8' with: name: dist-${{ matrix.python-version }} From 864adff734e8a37f87670f169d1156f62c95a59b Mon Sep 17 00:00:00 2001 From: Signal Linden Date: Thu, 1 Feb 2024 08:38:15 -0800 Subject: [PATCH 48/52] Bump codecov-action to v4 --- .github/workflows/ci.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 874de0c..a8a9f76 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,10 +11,14 @@ jobs: name: Test & Build strategy: matrix: - python-version: ['2.7', '3.7', '3.8', '3.10'] + python-version: ['3.7', '3.8', '3.10'] + image-variant: [''] + include: + - python-version: '2.7' + image-variant: '-buster' runs-on: [ubuntu-latest] container: - image: "python:${{ matrix.python-version }}-buster" + image: "python:${{ matrix.python-version }}${{ matrix.image-variant }}" env: PYTHON: ${{ matrix.python-version }} steps: @@ -44,7 +48,7 @@ jobs: run: python -m build - name: Upload coverage - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 if: matrix.python-version == '3.10' with: token: ${{ secrets.CODECOV_TOKEN }} From 414ab69cd4244979fc7ba21181c945ae5e0a3ffb Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Mon, 1 Apr 2024 20:08:11 -0700 Subject: [PATCH 49/52] Fix array indentation of pretty xml Fix indentation on closing element of arrays. --- llsd/serde_xml.py | 1 + tests/llsd_test.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index a7da4e7..c305e3f 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -119,6 +119,7 @@ def _ARRAY(self, v): self._indent() self._generate(item) self._depth -= 1 + self._indent() self.stream.writelines([b'', self._eol]) def _MAP(self, v): self.stream.writelines([b'', self._eol]) diff --git a/tests/llsd_test.py b/tests/llsd_test.py index b274a39..39539b1 100644 --- a/tests/llsd_test.py +++ b/tests/llsd_test.py @@ -1503,6 +1503,24 @@ def testFormatPrettyXML(self): output_xml = llsd.format_pretty_xml(python_object) + with open("foo.llsd.xml", "wb") as f: + f.write(output_xml) + + self.assertEqual(output_xml.decode("utf8"), """ + + + id + + string1 + 123 + + name + 123 + + + +""") + # check whether the output_xml contains whitespaces and new line character whitespaces_count = output_xml.count(b' ') newline_count = output_xml.count(b'\n') @@ -1944,3 +1962,5 @@ def test_uuid_map_key(self): llsdmap=llsd.LLSD({uuid.UUID(int=0) : 'uuid'}) self.assertEqual(llsd.format_xml(llsdmap), b'00000000-0000-0000-0000-000000000000uuid') self.assertEqual(llsd.format_notation(llsdmap), b"{'00000000-0000-0000-0000-000000000000':'uuid'}") + + From da987c92c5074de5d8a6eaff829d7923ef1b6e97 Mon Sep 17 00:00:00 2001 From: Bennett Goble Date: Mon, 1 Apr 2024 20:21:27 -0700 Subject: [PATCH 50/52] Add viewer autobuild.xml roundtrip test Fix a missing EOL after and add a roundtrip test of viewer autobuild xml. --- llsd/serde_xml.py | 2 +- tests/fixtures/viewer-autobuild.xml | 3977 +++++++++++++++++++++++++++ tests/llsd_test.py | 17 +- tox.ini | 2 +- 4 files changed, 3994 insertions(+), 4 deletions(-) create mode 100644 tests/fixtures/viewer-autobuild.xml diff --git a/llsd/serde_xml.py b/llsd/serde_xml.py index c305e3f..3833f57 100644 --- a/llsd/serde_xml.py +++ b/llsd/serde_xml.py @@ -163,7 +163,7 @@ def _write(self, something): self.stream.writelines([b'', self._eol, b'', self._eol]) self._generate(something) - self.stream.write(b'') + self.stream.write(b'' + self._eol) class LLSDXMLPrettyFormatter(LLSDXMLFormatter): diff --git a/tests/fixtures/viewer-autobuild.xml b/tests/fixtures/viewer-autobuild.xml new file mode 100644 index 0000000..2e4397a --- /dev/null +++ b/tests/fixtures/viewer-autobuild.xml @@ -0,0 +1,3977 @@ + + + + installables + + SDL + + copyright + Copyright (C) 1997-2012 Sam Lantinga + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. + license + lgpl + license_file + LICENSES/SDL.txt + name + SDL + platforms + + linux + + archive + + hash + 459cdc8d7c19a8025f98f61db95622ff + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/sdl_3p-update-sdl/rev/297546/arch/Linux/installer/SDL-1.2.15-linux-297546.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 7ea2df03bfc35c06acf23dd9e734adac + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1103/2554/SDL-1.2.15-linux64-501092.tar.bz2 + + name + linux64 + + + version + 1.2.15 + + apr_suite + + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. + description + Apache portable runtime project + license + apache + license_file + LICENSES/apr_suite.txt + name + apr_suite + platforms + + darwin + + archive + + hash + 0c53148aa00e51c06fa246c4130915be + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/apr_3p-update-apr/rev/297252/arch/Darwin/installer/apr_suite-1.4.5.297252-darwin-297252.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + b6357ef3a0ec37877a5831820f25094e + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80557/759704/apr_suite-1.4.5.558565-darwin64-558565.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 1aa2e5355bb9df09f9196d14a72b6705 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-apr/rev/314241/arch/Linux/installer/apr_suite-1.4.5.314241-linux-314241.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 84a1a140f20b25d714949185e854d14b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4811/15302/apr_suite-1.4.5.504800-linux64-504800.tar.bz2 + + name + linux64 + + windows + + archive + + hash + cb48ac069440f6dcd564cfa9fd02a4c2 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80556/759710/apr_suite-1.4.5.558565-windows-558565.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 646dc3828d9c39fb1e77c4eec44ed739 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80555/759709/apr_suite-1.4.5.558565-windows64-558565.tar.bz2 + + name + windows64 + + + version + 1.4.5.558565 + + boost + + copyright + (see individual source files) + description + Boost C++ Libraries + license + boost 1.0 + license_file + LICENSES/boost.txt + name + boost + platforms + + darwin + + archive + + hash + c296845cad075250c1ae2620f175a957 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/boost_3p-update-boost/rev/297445/arch/Darwin/installer/boost-1.57-darwin-297445.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 35cc090d942b85c9126ceac9912d52d6 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78585/744021/boost-1.72-darwin64-557045.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + f1fdb548fd6c09a083c86f3a23d7f041 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-boost/rev/317807/arch/Linux/installer/boost-1.57-linux-317807.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 038853b97307a9b65de20c4c50098023 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9675/45694/boost-1.65.1-linux64-509640.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 9aa4ce32df5f5e36124c990e2d77b885 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78586/743982/boost-1.72-windows-557045.tar.bz2 + + name + windows + + windows64 + + archive + + hash + a79511c9d8b956767ebaa405155d4238 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78584/743961/boost-1.72-windows64-557045.tar.bz2 + + name + windows64 + + + version + 1.72 + + bugsplat + + copyright + Copyright 2003-2017, BugSplat + description + Bugsplat crash reporting package + license + Proprietary + license_file + LICENSES/BUGSPLAT_LICENSE.txt + name + bugsplat + platforms + + darwin64 + + archive + + hash + ae90d19cdcddf539f6d0b41cab12f918 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72773/702861/bugsplat-1.0.7.552580-darwin64-552580.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + f5936eceb6a33ff0f1cc31996a40f29c + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72774/702905/bugsplat-3.6.0.8.552580-windows-552580.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 9cd940754e53e0670030b3da5ba8f373 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/72775/702906/bugsplat-3.6.0.8.552580-windows64-552580.tar.bz2 + + name + windows64 + + + version + 3.6.0.8.552580 + + colladadom + + copyright + Copyright 2006 Sony Computer Entertainment Inc. + license + SCEA + license_file + LICENSES/collada.txt + name + colladadom + platforms + + darwin + + archive + + hash + 726bc31e562752f081e95e8fcc70e405 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Darwin/installer/colladadom-2.3.297450-darwin-297450.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 1d063cf1783e7788f17486c234adb1db + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78635/744249/colladadom-2.3.557064-darwin64-557064.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 78b9a6506fb7d53da166f7a65f2278f4 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-colladadom/rev/317826/arch/Linux/installer/colladadom-2.3.317826-linux-317826.tar.bz2 + + name + linux + + linux64 + + archive + + hash + c90613240ba3e3a171d3379275ae4ee3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9695/45732/colladadom-2.3.509683-linux64-509683.tar.bz2 + + name + linux64 + + windows + + archive + + hash + e78ecf919eee01567556787c3a358d15 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78637/744269/colladadom-2.3.557064-windows-557064.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 7e63a212c8909a25236138422fe01298 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78636/744273/colladadom-2.3.557064-windows64-557064.tar.bz2 + + name + windows64 + + + version + 2.3.557064 + + curl + + copyright + Copyright (c) 1996 - 2014, Daniel Stenberg, (daniel@haxx.se). + description + Library for transferring data specified with URL syntax + license + curl + license_file + LICENSES/curl.txt + name + curl + platforms + + darwin + + archive + + hash + ad0061db7188a1b9a974eb0512eeeb8d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-curl/rev/312763/arch/Darwin/installer/curl-7.47.0.312763-darwin-312763.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 13f74f43a6363ec998569f731fd869c5 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82637/774617/curl-7.54.1.560191-darwin64-560191.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 9430c08954c00736117099046694e1b1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-curl/rev/314230/arch/Linux/installer/curl-7.47.0.314230-linux-314230.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 630a2ddf43bba6e5b6e171dc68921dcb + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8663/36142/curl-7.54.1.508652-linux64-508652.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 0df99bd685dc3561ca8ea347b2921987 + hash_algorithm + md5 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82639/774610/curl-7.54.1.560191-windows-560191.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 50db2a9e6b74ec4b0c38b1ea8f135735 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82638/774608/curl-7.54.1.560191-windows64-560191.tar.bz2 + + name + windows64 + + + version + 7.54.1.560191 + + db + + copyright + Copyright (c) 1990, 2010 Oracle and/or its affiliates. All rights reserved. + description + Berkeley DB (libdb) is a programmatic toolkit that provides embedded database support for both traditional and client/server applications. + license + bsd + license_file + LICENSES/db.txt + name + db + platforms + + linux + + archive + + hash + 1cc7940e500858a9754e9a3cc3ba2237 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/db_3p-update-db/rev/295315/arch/Linux/installer/db-5.1.25-linux-295315.tar.bz2 + + name + linux + + + version + 5.1.25 + + dbus_glib + + copyright + Copyright (C) Red Hat Inc. + description + D-Bus bindings for glib + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + name + dbus_glib + platforms + + linux + + archive + + hash + 6d676abd9ad8d2883b855dbe397d9034 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-dbus-glib/rev/314266/arch/Linux/installer/dbus_glib-0.76-linux-314266.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 7ee7b9aed3c0c8c09e7bf26bba7af8e1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-dbus-glib/rev/314266/arch/Linux/installer/dbus_glib-0.76-linux64-314266.tar.bz2 + + name + linux64 + + + version + 0.76 + + dictionaries + + copyright + Copyright 2014 Apache OpenOffice software + description + Spell checking dictionaries to bundled into the viewer + license + various open source + license_file + LICENSES/dictionaries.txt + name + dictionaries + platforms + + common + + archive + + hash + d778c6a3475bc35ee8b9615dfc38b4a9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55025/511964/dictionaries-1.538984-common-538984.tar.bz2 + + name + common + + + version + 1.538984 + + dullahan + + copyright + Copyright (c) 2017, Linden Research, Inc. + description + A headless browser SDK that uses the Chromium Embedded Framework (CEF). It is designed to make it easier to write applications that render modern web content directly to a memory buffer, inject synthesized mouse and keyboard events as well as interact with web based features like JavaScript or cookies. + license + MPL + license_file + LICENSES/LICENSE.txt + name + dullahan + platforms + + darwin64 + + archive + + hash + 45dedb5b09995cd794304150e94fcf21 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/87950/806969/dullahan-1.12.2.202109170444_91.1.21_g9dd45fe_chromium-91.0.4472.114-darwin64-563968.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + d0fd9d7086699da4bb5ccc935622a717 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/88276/809277/dullahan-1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows-563968.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 7e8c3ccd420ff5aef24ff72d609ba394 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/88275/809281/dullahan-1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114-windows64-563968.tar.bz2 + + name + windows64 + + + version + 1.12.2.202109230751_91.1.21_g9dd45fe_chromium-91.0.4472.114 + + elfio + + license + lgpl + license_file + LICENSES/elfio.txt + name + elfio + platforms + + linux + + archive + + hash + 031e6315a5c0829c9b9a2ec18aeb7ae3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-elfio/rev/222074/arch/Linux/installer/elfio-1.0.3-linux-20110225.tar.bz2 + + name + linux + + + + expat + + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + description + Expat is an XML parser library written in C + license + expat + license_file + LICENSES/expat.txt + name + expat + platforms + + darwin + + archive + + hash + 452d1910ef853329cd59858e6c5b2c48 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/expat_3p-update-expat/rev/297014/arch/Darwin/installer/expat-2.0.1.297014-darwin-297014.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + f4e80e0dfcab713a3da90cd8f7f23e7b + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76341/727265/expat-2.1.1.555519-darwin64-555519.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 387c90b9bb5ec412587fbe7a56261dd1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-expat/rev/314211/arch/Linux/installer/expat-2.1.1.314211-linux-314211.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 5e1f025d1cebd12db542080aa755257f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/380/943/expat-2.1.1.500375-linux64-500375.tar.bz2 + + name + linux64 + + windows + + archive + + hash + cd4fe03473076c324d80ae3bd91a85bb + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76343/727273/expat-2.1.1.555519-windows-555519.tar.bz2 + + name + windows + + windows64 + + archive + + hash + d2d74d73b914150982b1883a3b96e60b + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76344/727279/expat-2.1.1.555519-windows64-555519.tar.bz2 + + name + windows64 + + + version + 2.1.1.555519 + + fmodstudio + + copyright + FMOD Studio by Firelight Technologies Pty Ltd. + description + FMOD Studio API + license + fmod + license_file + LICENSES/fmodstudio.txt + name + fmodstudio + platforms + + darwin64 + + archive + + hash + d5528538e67c710387ae0c061a90cb23 + url + https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76868/730756/fmodstudio-2.01.07.555883-darwin64-555883.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 5283050c22d31877cd9e0afbe6feb9fc + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65398/612630/fmodstudio-2.00.11.546392-linux-546392.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 5a3c78f4a77ae6477986e33836725e8b + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/65399/612631/fmodstudio-2.00.11.546392-linux64-546392.tar.bz2 + + name + linux64 + + windows + + archive + + hash + a2bb6eaf51f933993b26a5fe7503a761 + url + https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76869/730763/fmodstudio-2.01.07.555883-windows-555883.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 138d07dd516a9ad5b9787192fe6134dd + url + https://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/76867/730751/fmodstudio-2.01.07.555883-windows64-555883.tar.bz2 + + name + windows64 + + + version + 2.01.07.555883 + + fontconfig + + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. + description + Fontconfig is a library for configuring and customizing font access. + license + bsd + license_file + LICENSES/fontconfig.txt + name + fontconfig + platforms + + linux + + archive + + hash + a20a3d0ab7fc3401bc2ca81e9309f630 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-fontconfig/rev/314281/arch/Linux/installer/fontconfig-2.11.0-linux-314281.tar.bz2 + + name + linux + + linux64 + + archive + + hash + e2419d56960c160670051fbb055fb729 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-fontconfig/rev/314281/arch/Linux/installer/fontconfig-2.11.0-linux64-314281.tar.bz2 + + name + linux64 + + + version + 2.11.0 + + freetype + + copyright + Copyright 2006, 2007, 2008, 2009, 2010 by David Turner, Robert Wilhelm, and Werner Lemberg. + description + Font rendering library + license + FreeType + license_file + LICENSES/freetype.txt + name + freetype + platforms + + darwin + + archive + + hash + 83618d16d974eb0af93926a10ac13297 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freetype_3p-update-freetype/rev/297053/arch/Darwin/installer/freetype-2.4.4.297053-darwin-297053.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 3a478d6c8a10d49d9161ef864394b03c + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78592/744013/freetype-2.4.4.557047-darwin64-557047.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 1b401394106cedc86926bd488f5aa45e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-freetype/rev/314215/arch/Linux/installer/freetype-2.4.4.314215-linux-314215.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 94cf61dfdbc86aae5bbaf0b5cb8a366c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/874/1914/freetype-2.4.4.500865-linux64-500865.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 7ee200d6b5fa282c7f973ade5615aa86 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78594/744011/freetype-2.4.4.557047-windows-557047.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 69307aaba16ac71531c9c4d930ace993 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78593/744010/freetype-2.4.4.557047-windows64-557047.tar.bz2 + + name + windows64 + + + version + 2.4.4.557047 + + glext + + copyright + Copyright (c) 2007-2010 The Khronos Group Inc. + description + glext headers define function prototypes and constants for OpenGL extensions + license + Copyright (c) 2007-2010 The Khronos Group Inc. + license_file + LICENSES/glext.txt + name + glext + platforms + + darwin64 + + archive + + hash + 1bd3214ac23474ea4c869e386970a1be + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54835/510029/glext-68-darwin64-538965.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + baf1fd13e1fe6aef586200fc87a70f53 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/Linux/installer/glext-68-linux-314200.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 5f3c9d61b620f949b199ebd8885218ed + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glext/rev/314200/arch/Linux/installer/glext-68-linux64-314200.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 6a311615bce59b01cf73ee65012a9b38 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54951/511711/glext-68-windows-538965.tar.bz2 + + name + windows + + windows64 + + archive + + hash + daf619dab1cf7518af6532b18800c4b0 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54924/511490/glext-68-windows64-538965.tar.bz2 + + name + windows64 + + + version + 68 + + glh_linear + + copyright + Copyright (c) 2000 Cass Everitt + description + glh - is a platform-indepenedent C++ OpenGL helper library + license + BSD + license_file + LICENSES/glh-linear.txt + name + glh_linear + platforms + + common + + archive + + hash + 650e836255b6c2ecb93d3f1f7220051c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55011/511905/glh_linear-0.0.0-common-538981.tar.bz2 + + name + common + + + version + 0.0.0 + + glod + + copyright + Copyright 2003 Jonathan Cohen, Nat Duca, David Luebke, Brenden Schubert - Johns Hopkins University and University of Virginia + license + GLOD Open-Source License Version 1.0 + license_file + LICENSES/GLOD.txt + name + glod + platforms + + darwin + + archive + + hash + 71e678d70e276fc42a56926fc28a7abd + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glod_3p-update-glod/rev/296895/arch/Darwin/installer/glod-1.0pre4.296895-darwin-296895.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + a9eaa005ff9d387f946283fbcb69b3c8 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76353/727324/glod-1.0pre3.555522-darwin64-555522.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 58113bcbbacbaeb2d278f745867ae6f0 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-glod/rev/314201/arch/Linux/installer/glod-1.0pre4.314201-linux-314201.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 9aef5cd576ace19568da01d9bc3db29c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1625/3628/glod-1.0pre3.501614-linux64-501614.tar.bz2 + + name + linux64 + + windows + + archive + + hash + e36c95b0d0fbaa3ff3392facaf5de447 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55008/511893/glod-1.0pre3.538980-windows-538980.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 6302ee1903ab419e76565d9eb6acd274 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55004/511885/glod-1.0pre3.538980-windows64-538980.tar.bz2 + + name + windows64 + + + version + 1.0pre3.555522 + + googlemock + + copyright + Copyright 2008, Google Inc. + description + a library for writing and using C++ mock classes + license + BSD + license_file + LICENSES/gmock.txt + name + googlemock + platforms + + darwin + + archive + + hash + 022649e284163b8ee23e3c9a81302fa7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/googlemock_3p-update-googlemock/rev/297460/arch/Darwin/installer/googlemock-1.7.0.297460-darwin-297460.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 19e925604bc1a91efb4b130e1edd8bf2 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78620/744140/googlemock-1.7.0.557057-darwin64-557057.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + ad51f68702f25ba245fff312c50c8876 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-googlemock/rev/317828/arch/Linux/installer/googlemock-1.7.0.317828-linux-317828.tar.bz2 + + name + linux + + linux64 + + archive + + hash + ff459b58695c76838782847a0b792104 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9697/45717/googlemock-1.7.0.509686-linux64-509686.tar.bz2 + + name + linux64 + + windows + + archive + + hash + eed7b41d0d1f41b24f315349ef78c728 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78622/744148/googlemock-1.7.0.557057-windows-557057.tar.bz2 + + name + windows + + windows64 + + archive + + hash + a6ad6fe722d2fe4e8137495af3f374c9 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78621/744152/googlemock-1.7.0.557057-windows64-557057.tar.bz2 + + name + windows64 + + + version + 1.7.0.557057 + + gstreamer + + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + license + LGPL + license_file + LICENSES/gstreamer.txt + name + gstreamer + platforms + + linux + + archive + + hash + 5017b3e95d2c6f47bb111c3f9c075522 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gstreamer/rev/314267/arch/Linux/installer/gstreamer-0.10.6.314267-linux-314267.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 7c9d7cc88add7831a6afeedc20cad2fe + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gstreamer/rev/314267/arch/Linux/installer/gstreamer-0.10.6.314267-linux64-314267.tar.bz2 + + name + linux64 + + + version + 0.10.6.314267 + + gtk-atk-pango-glib + + copyright + Copyright (various, see sources) + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + name + gtk-atk-pango-glib + platforms + + linux + + archive + + hash + a6431df705526501684d9050e04bfa5b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gtk-atk-pango-glib/rev/314220/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux-314220.tar.bz2 + + name + linux + + linux64 + + archive + + hash + de7bba8fd2275a11b077b124413065d0 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-gtk-atk-pango-glib/rev/314220/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux64-314220.tar.bz2 + + name + linux64 + + + version + 0.1 + + havok-source + + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. + description + Havok source code for libs and demos + license + havok + license_file + LICENSES/havok.txt + name + havok-source + platforms + + darwin + + archive + + hash + 5c5b4820999ae9e398801d6a46f45897 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297312/arch/Darwin/installer/havok_source-2012.1-darwin-297312.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + ba229348c1d9d58519cd854ff9d8ef3d + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55213/512968/havok_source-2012.1-2-darwin64-539117.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 03c1c5f7c3e93e905f635ca22b607494 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_3p-havok-source/rev/314226/arch/Linux/installer/havok_source-2012.1-2-linux-314226.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 00d0333936a67059a43a6ec8ac38d564 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/748/1563/havok_source-2012.1-2-linux64-500739.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 4ff2af85106907acb171bb1e38a3757e + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55214/512993/havok_source-2012.1-2-windows-539117.tar.bz2 + + name + windows + + windows64 + + archive + + hash + bcaf4631ea10f7d09eecb73e8f5bef6c + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55212/512962/havok_source-2012.1-2-windows64-539117.tar.bz2 + + name + windows64 + + + version + 2012.1-2 + + jpeglib + + copyright + Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding. + description + JPEG encoding, decoding library + license + jpeglib + license_file + LICENSES/jpeglib.txt + name + jpeglib + platforms + + darwin + + archive + + hash + 4d7658997fd0f93a9c55e40e40b1b0e5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jpeglib_3p-update-jpeglib/rev/296854/arch/Darwin/installer/jpeglib-8c.296854-darwin-296854.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 3f2e34e3a2dac8eea957cad143a71dc5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54847/510113/jpeglib-8c.538977-darwin64-538977.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 32560d3200da72fea2922371fcef25f5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-jpeglib/rev/314202/arch/Linux/installer/jpeglib-8c.314202-linux-314202.tar.bz2 + + name + linux + + linux64 + + archive + + hash + ba9c62863ec338a049de83c24639f57c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/3151/7568/jpeglib-8c.503140-linux64-503140.tar.bz2 + + name + linux64 + + windows + + archive + + hash + c8dee00ef13af40ec68becc25830e195 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54992/511854/jpeglib-8c.538977-windows-538977.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 6f40620e86f3c9b91b6b5fe3c81776fc + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54991/511847/jpeglib-8c.538977-windows64-538977.tar.bz2 + + name + windows64 + + + version + 8c.538977 + + jsoncpp + + copyright + Copyright (c) 2007-2010 Baptiste Lepilleur + description + jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. + license + public domain + license_file + LICENSES/jsoncpp.txt + name + jsoncpp + platforms + + darwin + + archive + + hash + b25a4f480e07c670ffef00c3da578f87 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Darwin/installer/jsoncpp-0.5.0.297281-darwin-297281.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 87d32aaac4183590c96edd0b6d9bf3e4 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54846/510106/jsoncpp-0.5.0.538976-darwin64-538976.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 9d5d9fec28cbbb1651b95728173f8af7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-jsoncpp/rev/314229/arch/Linux/installer/jsoncpp-0.5.0.314229-linux-314229.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 9a658ae561c75e60bd9c0cee56731d21 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1475/3274/jsoncpp-0.5.0.501464-linux64-501464.tar.bz2 + + name + linux64 + + windows + + archive + + hash + b73d9addab278eacc100bd312ab6ec5c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54990/511840/jsoncpp-0.5.0.538976-windows-538976.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 1b9ac5708cc526d2c5358ef0a427109d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54989/511833/jsoncpp-0.5.0.538976-windows64-538976.tar.bz2 + + name + windows64 + + + version + 0.5.0.538976 + + kdu + + copyright + Kakadu software + description + JPEG2000 library by Kakadu + license + Kakadu + license_file + LICENSES/kdu.txt + name + kdu + platforms + + darwin + + archive + + hash + 3855bd40f950e3c22739ae8f3ee2afc9 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15258/98444/kdu-7.10.4.513518-darwin-513518.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + ccfd8eacd1ebe92715944094064ba2e4 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55187/512570/kdu-7.10.4.539108-darwin64-539108.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 43d7a6a69a54534a736f132e9c81795b + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15255/98451/kdu-7.10.4.513518-linux-513518.tar.bz2 + + name + linux + + linux64 + + archive + + hash + a705a665810a71e7b0114a97ae9a2224 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/15256/98457/kdu-7.10.4.513518-linux64-513518.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 38574fbcb6c94c42745ef48748002e58 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55189/512583/kdu-7.10.4.539108-windows-539108.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 3dfeb869c781a766874f0aedc7d4fcef + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/55188/512576/kdu-7.10.4.539108-windows64-539108.tar.bz2 + + name + windows64 + + + version + 7.10.4.539108 + + libhunspell + + copyright + See hunspell.txt + description + Spell checking library + license + LGPL + license_file + LICENSES/hunspell.txt + name + libhunspell + platforms + + darwin + + archive + + hash + 05eda16106df26a211f8bdd874d1fca5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/hunspell_3p-update-hunspell/rev/296916/arch/Darwin/installer/libhunspell-1.3.2.296916-darwin-296916.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 2021ea3a19b81c82993e733709683303 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76371/727419/libhunspell-1.3.2.555528-darwin64-555528.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 0d8009c3b6c1eb510593476dd1d821b5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-hunspell/rev/314217/arch/Linux/installer/libhunspell-1.3.2.314217-linux-314217.tar.bz2 + + name + linux + + linux64 + + archive + + hash + ffbdd109356d66ddfefd8a5d57f63f1f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/533/1144/libhunspell-1.3.2.500526-linux64-500526.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 2253ec09136cc7c208481030d78d9dd7 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76369/727412/libhunspell-1.3.2.555528-windows-555528.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 858d1708f6b3a74738a3d57a5387e20f + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76370/727413/libhunspell-1.3.2.555528-windows64-555528.tar.bz2 + + name + windows64 + + + version + 1.3.2.555528 + + libndofdev + + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. + description + 3DConnexion SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + libndofdev + platforms + + darwin + + archive + + hash + a01b411433dbf8a4b481de9e76d9a652 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297264/arch/Darwin/installer/libndofdev-0.1.297264-darwin-297264.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + a487fff84208a45844602c4a1f68c974 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76356/727333/libndofdev-0.1.555523-darwin64-555523.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + 4c839555bf0ed9ae60ffc3f8a7c96f9b + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76354/727340/libndofdev-0.1.555523-windows-555523.tar.bz2 + + name + windows + + windows64 + + archive + + hash + cbc033ae3b034b992b59f6de1034247c + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76355/727341/libndofdev-0.1.555523-windows64-555523.tar.bz2 + + name + windows64 + + + version + 0.1.555523 + + libpng + + copyright + Copyright (c) 2004, 2006-2013 Glenn Randers-Pehrson + description + PNG Reference library + license + libpng + license_file + LICENSES/libpng.txt + name + libpng + platforms + + darwin + + archive + + hash + 14cb5c8686a472e9e60179e46cd196f7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297708/arch/Darwin/installer/libpng-1.6.8.297708-darwin-297708.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 2a41acc3116ce19a443873216cb882ad + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78587/743948/libpng-1.6.8.557046-darwin64-557046.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 0758f3cb4c02ebab61854b811b0894e9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libpng/rev/314214/arch/Linux/installer/libpng-1.6.8.314214-linux-314214.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 13de93ea11544051b69f238eeb644fd3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/882/1946/libpng-1.6.8.500873-linux64-500873.tar.bz2 + + name + linux64 + + windows + + archive + + hash + b935b440947f63c69700bdcf5095a8e1 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78591/743970/libpng-1.6.8.557046-windows-557046.tar.bz2 + + name + windows + + windows64 + + archive + + hash + d1cc8354ac4e877eefedf16b1be3aac6 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78589/743991/libpng-1.6.8.557046-windows64-557046.tar.bz2 + + name + windows64 + + + version + 1.6.8.557046 + + libuuid + + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). + license + UUID + license_file + LICENSES/uuid.txt + name + libuuid + platforms + + linux + + archive + + hash + a2eaf9515cd129f3e21a08e92689006b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libuuid/rev/314269/arch/Linux/installer/libuuid-1.6.2-linux-314269.tar.bz2 + + name + linux + + linux64 + + archive + + hash + fb89f1281dd54d8b99b339fc5b712b27 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libuuid/rev/314269/arch/Linux/installer/libuuid-1.6.2-linux64-314269.tar.bz2 + + name + linux64 + + + version + 1.6.2 + + libxml2 + + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. + license + mit + license_file + LICENSES/libxml2.txt + name + libxml2 + platforms + + darwin + + archive + + hash + 9303f0dd174129e297eca6cc2eb1ab3f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libxml_3p-update-libxml/rev/297050/arch/Darwin/installer/libxml2-2.9.1.297050-darwin-297050.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 6677173bbbb0ea32369b5e9b6c9aa641 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78631/744225/libxml2-2.9.4.557062-darwin64-557062.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 6954173a141d928f2614076577d952de + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-libxml/rev/314197/arch/Linux/installer/libxml2-2.9.1.314197-linux-314197.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 740fc93f195c77b3a0c0800b31878ecb + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/890/1968/libxml2-2.9.4.500877-linux64-500877.tar.bz2 + + name + linux64 + + windows + + archive + + hash + ad6a596fbf0e83a21d95762da78437bc + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78633/744239/libxml2-2.9.4.557062-windows-557062.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 6b5bb230684ecf28386d7c91c47bb6e1 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78634/744240/libxml2-2.9.4.557062-windows64-557062.tar.bz2 + + name + windows64 + + + version + 2.9.4.557062 + + llappearance_utility + + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab appearance utility for server-side avatar baking services. + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + name + llappearance_utility + platforms + + linux + + archive + + hash + fddd634dec5ec03924d62cc774f7f8ea + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/p64_viewer-llappearance-utility/rev/317266/arch/Linux/installer/llappearance_utility-0.0.1-linux-317266.tar.bz2 + + name + linux + + + version + 0.0.1 + + llca + + copyright + Copyright (c) 2016, Linden Research, Inc.; data provided by the Mozilla NSS Project. + + license + mit + license_file + LICENSES/ca-license.txt + name + llca + platforms + + common + + archive + + hash + 0a6349b11c8e9d34f0c80b8081736e75 + hash_algorithm + md5 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/79438/751815/llca-202104010215.557744-common-557744.tar.bz2 + + name + common + + + version + 202104010215.557744 + + llphysicsextensions_source + + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_source + platforms + + darwin64 + + archive + + hash + 14fac452271ebfba37ba5ddcf5bffa54 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/54842/510078/llphysicsextensions_source-1.0.538972-darwin64-538972.tar.bz2 + + name + darwin64 + + linux64 + + archive + + hash + c1b43e99c5ddccc18b0e9cb288bf75e1 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/4721/14828/llphysicsextensions_source-1.0.504710-linux64-504710.tar.bz2 + + name + linux64 + + windows + + archive + + hash + f3c066c1aebed8a6519a3e5ce64b9a3c + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/54982/511796/llphysicsextensions_source-1.0.538972-windows-538972.tar.bz2 + + name + windows + + + version + 1.0.538972 + + llphysicsextensions_stub + + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_stub + platforms + + darwin64 + + archive + + hash + f290b000b31f9e36f2489946cbc99f5e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/59995/563653/llphysicsextensions_stub-1.0.542456-darwin64-542456.tar.bz2 + + name + darwin64 + + linux64 + + archive + + hash + 711f4ec769e4b5f59ba25ee43c11bcbc + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4724/14846/llphysicsextensions_stub-1.0.504712-linux64-504712.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 2e5f1f7046a49d8b0bc295aa878116bc + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/60043/564063/llphysicsextensions_stub-1.0.542456-windows-542456.tar.bz2 + + name + windows + + + version + 1.0.542456 + + llphysicsextensions_tpv + + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/HavokSublicense.pdf + name + llphysicsextensions_tpv + platforms + + darwin64 + + archive + + hash + 2aa4ec0d72bbe4b755730f1bf92b39e7 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30340/257304/llphysicsextensions_tpv-1.0.542327-darwin64-542327.tar.bz2 + + name + darwin64 + + linux64 + + archive + + hash + 711f4ec769e4b5f59ba25ee43c11bcbc + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/4724/14846/llphysicsextensions_stub-1.0.504712-linux64-504712.tar.bz2 + + name + linux64 + + windows + + archive + + hash + ad9aba5e2c43a37b6530a0d2de64df1c + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30341/257307/llphysicsextensions_tpv-1.0.542327-windows-542327.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 46689ff1442a8eccac3a7f3258308e1e + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/30341/257307/llphysicsextensions_tpv-1.0.542327-windows64-542327.tar.bz2 + + name + windows + + + version + 1.0.542327 + + mesa + + license + mesa + license_file + LICENSES/mesa.txt + name + mesa + platforms + + linux + + archive + + hash + 22c50a5d362cad311b4f413cfcffbba2 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/mesa_3p-update-mesa/rev/297294/arch/Linux/installer/mesa-7.11.1.297294-linux-297294.tar.bz2 + + name + linux + + + version + 7.11.1.297294 + + nghttp2 + + copyright + Copyright (c) 2012, 2014, 2015, 2016 Tatsuhiro Tsujikawa +Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors + description + Library providing HTTP 2 support for libcurl + license + MIT + license_file + LICENSES/nghttp2.txt + name + nghttp2 + platforms + + darwin64 + + archive + + hash + e4f784d8a035c51921a1562ca7a1bab6 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76357/727350/nghttp2-1.40.0.555524-darwin64-555524.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 079c1a1bdb3ce1cda8ce3d7f75eeced3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9258/41585/nghttp2-1.25.0.509246-linux-509246.tar.bz2 + + name + linux + + linux64 + + archive + + hash + c3c5ff7d2f7ac1143ef8d888192d4a53 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/9257/41579/nghttp2-1.25.0.509246-linux64-509246.tar.bz2 + + name + linux64 + + windows + + archive + + hash + af05aa2994c9845308fecd094b7b2d25 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76359/727360/nghttp2-1.40.0.555524-windows-555524.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 5a55cede40eef16b9d1e47c418a2b77a + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76358/727359/nghttp2-1.40.0.555524-windows64-555524.tar.bz2 + + name + windows64 + + + source_type + hg + version + 1.40.0.555524 + + nvapi + + copyright + Copyright © 2012 NVIDIA Corporation. All rights reserved. + description + NVAPI provides an interface to NVIDIA devices. + license + NVIDIA Corporation Software License Agreement – NVAPI SDK + license_file + LICENSES/NVAPI_SDK_License_Agreement.pdf + name + nvapi + platforms + + windows + + archive + + hash + 4305515ad326c911a390388366a9107b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54947/511704/nvapi-352.539058-windows-539058.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 25c8ac919f24b8952653d38ec43640e5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54945/511697/nvapi-352.539058-windows64-539058.tar.bz2 + + name + windows64 + + + version + 352.539058 + + ogg_vorbis + + copyright + Copyright (c) 2002, Xiph.org Foundation + description + Audio encoding library + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + name + ogg_vorbis + platforms + + darwin + + archive + + hash + 07fca1531a27915f642a5c1d95008d54 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oggvorbis_3p-update-oggvorbis/rev/296878/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2.296878-darwin-296878.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + a066f1d12caee1d87fc72f48169f9677 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54841/510071/ogg_vorbis-1.3.3-1.3.6.538971-darwin64-538971.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 5c9d94dce4551b19790057766ff939ea + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-oggvorbis/rev/314224/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2.314224-linux-314224.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 45ebd074053dc9cae8c5c74b52085d4b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/465/990/ogg_vorbis-1.2.2-1.3.2.500397-linux64-500397.tar.bz2 + + name + linux64 + + windows + + archive + + hash + d4b8ed3fd679a2b484d2d1a66c063908 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54981/511789/ogg_vorbis-1.3.3-1.3.6.538971-windows-538971.tar.bz2 + + name + windows + + windows64 + + archive + + hash + ec4a657fe639bb458ee5132062146a7a + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54980/511782/ogg_vorbis-1.3.3-1.3.6.538971-windows64-538971.tar.bz2 + + name + windows64 + + + version + 1.3.3-1.3.6.538971 + + open-libndofdev + + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) + description + Open Source replacement for 3DConnection SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + open-libndofdev + platforms + + linux + + archive + + hash + b1245d467d5914a266efa16afeb55406 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297553/arch/Linux/installer/open_libndofdev-0.3-linux-297553.tar.bz2 + + name + linux + + + version + 0.3 + + openal + + copyright + Creative Labs + description + OpenAL is a cross-platform 3D audio API appropriate for use with gaming applications and many other types of audio applications. + license + lgpl + license_file + LICENSES/openal.txt + name + openal + platforms + + linux + + archive + + hash + 24b91eda3831a51c7774644016c4cb09 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/Linux/installer/openal-1.12.854-1.1.0.314223-linux-314223.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 7530fab3979312da75a903d87b73e3a9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/Linux/installer/openal-1.12.854-1.1.0.314223-linux64-314223.tar.bz2 + + name + linux64 + + windows + + archive + + hash + d9c86f79a6bb56a670e2801c33fd2dd1 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/CYGWIN/installer/openal-1.12.854-1.1.0.314223-windows-314223.tar.bz2 + + name + windows + + windows64 + + archive + + hash + e0fdd9394a8cd8c6360b922f6f237e57 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openal/rev/314223/arch/CYGWIN/installer/openal-1.12.854-1.1.0.314223-windows64-314223.tar.bz2 + + name + windows64 + + + version + 1.12.854-1.1.0.314223 + + openjpeg + + copyright + Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium; Copyright (c) 2002-2007, Professor Benoit Macq; Copyright (c) 2001-2003, David Janssens; Copyright (c) 2002-2003, Yannick Verschueren; Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe; Copyright (c) 2005, Herve Drolon, FreeImage Team; Copyright (c) 2006-2007, Parvatha Elangovan; Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>; Copyright (c) 2010-2011, Kaori Hagihara; Copyright (c) 2011-2012, Centre National d'Etudes Spatiales (CNES), France; Copyright (c) 2012, CS Systemes d'Information, France; + description + The OpenJPEG library is an open-source JPEG 2000 codec written in C language. + license + BSD + license_file + LICENSES/openjpeg.txt + name + openjpeg + platforms + + darwin + + archive + + hash + 2adb5b8bd2493d576c5d02b992d8f819 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openjpeg_3p-update-openjpeg/rev/297018/arch/Darwin/installer/openjpeg-1.4.297018-darwin-297018.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 5abf2d9c0b250821c59cc60cd94fd8af + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54840/510064/openjpeg-1.5.1.538970-darwin64-538970.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + e82317482647559d46a818ba48e9423a + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openjpeg/rev/314205/arch/Linux/installer/openjpeg-2.0.0.314205-linux-314205.tar.bz2 + + name + linux + + linux64 + + archive + + hash + ac66f3197010b1549a5e4467aebbc27d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/1113/2571/openjpeg-1.5.1.501102-linux64-501102.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 222a406ecb4071a9cc9635353afa337e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54977/511775/openjpeg-1.5.1.538970-windows-538970.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 5b5c80807fa8161f3480be3d89fe9516 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54974/511767/openjpeg-1.5.1.538970-windows64-538970.tar.bz2 + + name + windows64 + + + version + 1.5.1.538970 + + openssl + + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library + license + openssl + license_file + LICENSES/openssl.txt + name + openssl + platforms + + darwin + + archive + + hash + 0a77d56769e6075957f614be6575423e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openssl_3p-update-openssl/rev/297168/arch/Darwin/installer/openssl-1.0.1h.297168-darwin-297168.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 5503e4928bcdb0a29685b3242c4a409b + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82619/774464/openssl-1.1.1l.560177-darwin64-560177.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + f46a601d60b7dbcfde32afc0cb64453e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-openssl/rev/314227/arch/Linux/installer/openssl-1.0.1h.314227-linux-314227.tar.bz2 + + name + linux + + linux64 + + archive + + hash + d50ccfbf0c1d249392919e2c46ad8d5c + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/8339/33495/openssl-1.0.2l.508328-linux64-508328.tar.bz2 + + name + linux64 + + windows + + archive + + hash + d2153f20dc2d35c609b876a9f019a748 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82623/774521/openssl-1.1.1l.560177-windows-560177.tar.bz2 + + name + windows + + windows64 + + archive + + hash + f40b8622ba38084b0962e273988d748f + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/82624/774520/openssl-1.1.1l.560177-windows64-560177.tar.bz2 + + name + windows64 + + + version + 1.1.1l.560177 + + pcre + + copyright + Copyright (c) 1997-2014 University of Cambridge; Copyright(c) 2009-2014 Zoltan Herczeg; Copyright (c) 2007-2012, Google Inc. + description + PCRE Perl-compatible regular expression library + license + bsd + license_file + LICENSES/pcre-license.txt + name + pcre + platforms + + darwin + + archive + + hash + 6d2b38897f1adf354b299345d5fc759b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/pcre_3p-update-pcre/rev/297155/arch/Darwin/installer/pcre-8.35.-darwin-297155.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + d8c0f97fe5abef43e72b6f84aba698b2 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/54856/510176/pcre-8.35.538986-darwin64-538986.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 24a119b18e63017ad932ad54df8161bc + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-pcre/rev/314136/arch/Linux/installer/pcre-8.35.314136-linux-314136.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 0f058ca2176e7d02d51e54c66a96f336 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/908/2010/pcre-8.35.500898-linux64-500898.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 3660db45793df3050b63920bfb7d8479 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55041/512002/pcre-8.35.538986-windows-538986.tar.bz2 + + name + linux + + windows64 + + archive + + hash + cdee8e8b48a66266550bf279c40abc22 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55038/511992/pcre-8.35.538986-windows64-538986.tar.bz2 + + name + windows64 + + + version + 8.35.538986 + + slvoice + + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) + description + Vivox SDK components + license + Mixed + license_file + LICENSES/vivox_licenses.txt + name + slvoice + platforms + + darwin + + archive + + hash + 511a9c3fd4b6c76a8a737d06bba1c291 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oz-426-slvoice/rev/330003/arch/Darwin/installer/slvoice-4.9.0002.27586.330003-darwin-330003.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 6ce3cbaed968a69fb7a2cca80220874d + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80380/758537/slvoice-4.10.0000.32327.5fc3fe7c.558436-darwin64-558436.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 785c86999b56e1838cefb430f674cba7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oz-426-slvoice/rev/330003/arch/Linux/installer/slvoice-3.2.0002.10426.330003-linux-330003.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 92b0ae08832bd0e99c34ef8f3e6346ad + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/613/1289/slvoice-3.2.0002.10426.500605-linux64-500605.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 2eb38c5eff4d0f18fbb89d0c30c4f0a4 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80382/758550/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows-558436.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 9ee8f3cbc5369c598a998c61961ed16d + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/80381/758551/slvoice-4.10.0000.32327.5fc3fe7c.558436-windows64-558436.tar.bz2 + + name + windows64 + + + version + 4.10.0000.32327.5fc3fe7c.558436 + + tracy + + canonical_repo + https://bitbucket.org/lindenlab/3p-tracy + copyright + Copyright (c) 2017-2021, Bartosz Taudul (wolf@nereid.pl) + description + Tracy Profiler Library + license + bsd + license_file + LICENSES/tracy_license.txt + name + tracy + platforms + + darwin64 + + archive + + hash + da7317e4a81609f624f84780f28b07de + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/86972/801630/tracy-v0.7.8.563351-darwin64-563351.tar.bz2 + + name + darwin64 + + windows + + archive + + hash + 47c696cd2966c5cc3c8ba6115dd1f886 + hash_algorithm + md5 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/86973/801641/tracy-v0.7.8.563351-windows-563351.tar.bz2 + + name + windows + + windows64 + + archive + + hash + b649ee6591e67d2341e886b3fc3484a7 + hash_algorithm + md5 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/86974/801642/tracy-v0.7.8.563351-windows64-563351.tar.bz2 + + name + windows64 + + + source + https://bitbucket.org/lindenlab/3p-tracy + source_type + git + version + v0.7.8.563351 + + tut + + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek + description + TUT is a small and portable unit test framework for C++. + license + bsd + license_file + LICENSES/tut.txt + name + tut + platforms + + common + + archive + + hash + 64e1c979aea2f74fe9c2d9d04573336d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55001/511871/tut-2008.11.30-common-539059.tar.bz2 + + name + common + + + version + 2008.11.30 + + uriparser + + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. + license + New BSD license + license_file + LICENSES/uriparser.txt + name + uriparser + platforms + + darwin + + archive + + hash + 22608adaf54e8ddc9182a719ba6e2b32 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Darwin/installer/uriparser-0.8.0.1-darwin-299435.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + c42575ac8997de979eadb082c33a578e + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81322/765512/uriparser-0.9.4-darwin64-559132.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + dddfc8dea540801f93ba0382cb1e3685 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Linux/installer/uriparser-0.8.0.1-linux-299435.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 087375378f104cdac0cb0fe0ca43dd4d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/346/880/uriparser-0.8.0.1-linux64-500342.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 901b1063556fc6b2575e745eef2bf744 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81323/765528/uriparser-0.9.4-windows-559132.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 962c01d553f286c430102998129fb0d6 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/81324/765527/uriparser-0.9.4-windows64-559132.tar.bz2 + + name + windows64 + + + version + 0.9.4 + + viewer-manager + + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab Viewer Management Process suite. + license + viewerlgpl + license_file + LICENSE + name + viewer-manager + platforms + + darwin64 + + archive + + hash + 6989053898b8e81e904e75553e378820 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77523/735051/viewer_manager-2.0.556340-darwin64-556340.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 8c7f32f85850248809ae811ba8e47d81 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/ct2/3428/8686/viewer_manager-1.0-linux-503417.tar.bz2 + + name + linux + + windows + + archive + + hash + 3446c1e54bb32542677caad0ec0d42ac + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/77525/735058/viewer_manager-2.0.556340-windows-556340.tar.bz2 + + name + windows + + + source + https://bitbucket.org/lindenlab/vmp-standalone + source_type + hg + version + 2.0.556340 + + vlc-bin + + copyright + Copyright (C) 1998-2016 VLC authors and VideoLAN + license + GPL2 + license_file + LICENSES/vlc.txt + name + vlc-bin + platforms + + darwin64 + + archive + + hash + b639d0035f4a8c9b4973be428a1b7e61 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69569/671323/vlc_bin-3.0.9.549888-darwin64-549888.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 2f410640df3f9812d1abff02a414cfa8 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-vlc-bin/rev/315283/arch/Linux/vlc_bin-2.2.3-linux-201606011750-r10.tar.bz2 + + name + linux + + windows + + archive + + hash + 4f50b0c47daa081dd4fcb83763d5b0b2 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69567/671314/vlc_bin-3.0.9.549888-windows-549888.tar.bz2 + + name + windows + + windows64 + + archive + + hash + c2f8c01fb6c261b72beb07f0c4cd423f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/69568/671315/vlc_bin-3.0.9.549888-windows64-549888.tar.bz2 + + name + windows64 + + + version + 3.0.9.549888 + + xmlrpc-epi + + copyright + Copyright: (C) 2000 Epinions, Inc. + description + XMLRPC Library + license + xmlrpc-epi + license_file + LICENSES/xmlrpc-epi.txt + name + xmlrpc-epi + platforms + + darwin + + archive + + hash + ffd3aab8e0c0ff6dadbce49ca2809078 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/xmlrpc-emi_3p-update-xmlrpc-epi/rev/297075/arch/Darwin/installer/xmlrpc_epi-0.54.1.297075-darwin-297075.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 922a0dea32266897ed1911200438e1e1 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76372/727426/xmlrpc_epi-0.54.1.555529-darwin64-555529.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + b63f828e798287d475991134cdcfbca3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-xmlrpc-epi/rev/314240/arch/Linux/installer/xmlrpc_epi-0.54.1.314240-linux-314240.tar.bz2 + + name + linux + + linux64 + + archive + + hash + 35df17c3eb673030dea4bde9191aa506 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/727/1489/xmlrpc_epi-0.54.1.500719-linux64-500719.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 34b847e6b280048465fe7c6ce67fe05c + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76374/727436/xmlrpc_epi-0.54.1.555529-windows-555529.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 8fbe7c4ea22bb7f23a93c73884ebb34c + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/76373/727435/xmlrpc_epi-0.54.1.555529-windows64-555529.tar.bz2 + + name + windows64 + + + version + 0.54.1.555529 + + zlib + + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + Zlib Data Compression Library + license + zlib + license_file + LICENSES/zlib.txt + name + zlib + platforms + + darwin + + archive + + hash + 1a79eeac199c2d94e4ae4e5d0194e25f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/zlib_3p-update-zlib/rev/296881/arch/Darwin/installer/zlib-1.2.8.296881-darwin-296881.tar.bz2 + + name + darwin + + darwin64 + + archive + + hash + 9181bc8229f1a8e480d2a40a2744ec28 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78578/743913/zlib-1.2.11.557041-darwin64-557041.tar.bz2 + + name + darwin64 + + linux + + archive + + hash + 98a8c775c581ca80bb559e8b4e8eaae7 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/p64_3p-zlib/rev/314131/arch/Linux/installer/zlib-1.2.8.314131-linux-314131.tar.bz2 + + name + linux + + linux64 + + archive + + hash + dab6be8b0596c1e3354f2b6d41335131 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/866/1898/zlib-1.2.8.500857-linux64-500857.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 8308cbd2ea0fe290541698b0f63482e2 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78579/743926/zlib-1.2.11.557041-windows-557041.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 36bdc34f67d3ad3c57125dc1b16a3129 + url + https://automated-builds-secondlife-com.s3.amazonaws.com/ct2/78577/743920/zlib-1.2.11.557041-windows64-557041.tar.bz2 + + name + windows64 + + + version + 1.2.11.557041 + + + package_description + + canonical_repo + https://bitbucket.org/lindenlab/viewer + copyright + Copyright (c) 2020, Linden Research, Inc. + description + Second Life Viewer + license + LGPL + license_file + docs/LICENSE-source.txt + name + Second Life Viewer + platforms + + common + + configurations + + RelWithDebInfo + + build + + + configure + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo + -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=TRUE + + + name + RelWithDebInfo + + RelWithDebInfoOS + + configure + + arguments + + ../indra + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo + -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=FALSE + + + name + RelWithDebInfoOS + + Release + + build + + + configure + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=Release + -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=TRUE + + + name + Release + + ReleaseOS + + configure + + arguments + + ../indra + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=Release + -DADDRESS_SIZE:STRING=$AUTOBUILD_ADDRSIZE + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=FALSE + + + name + ReleaseOS + + + name + common + + darwin64 + + build_directory + build-darwin-x86_64 + configurations + + RelWithDebInfo + + build + + command + xcodebuild + options + + -configuration + RelWithDebInfo + -project + SecondLife.xcodeproj + + + configure + + arguments + + ../indra + + options + + -G + Xcode + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + command + xcodebuild + options + + -configuration + RelWithDebInfo + -project + SecondLife.xcodeproj + + + configure + + options + + -G + Xcode + + + name + RelWithDebInfoOS + + Release + + build + + command + xcodebuild + options + + -configuration + Release + -project + SecondLife.xcodeproj + + + configure + + arguments + + ../indra + + options + + -G + Xcode + + + name + Release + + ReleaseOS + + build + + command + xcodebuild + options + + -configuration + Release + -project + SecondLife.xcodeproj + + + configure + + options + + -G + Xcode + + + name + ReleaseOS + + + name + darwin64 + + linux + + build_directory + build-linux-i686 + configurations + + RelWithDebInfo + + build + + command + make + options + + -j + 12 + + + configure + + arguments + + ../indra + + options + + -G + Unix Makefiles + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + command + make + options + + -j + 7 + + + configure + + options + + -G + Unix Makefiles + + + name + RelWithDebInfoOS + + Release + + build + + command + make + options + + -j + 12 + + + configure + + arguments + + ../indra + + options + + -G + Unix Makefiles + + + name + Release + + ReleaseOS + + build + + command + make + options + + -j + 7 + + + configure + + options + + -G + Unix Makefiles + + + name + ReleaseOS + + default + + build + + + name + default + + + name + linux + + windows + + build_directory + build-vc${AUTOBUILD_VSVER|150}-$AUTOBUILD_ADDRSIZE + configurations + + RelWithDebInfo + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + RelWithDebInfo|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + + + configure + + arguments + + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=RelWithDebInfo + /p:Platform=${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + /t:Build + /p:useenv=true + /verbosity:minimal + /toolsversion:4.0 + /p:VCBuildAdditionalOptions= /incremental + + + configure + + arguments + + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DOPENAL:BOOL=ON + + + name + RelWithDebInfoOS + + Release + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + Release|${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + + + configure + + arguments + + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + + + name + Release + + ReleaseOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=Release + /p:Platform=${AUTOBUILD_WIN_VSPLATFORM|NOTWIN} + /t:Build + /p:useenv=true + /verbosity:minimal + /toolsversion:4.0 + /p:VCBuildAdditionalOptions= /incremental + + + configure + + arguments + + ..\indra + + options + + -G + ${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN} + -DUNATTENDED:BOOL=ON + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + -DOPENAL:BOOL=ON + + + name + ReleaseOS + + + name + windows + + + version_file + newview/viewer_version.txt + + type + autobuild + version + 1.3 + + diff --git a/tests/llsd_test.py b/tests/llsd_test.py index 39539b1..073a974 100644 --- a/tests/llsd_test.py +++ b/tests/llsd_test.py @@ -12,14 +12,17 @@ import time import unittest import uuid +from os import path import pytest import llsd -from llsd.base import PY2, is_integer, is_string, is_unicode, MAX_FORMAT_DEPTH, MAX_PARSE_DEPTH +from llsd.base import PY2, is_integer, is_string, is_unicode, MAX_FORMAT_DEPTH from llsd.serde_xml import remove_invalid_xml_bytes from tests.fuzz import LLSDFuzzer +FIXTURES_DIR = path.join(path.dirname(__file__), 'fixtures') + class Foo(object): """ @@ -1405,6 +1408,15 @@ def testBinary(self): python_binary = llsd.binary(b''); self.assertXMLRoundtrip(python_binary, blank_binary_xml) + + @pytest.mark.skipif(PY2, reason="Object order between python 2 and 3 differs") + def testViewerAutobuildRoundTrip(self): + """Test that llsd does not muck up the viewer autobuild""" + with open(path.join(FIXTURES_DIR, "viewer-autobuild.xml"), "rb") as f: + autobuild_bytes = f.read() + autobuild_parsed = llsd.parse_xml(autobuild_bytes) + assert autobuild_bytes.decode("utf8") == llsd.format_pretty_xml(autobuild_parsed).decode("utf8") + def testXMLOfAllTypes(self): """ @@ -1519,7 +1531,8 @@ def testFormatPrettyXML(self): -""") + +""") # check whether the output_xml contains whitespaces and new line character whitespaces_count = output_xml.count(b' ') diff --git a/tox.ini b/tox.ini index 7a27bb7..2af420c 100644 --- a/tox.ini +++ b/tox.ini @@ -5,4 +5,4 @@ envlist = py27, py37, py38, py310 setenv = COVERAGE_FILE = .coverage.{envname} deps = .[dev] -commands = pytest --cov=llsd --cov-report=xml:.coverage.{envname}.xml tests/ \ No newline at end of file +commands = pytest -vv --cov=llsd --cov-report=xml:.coverage.{envname}.xml tests/ From 1868e7c270733f3400b8e09279ed0e8a7111f27a Mon Sep 17 00:00:00 2001 From: Natty Linden Date: Tue, 18 Jun 2024 20:55:18 +0000 Subject: [PATCH 51/52] Update pre-commit hooks to avoid isort installation error These are the current versions as identified by `pre-commit autoupdate`. To install the isort hook, pre-commit will install whatever the newest Poetry is. A backward incompatible change in Poetry broke support for how isort was declaring its "extra" dependency on pip-shims, so existing isorts became no longer installable. Upgrade the isort hook to 5.12.0+ so we get their pyproject.toml fix: Co-authored-by: Phronimos Linden <40007007+phronimos-linden@users.noreply.github.com> --- .pre-commit-config.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e5f01bc..fae0520 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,13 +1,13 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.3.0 + rev: v4.6.0 hooks: - id: check-ast - id: check-yaml - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/pycqa/isort - rev: 5.10.1 + rev: 5.13.2 hooks: - id: isort args: [--line-length=120] From 14fcbc852207cb0d20bcf0989ae5c97e9c226f2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Mar 2025 12:24:06 +0000 Subject: [PATCH 52/52] Bump codecov/codecov-action from 4 to 5 Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 4 to 5. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v4...v5) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a8a9f76..a64cd45 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -48,7 +48,7 @@ jobs: run: python -m build - name: Upload coverage - uses: codecov/codecov-action@v4 + uses: codecov/codecov-action@v5 if: matrix.python-version == '3.10' with: token: ${{ secrets.CODECOV_TOKEN }}