Skip to content

chore(core/migration): remove legacy src/ duplicates; convert include/gitmind.h to pure umbrella; flatten CLI path to apps/cli/ #190

chore(core/migration): remove legacy src/ duplicates; convert include/gitmind.h to pure umbrella; flatten CLI path to apps/cli/

chore(core/migration): remove legacy src/ duplicates; convert include/gitmind.h to pure umbrella; flatten CLI path to apps/cli/ #190

Workflow file for this run

name: Core Quality Checks
on:
push:
branches: [ main, dev, enforced ]
pull_request:
branches: [ main ]
permissions:
contents: read
jobs:
lint-and-sanitize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang clang-tidy libsodium-dev libgit2-dev libroaring-dev build-essential python3-pip
pip3 install --break-system-packages meson ninja
- name: Check for TODOs/FIXMEs
run: |
echo "Checking for forbidden TODO/FIXME/XXX comments..."
if grep -nE "(TODO|FIXME|XXX)" $(find core -name "*.c" -o -name "*.h" 2>/dev/null); then
echo "❌ NO TODOs ALLOWED"
exit 1
fi
echo "✅ No TODOs found"
- name: Run clang-tidy
run: |
echo "Running clang-tidy with warnings as errors..."
# Setup build for compile_commands.json
CC=clang meson setup build-tidy
# Find all C source and header files in core/
FILES=$(find core -name "*.c" -o -name "*.h" | grep -v "tests/" | grep -v "core/src/hooks/")
if [ -z "$FILES" ]; then
echo "Error: No C/C++ files found to check"
exit 1
fi
echo "Found files to check:"
echo "$FILES" | head -10
echo "..."
# Run clang-tidy on all files using the quality config
# Note: We're not using -warnings-as-errors yet due to existing baseline
for file in $FILES; do
echo "Checking: $file"
clang-tidy -p build-tidy --config-file=quality/.clang-tidy "$file" || true
done
echo "✅ clang-tidy check complete (baseline enforcement via other job)"
- name: Build with Address Sanitizer
run: |
rm -rf build-asan
echo "Building with AddressSanitizer..."
CC=clang CFLAGS="-fsanitize=address -fno-omit-frame-pointer -g" meson setup build-asan -Db_sanitize=address
ninja -C build-asan
- name: Run tests with Address Sanitizer
run: |
echo "Running tests with AddressSanitizer..."
ASAN_OPTIONS=detect_leaks=1:strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 ninja -C build-asan test
- name: Build with Undefined Behavior Sanitizer
run: |
rm -rf build-ubsan
echo "Building with UBSanitizer..."
CC=clang CFLAGS="-fsanitize=undefined -fno-omit-frame-pointer -g" meson setup build-ubsan -Db_sanitize=undefined
ninja -C build-ubsan
- name: Run tests with Undefined Behavior Sanitizer
run: |
echo "Running tests with UBSanitizer..."
UBSAN_OPTIONS=print_stacktrace=1:halt_on_error=1 ninja -C build-ubsan test
- name: Build with Memory Sanitizer (if available)
continue-on-error: true
run: |
if command -v clang-14 &> /dev/null; then
rm -rf build-msan
echo "Building with MemorySanitizer..."
CC=clang-14 CFLAGS="-fsanitize=memory -fno-omit-frame-pointer -g" meson setup build-msan -Db_sanitize=memory
ninja -C build-msan
MSAN_OPTIONS=halt_on_error=1 ninja -C build-msan test
else
echo "MemorySanitizer requires clang-14+, skipping..."
fi
- name: Standard build and test
run: |
rm -rf build-standard
echo "Running standard build..."
CC=clang meson setup build-standard
ninja -C build-standard
ninja -C build-standard test
- name: Install coverage tools
run: |
sudo apt-get install -y gcovr
- name: Run coverage analysis
continue-on-error: true
run: |
rm -rf build-coverage
echo "Running coverage analysis..."
CC=clang meson setup build-coverage -Db_coverage=true
ninja -C build-coverage test
cd build-coverage
gcovr --root .. --html-details coverage.html --print-summary --fail-under-line 60 --fail-under-branch 50 || {
echo "⚠️ Coverage requirements not met (reduced threshold for CI issues)!"
echo "Minimum line coverage: 60%"
echo "Minimum branch coverage: 50%"
echo "Note: gcov may have compatibility issues in CI environment"
exit 0
}
- name: Upload coverage report
uses: actions/upload-artifact@v4
if: always()
with:
name: coverage-report
path: build-coverage/coverage.html