1esc=$(printf '\e')
2cr=$(printf '\r')
3
4if [ -n "${GITLAB_CI:-}" ]; then
5    ci=gitlab
6    eol=
7    link_start="${esc}[33m"
8    link_end="${esc}[m"
9elif [ -n "${GITHUB_ACTION:-}" ]; then
10    ci=github
11    eol="\\"
12    link_start=
13    link_end=
14elif [ -n "${JENKINS_HOME:-}" ]; then
15    ci=jenkins
16    eol="<br/>"
17    link_start=
18    link_end=
19else
20    echo "Unexpected CI/CD context" >&2
21    exit 1
22fi
23
24open_section() {
25    id=$1
26    title=$2
27    collapsed=$3
28    echo "${esc}[0Ksection_start:$(date +%s):${id}${collapsed}${cr}${esc}[0K${esc}[1m${esc}[36m${title}${esc}[m"
29}
30
31close_section() {
32    id=$1
33    echo "${esc}[0Ksection_end:$(date +%s):${id}${cr}${esc}[0K"
34}
35
36summary() {
37    fixedReports=
38    newReports=
39    unfixedReports=
40    while read -r line; do
41        var=${line%%: *}
42        val=${line#*: }
43        eval "${var}=${val}"
44    done <"${updateLog}"
45
46    case "${ci}" in
47    github)
48        eol="\\"
49        ;;
50    gitlab)
51        eol=
52        ;;
53    jenkins)
54        eol="<br/>"
55        ;;
56    *)
57        eol=
58        ;;
59    esac
60
61    currentDbReportsUrl="${eclairReportUrlPrefix}/fs${jobDir}/PROJECT.ecd;/by_service.html#service&kind"
62    if [ -z "${newReports}" ]; then
63        fixedMsg="No fixed reports as there is no baseline"
64        unfixedMsg="Unfixed reports: ${unfixedReports}"
65        referenceReportsMsgTxt=
66        referenceReportsMsgLog=
67    else
68        fixedMsg="Fixed reports: ${fixedReports}"
69        unfixedMsg="Unfixed reports: ${unfixedReports} [new: ${newReports}]"
70        case "${event}" in
71        pull_request | auto_pull_request)
72            referenceDbReportsUrl="${eclairReportUrlPrefix}/fs${jobDir}/base/PROJECT.ecd;/by_service.html#service&kind"
73            reference_kind=base
74            ;;
75        push)
76            referenceDbReportsUrl="${eclairReportUrlPrefix}/fs${jobDir}/prev/PROJECT.ecd;/by_service.html#service&kind"
77            reference_kind=previous
78            ;;
79        *)
80            echo "Unexpected event ${event}" >&2
81            exit 1
82            ;;
83        esac
84    fi
85
86    case "${ci}" in
87    jenkins)
88        if [ -n "${newReports}" ]; then
89            referenceReportsMsgTxt="<a href="${referenceDbReportsUrl}">Browse ${reference_kind} reports</a>"
90        fi
91        cat <<EOF >"${summaryTxt}"
92${fixedMsg}${eol}
93${unfixedMsg}                                                                              ${eol}
94<a href="https://www.bugseng.com/eclair">
95  <img src="${eclairReportUrlPrefix}/rsrc/eclair.svg" width="100" />
96</a>
97<h3>${jobHeadline}</h3>
98<a href="${indexHtmlUrl}">Browse analysis summary</a>
99<a href="${currentDbReportsUrl}">Browse current reports</a>
100${referenceReportsMsgTxt}
101EOF
102        ;;
103    *)
104        if [ -n "${newReports}" ]; then
105            referenceReportsMsgTxt="Browse ${reference_kind} reports: ${referenceDbReportsUrl}"
106        fi
107        cat <<EOF >"${summaryTxt}"
108<a href="https://www.bugseng.com/eclair">
109  <img src="${eclairReportUrlPrefix}/rsrc/eclair.svg" width="100" />
110</a>
111Analysis Summary
112
113${jobHeadline}${eol}
114${fixedMsg}${eol}
115${unfixedMsg}${eol}
116Browse analysis summary: ${indexHtmlUrl}
117Browse current reports: ${currentDbReportsUrl}
118${referenceReportsMsgTxt}
119EOF
120        ;;
121    esac
122
123    analysisSummaryMsgLog="Browse analysis summary: ${link_start}${indexHtmlUrl}${link_end}"
124    currentReportsMsgLog="Browse current reports: ${link_start}${currentDbReportsUrl}${link_end}"
125    if [ -n "${newReports}" ]; then
126        referenceReportsMsgLog="Browse ${reference_kind} reports: ${link_start}${referenceDbReportsUrl}${link_end}"
127    fi
128    case ${ci} in
129    github)
130        cat "${summaryTxt}" "${cleanRegressionsLog}" >"${GITHUB_STEP_SUMMARY}"
131        ;;
132    gitlab)
133        open_section ECLAIR_summary "ECLAIR analysis summary" ""
134        # Generate summary and print it (GitLab-specific)
135        cat <<EOF
136${jobHeadline}
137${fixedMsg}
138${unfixedMsg}
139${analysisSummaryMsgLog}
140${currentReportsMsgLog}
141${referenceReportsMsgLog}
142EOF
143        cat ${cleanRegressionsLog}
144        close_section ECLAIR_summary
145        ;;
146    jenkins)
147        cat <<EOF
148${jobHeadline}
149${fixedMsg}
150${unfixedMsg}
151${analysisSummaryMsgLog}
152${currentReportsMsgLog}
153${referenceReportsMsgLog}
154EOF
155        ;;
156    *)
157        echo "Unexpected CI/CD context" >&2
158        exit 1
159        ;;
160    esac
161}
162
163log_file() {
164    section_id=$1
165    section_name=$2
166    file=$3
167    exit_code=$4
168    if [ "${exit_code}" = 0 ]; then
169        collapsed=[collapsed=true]
170    else
171        collapsed=
172    fi
173
174    case ${ci} in
175    github | jenkins)
176        echo "${section_name}"
177        ;;
178    gitlab)
179        open_section "${section_id}" "${section_name}" "${collapsed}"
180        ;;
181    *)
182        echo "Unexpected CI/CD context" >&2
183        exit 1
184        ;;
185    esac
186
187    cat "${file}"
188
189    case ${ci} in
190    github | jenkins) ;;
191    gitlab)
192        close_section "${section_id}"
193        ;;
194    *) ;;
195    esac
196}
197
198maybe_log_file_exit() {
199    section_id=$1
200    section_name=$2
201    file=$3
202    exit_code=$4
203
204    case ${ci} in
205    github | jenkins)
206        echo "${section_name}"
207        ;;
208    gitlab)
209        open_section "${section_id}" "${section_name}" ""
210        ;;
211    *)
212        echo "Unexpected CI/CD context" >&2
213        exit 1
214        ;;
215    esac
216
217    if [ "${exit_code}" != 0 ]; then
218        cat "${file}"
219    fi
220
221    case ${ci} in
222    github | jenkins) ;;
223    gitlab)
224        close_section "${section_id}"
225        ;;
226    *) ;;
227    esac
228    return "${exit_code}"
229}
230
231is_enabled() {
232    case "$1" in
233    true | TRUE | y | Y | yes | YES | 1)
234        return 0
235        ;;
236    *)
237        return 1
238        ;;
239    esac
240}
241