mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-20 05:40:04 +01:00
CI: replace the scan-build job with a clang-tidy job
Drop the scanbuild wrappers, especially the junit conversion script which's results haven't been looked at for ages. Part-of: <https://gitlab.freedesktop.org/libinput/libinput/-/merge_requests/1182>
This commit is contained in:
parent
6876d71a4d
commit
bf67c056df
5 changed files with 16 additions and 150 deletions
|
|
@ -83,7 +83,7 @@ variables:
|
||||||
# See the documentation here: #
|
# See the documentation here: #
|
||||||
# https://wayland.freedesktop.org/libinput/doc/latest/building_libinput.html #
|
# https://wayland.freedesktop.org/libinput/doc/latest/building_libinput.html #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
FEDORA_PACKAGES: 'git-core gcc gcc-c++ pkgconf-pkg-config meson check-devel libudev-devel libevdev-devel doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx_rtd_theme python3-pytest-xdist libwacom-devel cairo-devel gtk4-devel glib2-devel mtdev-devel diffutils wayland-protocols-devel black clang-analyzer jq rpmdevtools valgrind systemd-udev qemu-img qemu-system-x86-core qemu-system-aarch64-core jq python3-click python3-rich'
|
FEDORA_PACKAGES: 'git-core gcc gcc-c++ pkgconf-pkg-config meson check-devel libudev-devel libevdev-devel doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx_rtd_theme python3-pytest-xdist libwacom-devel cairo-devel gtk4-devel glib2-devel mtdev-devel diffutils wayland-protocols-devel black clang clang-tools-extra jq rpmdevtools valgrind systemd-udev qemu-img qemu-system-x86-core qemu-system-aarch64-core jq python3-click python3-rich'
|
||||||
DEBIAN_PACKAGES: 'git gcc g++ pkg-config meson check libudev-dev libevdev-dev doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx-rtd-theme python3-pytest-xdist libwacom-dev libcairo2-dev libgtk-3-dev libglib2.0-dev libmtdev-dev curl'
|
DEBIAN_PACKAGES: 'git gcc g++ pkg-config meson check libudev-dev libevdev-dev doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx-rtd-theme python3-pytest-xdist libwacom-dev libcairo2-dev libgtk-3-dev libglib2.0-dev libmtdev-dev curl'
|
||||||
UBUNTU_PACKAGES: 'git gcc g++ pkg-config meson check libudev-dev libevdev-dev doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx-rtd-theme python3-pytest-xdist libwacom-dev libcairo2-dev libgtk-3-dev libglib2.0-dev libmtdev-dev'
|
UBUNTU_PACKAGES: 'git gcc g++ pkg-config meson check libudev-dev libevdev-dev doxygen graphviz python3-sphinx python3-recommonmark python3-sphinx-rtd-theme python3-pytest-xdist libwacom-dev libcairo2-dev libgtk-3-dev libglib2.0-dev libmtdev-dev'
|
||||||
ARCH_PACKAGES: 'git gcc pkgconfig meson check libsystemd libevdev python-pytest-xdist libwacom gtk4 mtdev diffutils'
|
ARCH_PACKAGES: 'git gcc pkgconfig meson check libsystemd libevdev python-pytest-xdist libwacom gtk4 mtdev diffutils'
|
||||||
|
|
@ -95,12 +95,12 @@ variables:
|
||||||
# changing these will force rebuilding the associated image
|
# changing these will force rebuilding the associated image
|
||||||
# Note: these tags have no meaning and are not tied to a particular
|
# Note: these tags have no meaning and are not tied to a particular
|
||||||
# libinput version
|
# libinput version
|
||||||
FEDORA_TAG: '2024-04-03.1'
|
FEDORA_TAG: '2025-04-04.0'
|
||||||
DEBIAN_TAG: '2024-04-03.1'
|
DEBIAN_TAG: '2025-04-04.0'
|
||||||
UBUNTU_TAG: '2024-04-03.1'
|
UBUNTU_TAG: '2025-04-04.0'
|
||||||
ARCH_TAG: '2024-04-03.1'
|
ARCH_TAG: '2025-04-04.0'
|
||||||
ALPINE_TAG: '2024-04-03.1'
|
ALPINE_TAG: '2025-04-04.0'
|
||||||
FREEBSD_TAG: '2024-04-03.1'
|
FREEBSD_TAG: '2025-04-04.0'
|
||||||
|
|
||||||
FDO_UPSTREAM_REPO: libinput/libinput
|
FDO_UPSTREAM_REPO: libinput/libinput
|
||||||
|
|
||||||
|
|
@ -903,18 +903,16 @@ default-build-release@fedora:41:
|
||||||
MESON_ARGS: "-Dbuildtype=release"
|
MESON_ARGS: "-Dbuildtype=release"
|
||||||
CFLAGS: "-Werror"
|
CFLAGS: "-Werror"
|
||||||
|
|
||||||
scan-build@fedora:41:
|
clang-tidy@fedora:41:
|
||||||
extends:
|
extends:
|
||||||
- .fedora-build@template
|
- .fedora-build@template
|
||||||
variables:
|
variables:
|
||||||
NINJA_ARGS: ''
|
NINJA_ARGS: ''
|
||||||
MESON_TEST_ARGS: ''
|
MESON_TEST_ARGS: ''
|
||||||
|
CC: 'clang'
|
||||||
script:
|
script:
|
||||||
- .gitlab-ci/meson-build.sh
|
- .gitlab-ci/meson-build.sh
|
||||||
- export SCANBUILD="$PWD/.gitlab-ci/scanbuild-wrapper.sh"
|
- ninja -C "$MESON_BUILDDIR" clang-tidy
|
||||||
- ninja -C "$MESON_BUILDDIR" scan-build
|
|
||||||
after_script:
|
|
||||||
- .gitlab-ci/scanbuild-plist-to-junit.py "$MESON_BUILDDIR"/meson-logs/scanbuild/ > "$MESON_BUILDDIR"/junit-scan-build.xml
|
|
||||||
|
|
||||||
# Below jobs are build option combinations. We only
|
# Below jobs are build option combinations. We only
|
||||||
# run them on one image, they shouldn't fail on one distro
|
# run them on one image, they shouldn't fail on one distro
|
||||||
|
|
|
||||||
|
|
@ -464,18 +464,16 @@ default-build-release@{{distro.name}}:{{version}}:
|
||||||
MESON_ARGS: "-Dbuildtype=release"
|
MESON_ARGS: "-Dbuildtype=release"
|
||||||
CFLAGS: "-Werror"
|
CFLAGS: "-Werror"
|
||||||
|
|
||||||
scan-build@{{distro.name}}:{{version}}:
|
clang-tidy@{{distro.name}}:{{version}}:
|
||||||
extends:
|
extends:
|
||||||
- .{{distro.name}}-build@template
|
- .{{distro.name}}-build@template
|
||||||
variables:
|
variables:
|
||||||
NINJA_ARGS: ''
|
NINJA_ARGS: ''
|
||||||
MESON_TEST_ARGS: ''
|
MESON_TEST_ARGS: ''
|
||||||
|
CC: 'clang'
|
||||||
script:
|
script:
|
||||||
- .gitlab-ci/meson-build.sh
|
- .gitlab-ci/meson-build.sh
|
||||||
- export SCANBUILD="$PWD/.gitlab-ci/scanbuild-wrapper.sh"
|
- ninja -C "$MESON_BUILDDIR" clang-tidy
|
||||||
- ninja -C "$MESON_BUILDDIR" scan-build
|
|
||||||
after_script:
|
|
||||||
- .gitlab-ci/scanbuild-plist-to-junit.py "$MESON_BUILDDIR"/meson-logs/scanbuild/ > "$MESON_BUILDDIR"/junit-scan-build.xml
|
|
||||||
|
|
||||||
# Below jobs are build option combinations. We only
|
# Below jobs are build option combinations. We only
|
||||||
# run them on one image, they shouldn't fail on one distro
|
# run them on one image, they shouldn't fail on one distro
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
# We're happy to rebuild all containers when one changes.
|
# We're happy to rebuild all containers when one changes.
|
||||||
.default_tag: &default_tag '2024-04-03.1'
|
.default_tag: &default_tag '2025-04-04.0'
|
||||||
|
|
||||||
distributions:
|
distributions:
|
||||||
- name: fedora
|
- name: fedora
|
||||||
|
|
@ -36,7 +36,8 @@ distributions:
|
||||||
- diffutils
|
- diffutils
|
||||||
- wayland-protocols-devel
|
- wayland-protocols-devel
|
||||||
- black # for the Python black job, optional
|
- black # for the Python black job, optional
|
||||||
- clang-analyzer # for the scan-build job, optional
|
- clang # for the clang-tidy build, optional
|
||||||
|
- clang-tools-extra # for clang-tidy, optional
|
||||||
- jq # for the test suite check job, optional
|
- jq # for the test suite check job, optional
|
||||||
- rpmdevtools # for the rpm build job, optional
|
- rpmdevtools # for the rpm build job, optional
|
||||||
- valgrind # for the valgrind run, optional
|
- valgrind # for the valgrind run, optional
|
||||||
|
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
#
|
|
||||||
# Usage:
|
|
||||||
# $ scanbuild-plist-to-junit.py /path/to/meson-logs/scanbuild/ > junit-report.xml
|
|
||||||
#
|
|
||||||
# Converts the plist output from scan-build into a JUnit-compatible XML.
|
|
||||||
#
|
|
||||||
# For use with meson, use a wrapper script with this content:
|
|
||||||
# scan-build -v --status-bugs -plist-html "$@"
|
|
||||||
# then build with
|
|
||||||
# SCANBUILD="/abs/path/to/wrapper.sh" ninja -C builddir scan-build
|
|
||||||
#
|
|
||||||
# For file context, $PWD has to be the root source directory.
|
|
||||||
#
|
|
||||||
# Note that the XML format is tailored towards being useful in the gitlab
|
|
||||||
# CI, the JUnit format supports more features.
|
|
||||||
#
|
|
||||||
# This file is formatted with Python Black
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import plistlib
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
|
|
||||||
class Error(object):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="This tool convers scan-build's plist format to JUnit XML"
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"directory", help="Path to a scan-build output directory", type=Path
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
if not args.directory.exists():
|
|
||||||
print(f"Invalid directory: {args.directory}", file=sys.stderr)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
# Meson places scan-build runs into a timestamped directory. To make it
|
|
||||||
# easier to invoke this script, we just glob everything on the assumption
|
|
||||||
# that there's only one scanbuild/$timestamp/ directory anyway.
|
|
||||||
for file in Path(args.directory).glob("**/*.plist"):
|
|
||||||
with open(file, "rb") as fd:
|
|
||||||
plist = plistlib.load(fd, fmt=plistlib.FMT_XML)
|
|
||||||
try:
|
|
||||||
sources = plist["files"]
|
|
||||||
for elem in plist["diagnostics"]:
|
|
||||||
e = Error()
|
|
||||||
e.type = elem["type"] # Human-readable error type
|
|
||||||
e.description = elem["description"] # Longer description
|
|
||||||
e.func = elem["issue_context"] # function name
|
|
||||||
e.lineno = elem["location"]["line"]
|
|
||||||
filename = sources[elem["location"]["file"]]
|
|
||||||
# Remove the ../../../ prefix from the file
|
|
||||||
e.file = re.sub(r"^(\.\./)*", "", filename)
|
|
||||||
errors.append(e)
|
|
||||||
except KeyError:
|
|
||||||
print(
|
|
||||||
"Failed to access plist content, incompatible format?", file=sys.stderr
|
|
||||||
)
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
|
|
||||||
# Add a few lines of context for each error that we can print in the xml
|
|
||||||
# output. Note that e.lineno is 1-indexed.
|
|
||||||
#
|
|
||||||
# If one of the files fail, we stop doing this, we're probably in the wrong
|
|
||||||
# directory.
|
|
||||||
try:
|
|
||||||
current_file = None
|
|
||||||
lines = []
|
|
||||||
for e in sorted(errors, key=lambda x: x.file):
|
|
||||||
if current_file != e.file:
|
|
||||||
current_file = e.file
|
|
||||||
lines = open(current_file).readlines()
|
|
||||||
|
|
||||||
# e.lineno is 1-indexed, lineno is our 0-indexed line number
|
|
||||||
lineno = e.lineno - 1
|
|
||||||
start = max(0, lineno - 4)
|
|
||||||
end = min(len(lines), lineno + 5) # end is exclusive
|
|
||||||
e.context = [
|
|
||||||
f"{'>' if line == e.lineno else ' '} {line}: {content}"
|
|
||||||
for line, content in zip(range(start + 1, end), lines[start:end])
|
|
||||||
]
|
|
||||||
except FileNotFoundError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
print('<?xml version="1.0" encoding="utf-8"?>')
|
|
||||||
print("<testsuites>")
|
|
||||||
if errors:
|
|
||||||
suites = sorted(set([s.type for s in errors]))
|
|
||||||
# Use a counter to ensure test names are unique, otherwise the CI
|
|
||||||
# display ignores duplicates.
|
|
||||||
counter = 0
|
|
||||||
for suite in suites:
|
|
||||||
errs = [e for e in errors if e.type == suite]
|
|
||||||
# Note: the grouping by suites doesn't actually do anything in gitlab. Oh well
|
|
||||||
print(f'<testsuite name="{suite}" failures="{len(errs)}" tests="{len(errs)}">')
|
|
||||||
for error in errs:
|
|
||||||
print(
|
|
||||||
f"""\
|
|
||||||
<testcase name="{counter}. {error.type} - {error.file}:{error.lineno}" classname="{error.file}">
|
|
||||||
<failure message="{error.description}">
|
|
||||||
<![CDATA[
|
|
||||||
In function {error.func}(),
|
|
||||||
{error.description}
|
|
||||||
|
|
||||||
{error.file}:{error.lineno}
|
|
||||||
---
|
|
||||||
{"".join(error.context)}
|
|
||||||
]]>
|
|
||||||
</failure>
|
|
||||||
</testcase>"""
|
|
||||||
)
|
|
||||||
counter += 1
|
|
||||||
print("</testsuite>")
|
|
||||||
else:
|
|
||||||
# In case of success, add one test case so that registers in the UI
|
|
||||||
# properly
|
|
||||||
print('<testsuite name="scanbuild" failures="0" tests="1">')
|
|
||||||
print('<testcase name="scanbuild" classname="scanbuild"/>')
|
|
||||||
print("</testsuite>")
|
|
||||||
print("</testsuites>")
|
|
||||||
0
.gitlab-ci/scanbuild-wrapper.sh
Executable file → Normal file
0
.gitlab-ci/scanbuild-wrapper.sh
Executable file → Normal file
Loading…
Add table
Reference in a new issue