summaryrefslogtreecommitdiff
path: root/test/test-ci.sh
blob: 757dc02e8a277d94a75bcd2298ae332fef5cbb91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
#!/bin/sh -e
# SPDX-License-Identifier: MIT OR LGPL-2.0-or-later
# SPDX-FileCopyrightText: 2017 Claudio André <claudioandre.br@gmail.com>

do_Set_Env () {
    #Save cache on $pwd (required by artifacts)
    mkdir -p "$(pwd)"/.cache
    XDG_CACHE_HOME="$(pwd)"/.cache
    export XDG_CACHE_HOME

    #SpiderMonkey and libgjs
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64:/usr/local/lib

    #Macros
    export ACLOCAL_PATH=$ACLOCAL_PATH:/usr/local/share/aclocal

    export SHELL=/bin/bash
    PATH=$PATH:~/.local/bin

    export DISPLAY="${DISPLAY:-:0}"
}

do_Get_Upstream_Base () {
    echo '-----------------------------------------'
    echo 'Finding common ancestor'

    if git show-branch ci-upstream-base 2> /dev/null; then
        echo "Already found"
        return
    fi

    # We need to add a new remote for the upstream target branch, since this
    # script could be running in a personal fork of the repository which has out
    # of date branches.
    #
    # Limit the fetch to a certain date horizon to limit the amount of data we
    # get. If the branch was forked from the main branch before this horizon, it
    # should probably be rebased.
    git remote add upstream https://gitlab.gnome.org/GNOME/gjs.git || \
        git remote set-url upstream https://gitlab.gnome.org/GNOME/gjs.git
    # $CI_MERGE_REQUEST_TARGET_BRANCH_NAME is only defined if we’re running in a
    # merge request pipeline; fall back to $CI_DEFAULT_BRANCH otherwise.
    base_branch="${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}"
    if ! git fetch --shallow-since="28 days ago" --no-tags upstream "$base_branch"; then
        echo "Main branch doesn't have history in the past 28 days, fetching "
        echo "the last 30 commits."
        git fetch --depth=30 --no-tags upstream "$base_branch"
    fi

    git branch -f ci-upstream-base-branch FETCH_HEAD

    # Work out the newest common ancestor between the detached HEAD that this CI
    # job has checked out, and the upstream target branch (which will typically
    # be `upstream/master` or `upstream/gnome-nn`).
    newest_common_ancestor_sha=$(git merge-base ci-upstream-base-branch HEAD)
    if test -z "$newest_common_ancestor_sha"; then
        echo "Couldn’t find common ancestor with the upstream main branch. This"
        echo "typically happens if you branched a long time ago. Please update"
        echo "your clone, rebase, and re-push your branch."
        echo "Base revisions:"
        git log --oneline -10 ci-upstream-base-branch
        echo "Branch revisions:"
        git log --oneline -10 HEAD
        exit 1
    fi
    echo "Merge base:"
    git show --no-patch "$newest_common_ancestor_sha"
    git branch -f ci-upstream-base "$newest_common_ancestor_sha"
    echo '-----------------------------------------'
}

do_Compare_With_Upstream_Base () {
    echo '-----------------------------------------'
    echo 'Comparing the code with upstream merge base'

    sort < /cwd/base-report.txt > /cwd/base-report-sorted.txt
    sort < /cwd/head-report.txt > /cwd/head-report-sorted.txt

    NEW_WARNINGS=$(comm -13 /cwd/base-report-sorted.txt /cwd/head-report-sorted.txt | wc -l)
    REMOVED_WARNINGS=$(comm -23 /cwd/base-report-sorted.txt /cwd/head-report-sorted.txt | wc -l)
    if test "$NEW_WARNINGS" -ne 0; then
        echo '-----------------------------------------'
        echo "### $NEW_WARNINGS new warning(s) found by $1 ###"
        echo '-----------------------------------------'
        diff -U0 /cwd/base-report.txt /cwd/head-report.txt || true
        echo '-----------------------------------------'
        exit 1
    else
        echo "$REMOVED_WARNINGS warning(s) were fixed."
        echo "=> $1 Ok"
    fi
}

do_Create_Artifacts_Folder () {
    # Create the artifacts folders
    save_dir="$(pwd)"
    mkdir -p "$save_dir"/analysis; touch "$save_dir"/analysis/doing-"$1"
}

do_Check_Script_Errors () {
    local total=0
    total=$(cat scripts.log | grep 'not ok ' | wc -l)

    if test "$total" -gt 0; then
        echo '-----------------------------------------'
        echo "### Found $total errors on scripts.log ###"
        echo '-----------------------------------------'
        exit 1
    fi
}

# ----------- Run the Tests -----------
if test -n "$TEST"; then
    extra_opts="($TEST)"
fi

. test/extra/do_environment.sh

# Show some environment info
do_Print_Labels  'ENVIRONMENT'
echo "Running on: $BASE $OS"
echo "Job: $CI_JOB_NAME"
echo "Configure options: ${CONFIG_OPTS-$BUILD_OPTS}"
echo "Doing: $1 $extra_opts"

do_Create_Artifacts_Folder "$1"

# Ignore extra git security checks as we don't care in CI.
git config --global --add safe.directory "${PWD}"

if test "$1" = "SETUP"; then
    do_Show_Info
    do_Print_Labels 'Show GJS git information'
    git log --pretty=format:"%h %cd %s" -1

elif test "$1" = "BUILD"; then
    do_Set_Env

    DEFAULT_CONFIG_OPTS="-Dcairo=enabled -Dreadline=enabled -Dprofiler=enabled \
        -Ddtrace=false -Dsystemtap=false -Dverbose_logs=false --werror"
    meson _build $DEFAULT_CONFIG_OPTS $CONFIG_OPTS
    ninja -C _build

    if test "$TEST" != "skip"; then
        xvfb-run -a meson test -C _build $TEST_OPTS
    fi

elif test "$1" = "SH_CHECKS"; then
    # It doesn't (re)build, just run the 'Tests'
    do_Print_Labels 'Shell Scripts Check'
    do_Set_Env

    export LC_ALL=C.UTF-8
    export LANG=C.UTF-8
    export LANGUAGE=C.UTF-8
    export NO_AT_BRIDGE=1

    sudo ninja -C _build install
    installed-tests/scripts/testExamples.sh > scripts.log
    do_Check_Script_Errors

elif test "$1" = "CPPLINT"; then
    do_Print_Labels 'C/C++ Linter report '

    cpplint --quiet $(find . -name \*.cpp -or -name \*.h | sort) 2>&1 >/dev/null | \
        tee "$save_dir"/analysis/head-report.txt | \
        sed -E -e 's/:[0-9]+:/:LINE:/' -e 's/  +/ /g' \
        > /cwd/head-report.txt
    cat "$save_dir"/analysis/head-report.txt
    echo

    do_Get_Upstream_Base
    if test $(git rev-parse HEAD) = $(git rev-parse ci-upstream-base); then
        echo '-----------------------------------------'
        echo 'Running against upstream'
        echo '=> cpplint: Nothing to do'
        do_Done
        exit 0
    fi
    git checkout ci-upstream-base
    cpplint --quiet $(find . -name \*.cpp -or -name \*.h | sort) 2>&1 >/dev/null | \
        tee "$save_dir"/analysis/base-report.txt | \
        sed -E -e 's/:[0-9]+:/:LINE:/' -e 's/  +/ /g' \
        > /cwd/base-report.txt
    echo

    # Compare the report with merge base and fail if new warnings are found
    do_Compare_With_Upstream_Base "cpplint"

elif test "$1" = "UPSTREAM_BASE"; then
    do_Get_Upstream_Base
    exit 0
fi

# Releases stuff and finishes
do_Done