diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2021-10-16 23:55:11 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2021-10-17 00:37:04 +0100 |
commit | ada8a151d0780b4177cb52138c9080ed98ac5483 (patch) | |
tree | fb0f516c6912b4c8e8cc68eebd0c6bf7b1ea12a6 | |
parent | 9d4a5f224ad75cc9c2811b0bc9753dfb510df889 (diff) | |
download | libgweather-ada8a151d0780b4177cb52138c9080ed98ac5483.tar.gz |
ci: Add a style check stage
Run clang-format-diff on the C sources, and fail if the coding style
isn't respected.
-rw-r--r-- | .gitlab-ci.yml | 15 | ||||
-rwxr-xr-x | .gitlab-ci/run-style-check.sh | 17 | ||||
-rwxr-xr-x | .gitlab-ci/search-common-ancestor.sh | 36 |
3 files changed, 68 insertions, 0 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f0326ab..23a8e92 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,11 +1,26 @@ variables: stages: + - style-check - build - analysis - docs - deploy +.only-default: + only: + - branches + except: + - tags + +style-check-diff: + extends: .only-default + image: fedora:latest + stage: style-check + script: + - dnf install -y clang-tools-extra diffutils git + - sh -x ./.gitlab-ci/run-style-check.sh + # Recipe for setting up the build # @PROJECT_DEPS: the dependencies of the project (on Fedora) # @MESON_VERSION: the version of Meson required by the project diff --git a/.gitlab-ci/run-style-check.sh b/.gitlab-ci/run-style-check.sh new file mode 100755 index 0000000..07b1242 --- /dev/null +++ b/.gitlab-ci/run-style-check.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +set -e + +ancestor_horizon=28 # days (4 weeks) + +# Wrap everything in a subshell so we can propagate the exit status. +( + +source .gitlab-ci/search-common-ancestor.sh + +git diff -U0 --no-color "${newest_common_ancestor_sha}" libgweather/*.c libgweather/tests/*.c libgweather/tools/*.c | clang-format-diff -p1 + +) +exit_status=$? + +exit ${exit_status} diff --git a/.gitlab-ci/search-common-ancestor.sh b/.gitlab-ci/search-common-ancestor.sh new file mode 100755 index 0000000..bac99d2 --- /dev/null +++ b/.gitlab-ci/search-common-ancestor.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +ancestor_horizon=28 # days (4 weeks) + +# 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 origin/main before this horizon, it should +# probably be rebased. +if ! git ls-remote --exit-code upstream >/dev/null 2>&1 ; then + git remote add upstream https://gitlab.gnome.org/GNOME/${CI_PROJECT_NAME}.git +fi +git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream + +# 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/main` or `upstream/gnome-40`). +# `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` or `${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}` +# are only defined if we’re running in a merge request pipeline, +# fall back to `${CI_DEFAULT_BRANCH}` or `${CI_COMMIT_BRANCH}` respectively +# otherwise. + +source_branch="${CI_MERGE_REQUEST_SOURCE_BRANCH_NAME:-${CI_COMMIT_BRANCH}}" +git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" origin "${source_branch}" + +newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent "origin/${source_branch}") | head -1) +if [ -z "${newest_common_ancestor_sha}" ]; then + echo "Couldn’t find common ancestor with upstream main branch. This typically" + echo "happens if you branched from main a long time ago. Please update" + echo "your clone, rebase, and re-push your branch." + exit 1 +fi |