blob: 1b57c53ec6b6e8a259445d4794228b4c1940ddd4 [file] [log] [blame]
E. Scott Daniels5efb1e62019-05-02 17:09:35 +00001#!/usr/bin/env ksh
2
3#==================================================================================
4# Copyright (c) 2019 Nokia
5# Copyright (c) 2018-2019 AT&T Intellectual Property.
6#
7# Licensed under the Apache License, Version 2.0 (the "License");
8# you may not use this file except in compliance with the License.
9# You may obtain a copy of the License at
10#
11# http://www.apache.org/licenses/LICENSE-2.0
12#
13# Unless required by applicable law or agreed to in writing, software
14# distributed under the License is distributed on an "AS IS" BASIS,
15# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16# See the License for the specific language governing permissions and
17# limitations under the License.
18#==================================================================================
19
20
21#
22# Mnemonic: cov2xml.ksh
23# Abstract: Process the coverage file(s) which are read from standard in
24# to generate a single set of XML output that Sonar can ingest.
25# Basic usage is:
26# cat *.gcov | cov2xml.ksh >file.xml
27#
28# The XML generated is based on the Sonar doc:
29# https://docs.sonarqube.org/latest/analysis/generic-test/
30#
31# Date: 30 April 2019
32# Author: E. Scott Daniels
33# -------------------------------------------------------------------------
34
35awk '
36 function start() {
37 printf( "<coverage version=\"1\">\n" ) # sonar is VERY picky about this
38 }
39
40 function end() {
41 printf( "</coverage>\n" )
42 }
43
44 function start_file( name ) {
45 printf( "<file path=\"%s\">\n", name )
46 }
47
48 function end_file( ) {
49 printf( "</file>\n" )
50 }
51
52 function good_line( num ) {
53 if( num > 0 ) {
54 printf( "<lineToCover lineNumber=\"%d\" covered=\"true\"/>\n", num )
55 }
56 }
57
58 function bad_line( num ) {
59 if( num > 0 ) {
60 printf( "<lineToCover lineNumber=\"%d\" covered=\"false\"/>\n", num )
61 }
62 }
63
64 BEGIN {
65 start()
66 }
67
68 /Source:/ {
69 gsub( "../src", "src", $0 ) # sonar doesnt view test dir as root, so strip
70 n = split( $0, a, ":" )
71 if( fip ) {
72 end_file()
73 }
74 fip = 1
75 start_file( a[n] )
76 next;
77 }
78
79 /-:/ { next } # not executable
80
81 /#####:/ { # never executed
82 bad_line( $2 + 0 )
83 next
84 }
85
86 {
87 good_line( $2 + 0 )
88 }
89
90 END {
91 if( fip ) {
92 end_file();
93 }
94
95 end()
96 }
97' $1
98
99exit $/
100