Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
2 changes: 1 addition & 1 deletion .clang-format
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
Language: Cpp
BasedOnStyle: Google
ColumnLimit: 100
ColumnLimit: 80
IndentWidth: 4
TabWidth: 4
141 changes: 141 additions & 0 deletions .github/workflows/code-quality-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
name: Code Quality

permissions:
contents: read
issues: write

on:
pull_request:
types: [opened, edited, reopened, synchronize]
paths:
- '**.py'
- '**.cpp'
- '**.h'

jobs:
lint:
name: Code Linting
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v3

- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'

- name: Cache pip dependencies
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }}
restore-keys: |
${{ runner.os }}-pip-

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -e .
pip install pylint cpplint

- name: Run Python Linter
id: pylint
continue-on-error: true
run: |
echo "Running pylint (configuration from pyproject.toml)..."
python -m pylint --output-format=colorized mssql_python
echo "pylint_status=$?" >> $GITHUB_ENV

- name: Run C++ Linter
id: cpplint
continue-on-error: true
run: |
echo "Running cpplint with maximum 10 errors per file..."

# Find C++ files excluding build directories
FILES=$(find mssql_python -name "*.cpp" -o -name "*.h" | grep -v "/build/")
if [ -z "$FILES" ]; then
echo "No C++ files found to check!"
echo "cpplint_status=0" >> $GITHUB_ENV
exit 0
fi

echo "Found files to check:"
echo "$FILES"

# Process each file individually with better error handling
MAX_ERRORS=10
FAILED_FILES=""

for FILE in $FILES; do
echo "Checking $FILE..."

# Run cpplint on a single file and capture output
OUTPUT=$(python -m cpplint --filter=-readability/todo --linelength=100 "$FILE" 2>&1 || true)

# Display the output for this file
echo "$OUTPUT"

# Extract error count more reliably
ERROR_COUNT=$(echo "$OUTPUT" | grep -o 'Total errors found: [0-9]*' | grep -o '[0-9]*' || echo "0")

# If we couldn't extract a count, default to 0
if [ -z "$ERROR_COUNT" ]; then
ERROR_COUNT=0
fi

echo "File $FILE has $ERROR_COUNT errors"

# Check if over threshold
if [ "$ERROR_COUNT" -gt "$MAX_ERRORS" ]; then
FAILED_FILES="$FAILED_FILES\n- $FILE ($ERROR_COUNT errors)"
fi
done

# Output results
if [ ! -z "$FAILED_FILES" ]; then
echo -e "\n⛔ The following files have more than $MAX_ERRORS errors:$FAILED_FILES"
echo "cpplint_status=1" >> $GITHUB_ENV
else
echo -e "\n✅ All files have $MAX_ERRORS or fewer errors."
echo "cpplint_status=0" >> $GITHUB_ENV
fi

- name: Determine overall status
run: |
if [[ "${{ env.pylint_status }}" != "0" || "${{ env.cpplint_status }}" != "0" ]]; then
echo "Linting checks failed!"
exit 1
else
echo "All linting checks passed!"
fi

- name: Comment on PR
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
let comment = '## Code Quality Check Results\n\n';

if ('${{ env.pylint_status }}' !== '0') {
comment += '⚠️ **Python linting failed** - Please check the [workflow logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.\n\n';
} else {
comment += '✅ **Python linting passed**\n\n';
}

if ('${{ env.cpplint_status }}' !== '0') {
comment += '⚠️ **C++ linting failed** - Some files exceed the maximum error threshold of 10.\n\n';
} else {
comment += '✅ **C++ linting passed**\n\n';
}

comment += 'See [code quality guidelines](https://github.com/microsoft/mssql-python/blob/main/CONTRIBUTING.md) for more information.';

github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
});
15 changes: 15 additions & 0 deletions .pre-commit-config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
repos:
- repo: https://github.com/pre-commit/mirrors-pylint
rev: v3.0.0a5
hooks:
- id: pylint

- repo: local
hooks:
- id: cpplint
name: cpplint
entry: python -m cpplint
language: python
types: [c++]
args: [--filter=-readability/todo, --linelength=100]
exclude: ^.*build/.*$
4 changes: 4 additions & 0 deletions cpplint.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
set noparent
filter=-readability/todo
linelength=100
exclude_files=build
11 changes: 11 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
[tool.pylint]
disable = [
"fixme",
"no-member",
"too-many-arguments",
"too-many-positional-arguments",
"invalid-name",
"useless-parent-delegation"
]
fail-under = 8.5
max-line-length = 100
5 changes: 4 additions & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@ pybind11
coverage
unittest-xml-reporting
setuptools
psutil
psutil
pylint
cpplint
pre-commit
Loading