This patch updates `mctf.py` so that it converts a JSON array found in
the part named `metadata` to a JSON text sequence.
This makes it possible to write a CTF 2 metadata part without the odd
RS characters, for example:
--- metadata
[
{
"type": "preamble",
"version": 2
},
{
"type": "trace-class"
},
{
"type": "data-stream-class"
},
{
"name": "test",
"payload-field-class": {
"member-classes": [
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu1a"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu1b"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu2"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu3"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu4"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu5"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu6"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu7"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu8"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu9"
},
{
"field-class": {
"type": "variable-length-unsigned-integer"
},
"name": "vu10"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi1a"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi1b"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi1c"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi2"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi3"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi4"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi5"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi6"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi7"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi8"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi9"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi10a"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi10b"
},
{
"field-class": {
"type": "variable-length-signed-integer"
},
"name": "vi10c"
}
],
"type": "structure"
},
"type": "event-record-class"
}
]
--- my-stream
[0 : uleb128] # `vu1a`
[77 : uleb128] # `vu1b`
[177 : uleb128] # `vu2`
[43123 : uleb128] # `vu3`
[
21829382 : uleb128] # `vu4`
[
5121829382 : uleb128] # `vu5`
[
95121829382 : uleb128] # `vu6`
[
13895121829382 : uleb128] # `vu7`
[
913895121855555 : uleb128] # `vu8`
[
333333333333333333 : uleb128] # `vu9`
[
18446744073709551615 : uleb128] # `vu10`
[0 : sleb128] # `vi1a`
[-1 : sleb128] # `vi1b`
[23 : sleb128] # `vi1c`
[-156 : sleb128] # `vi2`
[8556 : sleb128] # `vi3`
[-
100101001 : sleb128] # `vi4`
[
8288491823 : sleb128] # `vi5`
[-
171717171717 : sleb128] # `vi6`
[
123456787654321 : sleb128] # `vi7`
[-
1121231234123450 : sleb128] # `vi8`
[
99999999999999999 : sleb128] # `vi9`
[
9223372036853775807 : sleb128] # `vi10a`
[
9223372036854775807 : sleb128] # `vi10b`
[-
9223372036854775808 : sleb128] # `vi10c`
Detecting `[` as the first character of the part is enough because a
CTF 1.8 TSDL metadata text never starts with `[`.
Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
Change-Id: Ic1d6fb1644870f3b951d26238f82c79d7f3cf25a
Reviewed-on: https://review.lttng.org/c/babeltrace/+/12772
) from e
+def _reformat_ctf_2_metadata(content: str):
+ import json
+
+ json_seq_fragments = [] # type: list[str]
+
+ for fragment in json.loads(content):
+ json_seq_fragments.append("\x1e{}".format(json.dumps(fragment, indent=2)))
+
+ return "\n".join(json_seq_fragments)
+
+
+def _reformat_metadata(content: str):
+ content = content.strip() + "\n"
+
+ if content.startswith("["):
+ # CTF 2: JSON array to JSON text sequence
+ return _reformat_ctf_2_metadata(content)
+
+ return content
+
+
def _generate_from_part(
part: moultipart.Part,
base_dir: str,
):
content = part.content
- if part.header_info != "metadata":
+ if part.header_info == "metadata":
+ content = _reformat_metadata(content)
+ else:
res = _normand_parse(part, normand_vars, normand_labels)
content = res.data
normand_vars = res.variables