Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions .github/workflows/ci-build-test-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
name: CI Build Test Docs

on:
workflow_call:

jobs:
build-test-docs:
name: Build + Test + Docs
runs-on: ubuntu-22.04
env:
CARGO_TERM_COLOR: always
CMAKE_BUILD_PARALLEL_LEVEL: 2
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Show selected dependency revisions
shell: bash
run: |
set -euo pipefail
git submodule status --recursive
echo
echo "qtty: $(git -C qtty rev-parse HEAD) ($(git -C qtty describe --tags --always 2>/dev/null || true))"
echo "qtty-ffi: $(git -C qtty/qtty-ffi rev-parse HEAD) ($(git -C qtty/qtty-ffi describe --tags --always 2>/dev/null || true))"

- name: Install system dependencies
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
pkg-config \
libssl-dev \
graphviz

- name: Install Doxygen 1.16.1
shell: bash
run: |
set -euo pipefail
DOXYGEN_VERSION="1.16.1"
curl -fsSL "https://github.com/doxygen/doxygen/releases/download/Release_1_16_1/doxygen-${DOXYGEN_VERSION}.linux.bin.tar.gz" -o /tmp/doxygen.tar.gz
sudo tar -xzf /tmp/doxygen.tar.gz -C /opt
sudo ln -sf "/opt/doxygen-${DOXYGEN_VERSION}/bin/doxygen" /usr/local/bin/doxygen
rm -f /tmp/doxygen.tar.gz
doxygen --version

- name: Set up Rust (stable)
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Cache cargo + build artifacts
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
qtty/target
qtty/qtty-ffi/target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Validate required submodules exist
shell: bash
run: |
set -euo pipefail
test -f qtty/Cargo.toml
test -f qtty/qtty-ffi/Cargo.toml

- name: Configure (CMake)
shell: bash
run: |
set -euo pipefail
cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=ON

- name: Build
shell: bash
run: |
set -euo pipefail
cmake --build build --target test_ffi

- name: Test (ctest)
shell: bash
run: |
set -euo pipefail
ctest --test-dir build --output-on-failure -L qtty_cpp

- name: Build docs (Doxygen)
shell: bash
run: |
set -euo pipefail
cmake --build build --target docs
96 changes: 96 additions & 0 deletions .github/workflows/ci-coverage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
name: CI Coverage

on:
workflow_call:

jobs:
coverage:
name: Test & Coverage
runs-on: ubuntu-22.04
env:
CARGO_TERM_COLOR: always
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Install system dependencies
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
pkg-config \
libssl-dev \
gcovr

- name: Set up Rust (stable)
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Configure (CMake, coverage)
shell: bash
run: |
set -euo pipefail
cmake -S . -B build-coverage -G Ninja \
-DQTTY_BUILD_DOCS=OFF \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_CXX_FLAGS="--coverage" \
-DCMAKE_EXE_LINKER_FLAGS="--coverage"

- name: Build tests
shell: bash
run: |
set -euo pipefail
cmake --build build-coverage --target test_ffi

- name: Run tests
shell: bash
run: |
set -euo pipefail
ctest --test-dir build-coverage --output-on-failure -L qtty_cpp

- name: Coverage (Cobertura XML)
shell: bash
run: |
set -euo pipefail
gcovr \
--root . \
--exclude 'build-coverage/.*' \
--exclude 'qtty/.*' \
--exclude 'tests/.*' \
--exclude 'examples/.*' \
--xml \
--output coverage.xml

- name: Coverage (HTML)
shell: bash
run: |
set -euo pipefail
mkdir -p coverage_html
gcovr \
--root . \
--exclude 'build-coverage/.*' \
--exclude 'qtty/.*' \
--exclude 'tests/.*' \
--exclude 'examples/.*' \
--html-details \
--output coverage_html/index.html

- name: Build coverage summary (Markdown)
uses: irongut/CodeCoverageSummary@v1.3.0
with:
filename: coverage.xml
badge: true
format: markdown
output: file

- name: Publish to Job Summary
shell: bash
run: cat code-coverage-results.md >> "$GITHUB_STEP_SUMMARY"
73 changes: 73 additions & 0 deletions .github/workflows/ci-lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
name: CI Lint

on:
workflow_call:

jobs:
lint-cpp:
name: C++ Lint (clang-format + clang-tidy)
runs-on: ubuntu-22.04
env:
CARGO_TERM_COLOR: always
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Install system dependencies
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
cmake \
ninja-build \
clang-tidy

- name: Install clang-format 18
shell: bash
run: |
set -euo pipefail
wget -qO /tmp/llvm.sh https://apt.llvm.org/llvm.sh
sudo bash /tmp/llvm.sh 18
sudo apt-get install -y --no-install-recommends clang-format-18
sudo ln -sf /usr/bin/clang-format-18 /usr/local/bin/clang-format
clang-format --version

- name: Set up Rust (stable)
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Configure (CMake, compile commands)
shell: bash
run: |
set -euo pipefail
cmake -S . -B build -G Ninja -DQTTY_BUILD_DOCS=OFF -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

- name: clang-format check
shell: bash
run: |
set -euo pipefail
mapfile -t files < <(git ls-files '*.hpp' '*.cpp')
if [ ${#files[@]} -eq 0 ]; then
echo "No C++ files found."
exit 0
fi
clang-format --dry-run --Werror "${files[@]}"

- name: clang-tidy check
shell: bash
run: |
set -euo pipefail
mapfile -t cpp_files < <(git ls-files '*.cpp')
if [ ${#cpp_files[@]} -eq 0 ]; then
echo "No C++ source files found."
exit 0
fi
for file in "${cpp_files[@]}"; do
echo "Running clang-tidy on ${file}"
clang-tidy -p build --warnings-as-errors='*' "${file}"
done
94 changes: 94 additions & 0 deletions .github/workflows/ci-package.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
name: CI Package

on:
workflow_call:

jobs:
package:
name: Package (DEB + RPM)
runs-on: ubuntu-22.04
env:
CARGO_TERM_COLOR: always
CMAKE_BUILD_PARALLEL_LEVEL: 2
steps:
- name: Checkout (with submodules)
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0

- name: Install system dependencies
shell: bash
run: |
set -euo pipefail
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
cmake \
ninja-build \
pkg-config \
libssl-dev \
rpm

- name: Set up Rust (stable)
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: stable

- name: Cache cargo + build artifacts
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
qtty/target
qtty/qtty-ffi/target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
restore-keys: |
${{ runner.os }}-cargo-

- name: Configure (CMake, Release)
shell: bash
run: |
set -euo pipefail
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DQTTY_BUILD_DOCS=OFF

- name: Build
shell: bash
run: cmake --build build --target test_ffi

- name: Install to staging prefix
shell: bash
run: cmake --install build --prefix build/staging

- name: Copy shared libraries to staging
shell: bash
run: |
set -euo pipefail
mkdir -p build/staging/lib
cp qtty/target/release/libqtty_ffi.so \
build/staging/lib/ || true

- name: Generate packages (CPack)
shell: bash
run: |
set -euo pipefail
cd build
cpack --config CPackConfig.cmake -G "DEB;RPM" -B packages
ls -lh packages/

- name: Upload DEB package
uses: actions/upload-artifact@v4
with:
name: qtty-cpp-deb
path: build/packages/*.deb
retention-days: 30

- name: Upload RPM package
uses: actions/upload-artifact@v4
with:
name: qtty-cpp-rpm
path: build/packages/*.rpm
retention-days: 30
Loading