diff mbox series

[meta-python,kirkstone,v2] python3-gcovr: Fix parsing of gcc-11 gcov metadata

Message ID 20230719105726.20220-1-jasper@fancydomain.eu
State New
Headers show
Series [meta-python,kirkstone,v2] python3-gcovr: Fix parsing of gcc-11 gcov metadata | expand

Commit Message

Jasper Orschulko July 19, 2023, 10:57 a.m. UTC
gcc-11 has metadata line "-: 0:Source is newer than graph" which throws an
error.

Backported from gcovr 5.2, as kirkstone release uses gcc-11.

Signed-off-by: Jasper Orschulko <jasper@fancydomain.eu>
---
 ...001-Fix-parsing-of-gcov-metadata-601.patch | 84 +++++++++++++++++++
 .../python/python3-gcovr_5.1.bb               |  1 +
 2 files changed, 85 insertions(+)
 create mode 100644 meta-python/recipes-devtools/python/python3-gcovr/0001-Fix-parsing-of-gcov-metadata-601.patch
diff mbox series

Patch

diff --git a/meta-python/recipes-devtools/python/python3-gcovr/0001-Fix-parsing-of-gcov-metadata-601.patch b/meta-python/recipes-devtools/python/python3-gcovr/0001-Fix-parsing-of-gcov-metadata-601.patch
new file mode 100644
index 000000000..5530a3985
--- /dev/null
+++ b/meta-python/recipes-devtools/python/python3-gcovr/0001-Fix-parsing-of-gcov-metadata-601.patch
@@ -0,0 +1,84 @@ 
+From c4f53f28c4c537b75b5912a44083c41262807504 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Michael=20F=C3=B6rderer?= <michael.foerderer@gmx.de>
+Date: Sun, 3 Apr 2022 22:58:33 +0200
+Subject: [PATCH] Fix parsing of gcov metadata (#601)
+
+gcc-11 has metadata line "-: 0:Source is newer than graph" which throws an error.
+
+Upstream-Status: Backport [https://github.com/gcovr/gcovr/commit/7b6947bd4b6fd28a477606313fff3c13fcea8d3d]
+
+Signed-off-by: Jasper Orschulko <jasper@fancydomain.eu>
+---
+ gcovr/gcov.py        |  5 ++++-
+ gcovr/gcov_parser.py | 24 ++++++++++++++++++++----
+ 2 files changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/gcovr/gcov.py b/gcovr/gcov.py
+index cc7a9af4..ff4cdb0b 100644
+--- a/gcovr/gcov.py
++++ b/gcovr/gcov.py
+@@ -98,8 +98,11 @@ def process_gcov_data(data_fname, covdata, source_fname, options, currdir=None):
+     # Find the source file
+     # TODO: instead of heuristics, use "working directory" if available
+     metadata = parse_metadata(lines)
++    source = metadata.get("Source")
++    if source is None:
++        raise RuntimeError("Unexpected value 'None' for metadata 'Source'.")
+     fname = guess_source_file_name(
+-        metadata["Source"].strip(),
++        source,
+         data_fname,
+         source_fname,
+         root_dir=options.root_dir,
+diff --git a/gcovr/gcov_parser.py b/gcovr/gcov_parser.py
+index 391ecd78..523ea406 100644
+--- a/gcovr/gcov_parser.py
++++ b/gcovr/gcov_parser.py
+@@ -121,7 +121,7 @@ class _MetadataLine(NamedTuple):
+     """A gcov line with metadata: ``-: 0:KEY:VALUE``"""
+
+     key: str
+-    value: str
++    value: Optional[str]
+
+
+ class _BlockLine(NamedTuple):
+@@ -214,7 +214,19 @@ def parse_metadata(lines: List[str]) -> Dict[str, str]:
+     ...   -: 0:Foo:bar
+     ...   -: 0:Key:123
+     ... '''.splitlines())
+-    {'Foo': 'bar', 'Key': '123'}
++    Traceback (most recent call last):
++       ...
++    RuntimeError: Missing key 'Source' in metadata. GCOV data was >>
++      -: 0:Foo:bar
++      -: 0:Key:123<< End of GCOV data
++    >>> parse_metadata('-: 0:Source: file \n -: 0:Foo: bar \n -: 0:Key: 123 '.splitlines())
++    {'Source': 'file', 'Foo': 'bar', 'Key': '123'}
++    >>> parse_metadata('''
++    ...   -: 0:Source:file
++    ...   -: 0:Foo:bar
++    ...   -: 0:Key
++    ... '''.splitlines())
++    {'Source': 'file', 'Foo': 'bar', 'Key': None}
+     """
+     collected = {}
+     for line in lines:
+@@ -721,8 +733,12 @@ def _parse_line(line: str) -> _Line:
+
+         # METADATA (key, value)
+         if count_str == "-" and lineno == "0":
+-            key, value = source_code.split(":", 1)
+-            return _MetadataLine(key, value)
++            if ":" in source_code:
++                key, value = source_code.split(":", 1)
++                return _MetadataLine(key, value.strip())
++            else:
++                # Add a syntethic metadata with no value
++                return _MetadataLine(source_code, None)
+
+         if count_str == "-":
+             count = 0
+--
+2.41.0
+
diff --git a/meta-python/recipes-devtools/python/python3-gcovr_5.1.bb b/meta-python/recipes-devtools/python/python3-gcovr_5.1.bb
index 1c4279fd1..9ab8aa9a8 100644
--- a/meta-python/recipes-devtools/python/python3-gcovr_5.1.bb
+++ b/meta-python/recipes-devtools/python/python3-gcovr_5.1.bb
@@ -5,6 +5,7 @@  LICENSE = "BSD-3-Clause"
 LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=08208c66520e8d69d5367483186d94ed"
 
 SRC_URI = "git://github.com/gcovr/gcovr.git;branch=master;protocol=https"
+SRC_URI += "file://0001-Fix-parsing-of-gcov-metadata-601.patch"
 SRCREV = "e71e883521b78122c49016eb4e510e6da06c6916"
 
 S = "${WORKDIR}/git"