diff --git a/.github/workflows/check-qldoc.yml b/.github/workflows/check-qldoc.yml new file mode 100644 index 00000000000..146c7d77b7c --- /dev/null +++ b/.github/workflows/check-qldoc.yml @@ -0,0 +1,50 @@ +name: "Check QLdoc" + +on: + pull_request: + paths: + - "*/ql/lib/**" + - .github/workflows/check-qldoc.yml + branches: + - main + - "rc/*" + +jobs: + qldoc: + runs-on: ubuntu-latest + + steps: + - name: Install CodeQL + run: | + gh extension install github/gh-codeql + gh codeql set-channel nightly + gh codeql version + env: + GITHUB_TOKEN: ${{ github.token }} + + - uses: actions/checkout@v2 + with: + fetch-depth: 2 + + - name: Check QLdoc + shell: bash + run: | + EXIT_CODE=0 + changed_lib_packs="$(git diff --name-only --diff-filter=ACMRT HEAD^ HEAD | { grep -o '^[a-z]*/ql/lib' || true; } | sort -u)" + for pack_dir in ${changed_lib_packs}; do + lang="${pack_dir%/ql/lib}" + gh codeql generate library-doc-coverage --output="${{ runner.temp }}/${lang}-current.txt" --dir="${pack_dir}" + done + git checkout HEAD^ + for pack_dir in ${changed_lib_packs}; do + lang="${pack_dir%/ql/lib}" + gh codeql generate library-doc-coverage --output="${{ runner.temp }}/${lang}-baseline.txt" --dir="${pack_dir}" + awk -F, '{gsub(/"/,""); if ($4==0 && $6=="public") print "\""$3"\"" }' "${{ runner.temp }}/${lang}-current.txt" | sort -u > "${{ runner.temp }}/current-undocumented.txt" + awk -F, '{gsub(/"/,""); if ($4==0 && $6=="public") print "\""$3"\"" }' "${{ runner.temp }}/${lang}-baseline.txt" | sort -u > "${{ runner.temp }}/baseline-undocumented.txt" + UNDOCUMENTED="$(grep -f <(comm -13 "${{ runner.temp }}/baseline-undocumented.txt" "${{ runner.temp }}/current-undocumented.txt") "${{ runner.temp }}/${lang}-current.txt" || true)" + if [ -n "$UNDOCUMENTED" ]; then + echo "$UNDOCUMENTED" | awk -F, '{gsub(/"/,""); print "::warning file='"${pack_dir}"'/"$1",line="$2"::Missing QLdoc for "$5, $3 }' + EXIT_CODE=1 + fi + done + exit "${EXIT_CODE}"