SonarQube代码覆盖率报告以绝对路径生成

时间:2020-05-09 22:16:44

标签: ios swift bash sonarqube code-coverage

我使用以下script生成了SonarQube通用代码覆盖率:

#!/usr/bin/env bash
set -euo pipefail

function convert_file {
  local xccovarchive_file="$1"
  local file_name="$2"
  local xccov_options="$3"
  echo "  <file path=\"$file_name\">"
  xcrun xccov view $xccov_options --file "$file_name" "$xccovarchive_file" | \
    sed -n '
    s/^ *\([0-9][0-9]*\): 0.*$/    <lineToCover lineNumber="\1" covered="false"\/>/p;
    s/^ *\([0-9][0-9]*\): [1-9].*$/    <lineToCover lineNumber="\1" covered="true"\/>/p
    '
  echo '  </file>'
}

function xccov_to_generic {
  echo '<coverage version="1">'
  for xccovarchive_file in "$@"; do
    local xccov_options=""
    if [[ $xccovarchive_file == *".xcresult"* ]]; then
      xccov_options="--archive"
    fi
    xcrun xccov view $xccov_options --file-list "$xccovarchive_file" | while read -r file_name; do
      convert_file "$xccovarchive_file" "$file_name" "$xccov_options"
    done
  done
  echo '</coverage>'
}

xccov_to_generic "$@"

报告生成成功,但是文件路径是绝对的

正在生成什么: /Users/daniyal/MyApp/AccountStore/AccountStore/AccountProvider.swift

我想要什么 AccountStore/AccountStore/AccountProvider.swift

当前正在生成的sonarqube-generic-coverage.xml的摘录

<coverage version="1">
  <file path="/Users/daniyal/MyApp/AccountStore/AccountStore/AccountProvider.swift">
    <lineToCover lineNumber="27" covered="true"/>
    <lineToCover lineNumber="28" covered="true"/>
    <lineToCover lineNumber="29" covered="true"/>
    <lineToCover lineNumber="30" covered="true"/>
    <lineToCover lineNumber="31" covered="true"/>
    <lineToCover lineNumber="33" covered="true"/>
    <lineToCover lineNumber="34" covered="true"/>
    <lineToCover lineNumber="35" covered="true"/>
    <lineToCover lineNumber="38" covered="true"/>
    <lineToCover lineNumber="39" covered="true"/>
  </file>
</coverage>

2 个答案:

答案 0 :(得分:1)

正在生成什么:/Users/daniyal/MyApp/AccountStore/AccountStore/AccountProvider.swift

我想要的AccountStore/AccountStore/AccountProvider.swift

要从变量中修剪前缀,请使用# expansion operator

$ echo "$PWD" # PWD is set by the shell
/home/me

$ my_absolute_path=/home/me/some/file.txt

$ echo "Relative path: ${my_absolute_path#${PWD}/}"
Relative path: some/file.txt

这将从${PWD}/的开头开始修剪${my_absolute_path},剩下的是相对于当前工作目录的文件路径。

因此,请尝试:

echo "  <file path=\"${file_name#${PWD}/}\">"

对于更高级的相对路径处理,我建议使用this approach,但是如果您从绝对路径开始,则只需要上述路径即可。


还考虑使用printf输出格式化的文本;与转义引号和echo-ing相比,类似这样的内容将更具可读性,并且可能更易于使用:

printf '  <file path="%s">\n' "${file_name#${PWD}/}"

答案 1 :(得分:-1)

在那个script

将此行更改为:

  convert_file "$xccovarchive_file" "$file_name" "$xccov_options"

到以下:

 convert_file "$xccovarchive_file" "$(echo ${file_name} | cut -d'/' -f5-)" "$xccov_options"

您可以将数字5调整为您想要的其他名称。


替代方法:

您可以通过:"AccountStore${file_name#*AccountStore}"

-或- 您可以更改以下行:local file_name="$2",例如local file_name="AccountStore${2#*AccountStore}"