blob: 84efeb1df42bb5443d883bc6952794db509a3e84 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright (c) 2022-2023 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
# Common utility functions for Bugseng ECLAIR tool.
# Directory where this script resides (assuming it was sourced).
export _ECLAIR_UTILS_DIR="$(cd "$(dirname "$BASH_SOURCE")" ; echo "${PWD}")"
# Absolute path of the ECLAIR bin directory.
ECLAIR_BIN_DIR="/opt/bugseng/eclair/bin"
# Set various path variables based on ECLAIR_ANALYSIS var (which is a name
# of top-level dir to hold internal files and results of anaylisis). We
# need to support this variability to e.g. support delta reports
# between two analyses (before and after a patch).
eclair_set_paths() {
if [ -z "${ECLAIR_ANALYSIS}" ]; then
echo "ECLAIR_ANALYSIS is not defined"
exit 1
fi
# Directory where to put all ECLAIR output and temporary files.
ECLAIR_OUTPUT_DIR="${WORKSPACE}/${ECLAIR_ANALYSIS}/out"
# ECLAIR binary data directory and workspace.
export ECLAIR_DATA_DIR="${ECLAIR_OUTPUT_DIR}/.data"
# Destination file for the ECLAIR diagnostics.
export ECLAIR_DIAGNOSTICS_OUTPUT="${ECLAIR_OUTPUT_DIR}/DIAGNOSTICS.txt"
PROJECT_ECD="${ECLAIR_OUTPUT_DIR}/PROJECT.ecd"
}
eclair_prepare() {
eclair_set_paths
mkdir -p "${ECLAIR_DATA_DIR}"
}
eclair_analyze() {
eclair_set_paths
(
# Run a build in the ECLAIR environment.
"${ECLAIR_BIN_DIR}/eclair_env" \
"-eval_file='${ECLAIR_CONFIG_DIR}/MISRA_C_2012_selection.ecl'" \
-- "$@"
)
}
# Create the project database.
eclair_make_ecd() {
eclair_set_paths
find "${ECLAIR_DATA_DIR}" -maxdepth 1 -name "FRAME.*.ecb" \
| sort | xargs cat \
| "${ECLAIR_BIN_DIR}/eclair_report" \
"-create_db='${PROJECT_ECD}'" \
-load=/dev/stdin
}
eclair_make_report_self_contained() {
dir=$1
mkdir -p $dir/lib
cp -r /opt/bugseng/eclair/lib/html $dir/lib
${_ECLAIR_UTILS_DIR}/relativize_urls.py $dir
}
eclair_make_reports() {
eclair_set_paths
${ECLAIR_BIN_DIR}/eclair_report -db=${PROJECT_ECD} \
-summary_txt=${ECLAIR_OUTPUT_DIR}/../summary_txt \
-full_txt=${ECLAIR_OUTPUT_DIR}/../full_txt \
-reports1_html=strictness,${ECLAIR_OUTPUT_DIR}/../full_html/by_strictness/@TAG@.html \
-full_html=${ECLAIR_OUTPUT_DIR}/../full_html
# summary_txt contains just a single report file not present in full_txt, move it there and be done with it.
mv ${ECLAIR_OUTPUT_DIR}/../summary_txt/by_service.txt ${ECLAIR_OUTPUT_DIR}/../full_txt/
rm -rf ${ECLAIR_OUTPUT_DIR}/../summary_txt
eclair_make_report_self_contained ${ECLAIR_OUTPUT_DIR}/../full_html
}
eclair_compress_db() {
eclair_set_paths
# Compress database to take less disk space in Jenkins archive
xz ${PROJECT_ECD}
}
eclair_make_delta_report() {
base_dir=$1
target_dir=$2
diff -I '^Timestamp:' -x frames.txt -x files.txt -x explain.txt \
-ur ${WORKSPACE}/${base_dir}/summary_txt/ ${WORKSPACE}/${target_dir}/summary_txt/ > ${WORKSPACE}/${target_dir}/summary_txt.diff || true
${ECLAIR_BIN_DIR}/eclair_report -diff_criteria=fingerprint -diff_full_txt=${base_dir}/out/PROJECT.ecd,${target_dir}/out/PROJECT.ecd
ls -l diff_output
${ECLAIR_BIN_DIR}/eclair_report \
-db=${base_dir}/out/PROJECT.ecd \
-eval_file=${_ECLAIR_UTILS_DIR}/sel_tag_and_not_glob.ecl \
-sel_tag_and_not_glob=new_no_expl,diff,missing,service,B.EXPLAIN \
-full_html=resolved_issues_html
eclair_make_report_self_contained resolved_issues_html
${ECLAIR_BIN_DIR}/eclair_report \
-db=${target_dir}/out/PROJECT.ecd \
-eval_file=${_ECLAIR_UTILS_DIR}/sel_tag_and_not_glob.ecl \
-sel_tag_and_not_glob=new_no_expl,diff,missing,service,B.EXPLAIN \
-full_html=new_issues_html
eclair_make_report_self_contained new_issues_html
xz ${base_dir}/out/PROJECT.ecd ${target_dir}/out/PROJECT.ecd
}