покрытие кода lcov - команда удаления с входной переменной не работает - PullRequest
1 голос
/ 29 мая 2019

Описание проблемы

Я пытаюсь отфильтровать каталоги, которые мы не хотим игнорировать для тестового покрытия.Для этого мы используем Lcov.

Когда я пытаюсь поместить каталоги, которые должны игнорироваться, в переменную __ignoreinput, команда #${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null не работает, она ничего не фильтрует.Принимая во внимание, что когда я использую команду без __ignoreinput, как в

 ${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi

Фильтр работает нормально.Что я делаю неправильно.Я не понимаю.


Сценарий

#!/bin/bash
__orc=/home/anybody/workspace/project
__buildtype="local"
__output=/home/anybody/workspace/lcov


#doe not work
#__ignoreinput="'/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*'"
#__ignoreinput="/opt/* /usr/include/* *3rdParty/* *Input_API/* *Grammars/* "
#__ignoreinput="\"/opt/*\" \"/usr/include/*\" \"*3rdParty/*\" \"*Input_API/*\" \"*Grammars/*\""


__gcovopts=--gcov-tool=/opt/1A/x86_64-2.6.32-v2/bin/gcov
__lcov=lcov
if [[ "${__buildtype}" == "docker" ]] ;then
  __build=MYCODE/build_x86_64-2.6.32-v2_Gcov
else
  __build=MYCODE/cmake-build-coverage
fi

echo "Filter lcov tracefile"
cd ${__orc}/${__build}
#does not work
#${__lcov} ${__gcovopts} --remove MYCODE.info "${__ignoreinput}" -o MYCODE_filtered.info > /dev/null 2> /dev/null

#works
${__lcov} ${__gcovopts} --remove MYCODE.info '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' -o MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov filtrering failed" && exit 1 ;fi

echo "Generate HTML reports"
cd ${__orc}/${__build}
genhtml --ignore-errors source -o ${__output}/lcov_"$(git rev-list HEAD -n 1)" MYCODE_filtered.info > /dev/null 2> /dev/null
if [[ ${?} -ne 0 ]] ;then echo "Error *** lcov reports failed" && exit 1 ;fi

1 Ответ

1 голос
/ 29 мая 2019

Один простой способ передать __ignoreinput состоит в том, чтобы хранить выражения глобуса в массиве в одинарных кавычках, раскрывая их при передаче в команду lcov. Напишите свой игнорирующий ввод как

__ignoreinput=( '/opt/*' '/usr/include/*' '*3rdParty/*' '*Input_API/*' '*Grammars/*' )

и выполнение ниже должно работать как положено.

"${__lcov}" "${__gcovopts}" --remove MYCODE.info "${__ignoreinput[@]}" -o MYCODE_filtered.info 2>&1 > /dev/null

Для всех случаев сбоев в вашем описании __ignoreinput задается как одна целая строка в "..", но команда ожидает, что слова разбивают по одному выражению для каждого. Расширение массива "${__ignoreinput[@]}", однако, помещает каждое слово, определенное в массиве, как отдельное слово, как и ожидалось командой.

Также тщательно ставьте одинарные / двойные кавычки слов в массиве во время определения, потому что при отсутствии кавычек * может подвергаться расширению имени пути и может расширяться до списка имен файлов под каждым из этих путей.

Также посмотрите, как > /dev/null 2> /dev/null можно уменьшить до > /dev/null 2> /dev/null или просто &> /dev/null в bash.


Имена имен переменных с префиксом __ также являются плохой практикой. Как и большинство языков, сам символ может быть допустимым идентификатором переменной. Как показано выше, рекомендуется указывать имя переменной полностью вокруг {..}.

...