Skip to content

ci: Cherry-pick prestodb/presto#13361 to use pre-commit for quality checks; Fix compilation caching by using cache on runner.#11

Merged
kirkrodrigues merged 19 commits into
y-scope:presto-0.293-clp-connectorfrom
anlowee:xwei/upgrade-to-precommit
Jun 19, 2025
Merged

ci: Cherry-pick prestodb/presto#13361 to use pre-commit for quality checks; Fix compilation caching by using cache on runner.#11
kirkrodrigues merged 19 commits into
y-scope:presto-0.293-clp-connectorfrom
anlowee:xwei/upgrade-to-precommit

Conversation

@anlowee

@anlowee anlowee commented Jun 18, 2025

Copy link
Copy Markdown

Description

As mentioned in #8 , for header and format check, we will apply this commit, which also uses a new way to implement ccache.

Checklist

  • The PR satisfies the contribution guidelines.
  • This is a breaking change and that has been indicated in the PR title, OR this isn't a
    breaking change.
  • Necessary docs have been updated, OR no docs need to be updated.

Validation performed

Passed the CI.

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Introduced pre-commit hook configuration for automated code formatting, linting, and license checks.
    • Added a new workflow to run pre-commit checks on pull requests.
    • Added an internal Spark function to trim trailing spaces and enforce string length limits.
  • Documentation

    • Updated code style and contribution documentation to reference pre-commit usage.
    • Added and updated license headers in various files.
    • Made minor corrections to documentation formatting and whitespace.
  • Refactor

    • Removed Makefile targets and scripts related to formatting, header checks, and Docker container builds, consolidating these tasks under pre-commit.
    • Updated type annotations in Python stubs to use modern generic types.
  • Style

    • Standardized YAML, CMake, and workflow file formatting.
    • Applied consistent whitespace and formatting across code, configuration, and documentation files.
    • Improved formatting of output stream concatenations in generated code.
  • Chores

    • Added and updated configuration files for static analysis, formatting, and linting tools.
    • Cleaned up unused imports and minor code formatting in scripts and tests.
    • Removed deprecated scripts for git clang-format and code checks.
  • Bug Fixes

    • Fixed minor typographical errors and corrected trailing whitespace in various files.
  • Tests

    • Updated test files with improved variable naming conventions and formatting.

Summary:
This PR adds a [`.pre-commit-config.yaml`](https://pre-commit.com) with a number of hooks that mirror our previous `check.py` and some new ones to further improve code quality.

Hooks to replace check.py:
- cmake-format
- clang-format
- license header check
- ruff (python formatting and linting)
- clang-tidy (has to be called manually)

New Hooks:
- general quality checks
  - trailing white space removal
  - end of file fixer
  - large file check (is in the default config, we can probably drop it?)
  - check that files with shebangs are actually executable
  - and that executable scripts have shebangs
- Several checks to improve our GitHub Actions quality
  - zizmor, a security focused linter
  - action-validator, make sure actions are valid! (we have had issues with that before) also checks if paths globs are correct
  - yamlfmt/yamllint make sure we use a unified style in our yaml/workflows

I have added all fixes in this PR ~~but we could also merge them as a separate PR so it can be easier ignored when blaming.~~ Actually I think it is better to just handle everything in this PR to avoid causing a bunch of merge conflicts.

Compared to `check.py` this is also ***much*** faster. Running all hooks on all files in the repo takes under ten seconds!

Pull Request resolved: facebookincubator#13361

Reviewed By: kKPulla

Differential Revision: D76274374

Pulled By: kgpai

fbshipit-source-id: ba23f75fd1ff6e05d0e2a41d791028ac0220da56
@coderabbitai

coderabbitai Bot commented Jun 18, 2025

Copy link
Copy Markdown
## Walkthrough

This update introduces a comprehensive transition from custom formatting and header scripts to a standardized pre-commit framework for code quality enforcement. It adds and configures pre-commit, clang-tidy, and YAML linting, removes legacy formatting scripts and Makefile targets, updates documentation to reflect new workflows, and applies widespread formatting, whitespace, and type annotation improvements across configuration, documentation, and Python stub files.

## Changes

| Files/Groups                                                                                     | Change Summary                                                                                                                     |
|------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|
| `.pre-commit-config.yaml`, `.clang-tidy`, `.yamllint.yml`, `.yamlfmt.yml`                      | Added pre-commit, clang-tidy, and YAML lint/formatter configuration files.                                                       |
| `.cmake-format.yaml`, `.github/ISSUE_TEMPLATE/*.yml`, `.github/dependabot.yml`, `.github/workflows/*.yml` | YAML, workflow, and configuration files: reformatted to remove unnecessary quotes, improve indentation, and standardize lists; added ccache caching steps in some workflows. |
| `.github/CODEOWNERS`, `NOTICE.txt`, `CONTRIBUTING.md`, `docker-compose.yml`                    | Removed trailing spaces, fixed minor typos, and cleaned up formatting in documentation and config files.                         |
| `.github/zizmor.yml`                                                                            | Replaced Dockerfile instructions with a rules configuration ignoring a specific YAML file.                                       |
| `Makefile`, `scripts/check.py`, `scripts/git-clang-format`                                     | Removed Makefile targets and scripts for formatting, header checking, and Docker container builds.                               |
| `scripts/checks/license-header.py`, `scripts/checks/run-clang-tidy.py`, `scripts/checks/util.py` | Minor improvements: updated default license header path, removed unused imports, and refined type checks.                       |
| `scripts/ci/benchmark-runner.py`, `scripts/ci/bm-report/build-metrics.py`                      | Improved exception handling, removed unused imports, and replaced lambdas with named functions.                                  |
| `CODING_STYLE.md`                                                                              | Overhauled documentation to explain pre-commit workflow and hook usage, replacing previous Makefile-based instructions.         |
| `CMake/Findlz4.cmake`, `CMake/Findlzo2.cmake`, `CMake/Findzstd.cmake`, `CMake/FindSodium.cmake`, `CMake/Findglog.cmake` | Added Apache 2.0 license headers and reformatted property settings in CMake scripts.                                             |
| `python/pyvelox/__init__.py`, `python/pyvelox/utils/__init__.py`                               | Added linter directives and explicit import aliases.                                                                             |
| `python/test/test_vector.py`, `python/test/test_plan_builder.py`                               | Test code: variable naming and string formatting improvements.                                                                   |
| `velox/python/plan_builder/plan_builder.pyi`                                                   | Updated type annotations to use built-in generics, removed unused imports and shebang.                                           |
| `velox/python/arrow/arrow.pyi`, `velox/python/file/file.pyi`, `velox/python/runner/runner.pyi`, `velox/python/type/type.pyi`, `velox/python/vector/vector.pyi` | Removed shebangs, unused imports, and extra blank lines from Python stub files.                                                  |
| `velox/docs/*`, `velox/docs/functions/spark/string.rst`                                        | Widespread whitespace cleanup, formatting corrections, and addition of new internal function documentation.                      |
| `velox/exec/tests/utils/TableScanTestBase.cpp`                                                 | Replaced legacy copyright with Apache 2.0 license.                                                                               |
| `velox/dwio/parquet/thrift/ParquetThriftTypes.cpp`                                             | Streamlined output stream formatting in printTo methods.                                                                         |
| `velox/experimental/breeze/test/*`, `velox/experimental/cudf/.clang-format`                    | Linter suppression comments, idiomatic Python, and newline fixes.                                                                |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant Developer
    participant Git
    participant Pre-commit
    participant CI

    Developer->>Git: git commit / push
    Git->>Pre-commit: Trigger hooks (pre-commit, pre-push)
    Pre-commit->>Developer: Run formatting, linting, header, and custom hooks
    Pre-commit-->>Developer: Report issues, auto-fix if configured
    Developer->>Git: Stage/recommit if changes made by hooks
    Git->>CI: Push triggers CI workflows
    CI->>Pre-commit: Run hooks in CI (enforces checks)
    CI-->>Developer: Report pass/fail status

Suggested reviewers

  • kirkrodrigues

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- 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 -->

<!-- internal state end -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=y-scope/velox&utm_content=11):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 22

🔭 Outside diff range comments (3)
scripts/ci/bm-report/build-metrics.py (1)

154-155: Typo: “Unkown” → “Unknown”

-                print(f"Unkown file type found: {object_path}")
+                print(f"Unknown file type found: {object_path}")
.github/workflows/preliminary_checks.yml (1)

49-58: Robust file detection for pre-commit

The git diff --name-only HEAD^1 HEAD approach may miss files in multi-commit or squash-based PRs. A more reliable pattern is:

git fetch origin ${{ github.event.pull_request.base.ref }}
files=$(git diff --name-only origin/${{ github.event.pull_request.base.ref }} HEAD)
velox/python/plan_builder/plan_builder.pyi (1)

34-34: Add type annotations and avoid shadowing built-in
The stub def deserialize_plan(str): ... both shadows the built-in str and lacks type hints. Consider:

def deserialize_plan(serialized: str) -> PlanNode: ...
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 82aa6bd and 17a3ee4.

⛔ Files ignored due to path filters (8)
  • static/icon.svg is excluded by !**/*.svg
  • static/logo.svg is excluded by !**/*.svg
  • website/static/img/banner-pattern.svg is excluded by !**/*.svg
  • website/static/img/icon-commits.svg is excluded by !**/*.svg
  • website/static/img/icon-contributors.svg is excluded by !**/*.svg
  • website/static/img/icon-github-star.svg is excluded by !**/*.svg
  • website/static/img/logo.svg is excluded by !**/*.svg
  • website/static/img/velox-logo.svg is excluded by !**/*.svg
📒 Files selected for processing (107)
  • .clang-tidy (1 hunks)
  • .cmake-format.yaml (2 hunks)
  • .github/CODEOWNERS (3 hunks)
  • .github/ISSUE_TEMPLATE/bug.yml (2 hunks)
  • .github/ISSUE_TEMPLATE/build.yml (2 hunks)
  • .github/ISSUE_TEMPLATE/enhancement.yml (1 hunks)
  • .github/ISSUE_TEMPLATE/fuzzer.yml (2 hunks)
  • .github/dependabot.yml (1 hunks)
  • .github/workflows/docs.yml (3 hunks)
  • .github/workflows/linux-build-base.yml (2 hunks)
  • .github/workflows/linux-build.yml (1 hunks)
  • .github/workflows/preliminary_checks.yml (1 hunks)
  • .github/workflows/scheduled.yml (1 hunks)
  • .github/zizmor.yml (1 hunks)
  • .pre-commit-config.yaml (1 hunks)
  • .yamlfmt.yml (1 hunks)
  • .yamllint.yml (1 hunks)
  • CMake/FindSodium.cmake (2 hunks)
  • CMake/Findglog.cmake (2 hunks)
  • CMake/Findlz4.cmake (1 hunks)
  • CMake/Findlzo2.cmake (1 hunks)
  • CMake/Findzstd.cmake (1 hunks)
  • CODING_STYLE.md (1 hunks)
  • CONTRIBUTING.md (6 hunks)
  • Makefile (0 hunks)
  • NOTICE.txt (1 hunks)
  • docker-compose.yml (6 hunks)
  • pyproject.toml (0 hunks)
  • python/pyvelox/__init__.py (1 hunks)
  • python/pyvelox/utils/__init__.py (1 hunks)
  • python/pyvelox/utils/data_generator.py (1 hunks)
  • python/test/test_plan_builder.py (1 hunks)
  • python/test/test_vector.py (3 hunks)
  • scripts/check.py (0 hunks)
  • scripts/checks/license-header.py (1 hunks)
  • scripts/checks/run-clang-tidy.py (0 hunks)
  • scripts/checks/util.py (1 hunks)
  • scripts/ci/benchmark-runner.py (2 hunks)
  • scripts/ci/bm-report/build-metrics.py (1 hunks)
  • scripts/ci/bm-report/report.qmd (3 hunks)
  • scripts/ci/hdfs-client.xml (1 hunks)
  • scripts/ci/presto/etc/hive.properties (1 hunks)
  • scripts/ci/presto/start-prestojava.sh (0 hunks)
  • scripts/ci/signature.py (1 hunks)
  • scripts/docker/pyvelox.dockerfile (0 hunks)
  • scripts/git-clang-format (0 hunks)
  • scripts/setup-centos9.sh (0 hunks)
  • scripts/setup-classpath.sh (0 hunks)
  • scripts/setup-helper-functions.sh (0 hunks)
  • scripts/velox_env_linux.yml (2 hunks)
  • scripts/velox_env_mac.yml (2 hunks)
  • velox/docs/bindings/python/arrow.rst (1 hunks)
  • velox/docs/bindings/python/index.rst (0 hunks)
  • velox/docs/bindings/python/legacy.rst (1 hunks)
  • velox/docs/bindings/python/runners.rst (1 hunks)
  • velox/docs/bindings/python/vector.rst (1 hunks)
  • velox/docs/conf.py (1 hunks)
  • velox/docs/develop/aggregations.rst (3 hunks)
  • velox/docs/develop/debugging/print-plan-with-stats.rst (0 hunks)
  • velox/docs/develop/dynamic-loading.rst (1 hunks)
  • velox/docs/develop/operators.rst (4 hunks)
  • velox/docs/ext/issue.py (1 hunks)
  • velox/docs/ext/pr.py (1 hunks)
  • velox/docs/ext/spark.py (1 hunks)
  • velox/docs/functions/presto/binary.rst (2 hunks)
  • velox/docs/functions/presto/window.rst (1 hunks)
  • velox/docs/functions/spark/aggregate.rst (3 hunks)
  • velox/docs/functions/spark/array.rst (1 hunks)
  • velox/docs/functions/spark/binary.rst (1 hunks)
  • velox/docs/functions/spark/bitwise.rst (2 hunks)
  • velox/docs/functions/spark/comparison.rst (2 hunks)
  • velox/docs/functions/spark/coverage.rst (1 hunks)
  • velox/docs/functions/spark/datetime.rst (0 hunks)
  • velox/docs/functions/spark/decimal.rst (1 hunks)
  • velox/docs/functions/spark/json.rst (2 hunks)
  • velox/docs/functions/spark/misc.rst (1 hunks)
  • velox/docs/functions/spark/string.rst (10 hunks)
  • velox/docs/monitoring.rst (1 hunks)
  • velox/docs/monthly-updates/2021/december-2021.rst (1 hunks)
  • velox/docs/monthly-updates/2021/november-2021.rst (1 hunks)
  • velox/docs/monthly-updates/2022/april-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2022/august-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2022/july-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2022/june-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2022/may-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2022/october-2022.rst (1 hunks)
  • velox/docs/monthly-updates/2023/august-2023.rst (1 hunks)
  • velox/docs/monthly-updates/2023/december-2023.rst (1 hunks)
  • velox/docs/monthly-updates/2023/november-2023.rst (1 hunks)
  • velox/docs/monthly-updates/january-2024.rst (0 hunks)
  • velox/docs/monthly-updates/july-2024.rst (1 hunks)
  • velox/dwio/common/tests/Lemire/FastPFor/LICENSE (1 hunks)
  • velox/dwio/dwrf/test/CommonTests.cpp (2 hunks)
  • velox/dwio/parquet/thrift/ParquetThriftTypes.cpp (28 hunks)
  • velox/exec/tests/utils/TableScanTestBase.cpp (1 hunks)
  • velox/experimental/breeze/test/generator_common.py (1 hunks)
  • velox/experimental/breeze/test/kernel_generator.py (2 hunks)
  • velox/experimental/breeze/test/test_fixture_generator.py (5 hunks)
  • velox/experimental/cudf/.clang-format (1 hunks)
  • velox/experimental/wave/README.md (1 hunks)
  • velox/functions/prestosql/coverage/README.md (1 hunks)
  • velox/python/arrow/arrow.pyi (0 hunks)
  • velox/python/file/file.pyi (0 hunks)
  • velox/python/plan_builder/plan_builder.pyi (2 hunks)
  • velox/python/runner/runner.pyi (0 hunks)
  • velox/python/type/type.pyi (0 hunks)
  • velox/python/vector/vector.pyi (0 hunks)
⛔ Files not processed due to max files limit (16)
  • velox/substrait/tests/data/q1_first_stage.json
  • velox/substrait/tests/data/q6_first_stage.json
  • website/README.md
  • website/blog/2023-03-15-build-experience.mdx
  • website/blog/2024-05-31-optimize-try-more.mdx
  • website/blog/2024-08-23-ci-migration.mdx
  • website/blog/2025-03-25-velox-primer-part-2.mdx
  • website/blog/2025-05-12-velox-primer-part-3.mdx
  • website/blog/authors.yml
  • website/docs/community/01-design-philosophy.md
  • website/docs/community/02-technical-governance.md
  • website/docs/community/03-components-and-maintainers.md
  • website/docs/community/index.md
  • website/src/components/HomepageFeatures/index.js
  • website/src/components/VeloxConBanner/index.js
  • website/src/pages/index.js
💤 Files with no reviewable changes (19)
  • scripts/setup-classpath.sh
  • velox/docs/bindings/python/index.rst
  • scripts/setup-centos9.sh
  • scripts/ci/presto/start-prestojava.sh
  • velox/python/arrow/arrow.pyi
  • scripts/docker/pyvelox.dockerfile
  • scripts/checks/run-clang-tidy.py
  • scripts/setup-helper-functions.sh
  • velox/python/runner/runner.pyi
  • velox/docs/functions/spark/datetime.rst
  • velox/python/type/type.pyi
  • velox/python/file/file.pyi
  • velox/docs/monthly-updates/january-2024.rst
  • pyproject.toml
  • velox/python/vector/vector.pyi
  • velox/docs/develop/debugging/print-plan-with-stats.rst
  • Makefile
  • scripts/git-clang-format
  • scripts/check.py
🧰 Additional context used
🪛 Pylint (3.3.7)
velox/docs/conf.py

[warning] 33-34: No exception type(s) specified

(W0702)

python/pyvelox/utils/data_generator.py

[convention] 160-160: Line too long (122/100)

(C0301)


[error] 160-160: Instance of 'dict' has no 'row_count' member

(E1101)


[error] 160-160: Instance of 'dict' has no 'file_count' member

(E1101)


[error] 160-160: Instance of 'dict' has no 'output_path' member

(E1101)

python/pyvelox/utils/__init__.py

[convention] 15-15: Import alias does not rename original package

(C0414)

python/pyvelox/__init__.py

[error] 15-15: Unable to import 'pyvelox.legacy'

(E0401)


[error] 16-16: Unable to import 'pyvelox.legacy'

(E0401)


[convention] 16-16: Import alias does not rename original package

(C0414)

scripts/ci/benchmark-runner.py

[warning] 84-84: Catching too general exception Exception

(W0718)

python/test/test_vector.py

[error] 191-191: Module 'pyvelox' has no 'from_list' member

(E1101)


[error] 194-194: Module 'pyvelox' has no 'from_list' member

(E1101)


[error] 197-197: Module 'pyvelox' has no 'from_list' member

(E1101)


[error] 274-274: Module 'pyvelox' has no 'from_list' member

(E1101)


[error] 275-275: Module 'pyvelox' has no 'from_list' member

(E1101)

velox/experimental/breeze/test/generator_common.py

[error] 74-74: Unable to import 'clang.cindex'

(E0401)


[convention] 74-74: Import "import clang.cindex" should be placed at the top of the module

(C0413)


[error] 75-75: Unable to import 'clang.cindex'

(E0401)


[convention] 75-75: Import "from clang.cindex import CursorKind" should be placed at the top of the module

(C0413)

scripts/checks/util.py

[convention] 40-40: Use isinstance() rather than type() for a typecheck.

(C0123)

scripts/ci/signature.py

[convention] 149-149: Line too long (143/100)

(C0301)

🪛 Ruff (0.11.9)
python/pyvelox/utils/data_generator.py

160-160: Logging statement uses f-string

(G004)


160-160: Trailing comma missing

Add trailing comma

(COM812)

scripts/ci/bm-report/build-metrics.py

127-127: Missing return type annotation for private function ms2sec

(ANN202)


127-127: Missing type annotation for function argument x

(ANN001)

scripts/ci/benchmark-runner.py

84-84: Do not catch blind exception: Exception

(BLE001)

scripts/checks/license-header.py

32-32: Trailing comma missing

Add trailing comma

(COM812)

python/test/test_vector.py

193-193: Use pytest.raises instead of unittest-style assertRaises

Replace assertRaises with pytest.raises

(PT027)


196-196: Use pytest.raises instead of unittest-style assertRaises

Replace assertRaises with pytest.raises

(PT027)


340-340: Use a regular assert instead of unittest-style assertEqual

Replace assertEqual(...) with assert ...

(PT009)


342-342: Use a regular assert instead of unittest-style assertEqual

Replace assertEqual(...) with assert ...

(PT009)


344-344: Use pytest.raises instead of unittest-style assertRaises

Replace assertRaises with pytest.raises

(PT027)

🪛 LanguageTool
CONTRIBUTING.md

[uncategorized] ~210-~210: Possible missing comma found.
Context: ...h information at a time; beyond that threshold the ability to find bugs and other flaw...

(AI_HYDRA_LEO_MISSING_COMMA)


[style] ~235-~235: As an alternative to the over-used intensifier ‘very’, consider replacing this phrase.
Context: ...s possible, try to avoid functions with very large bodies. In the (rare) cases where la...

(EN_WEAK_ADJECTIVE)


[uncategorized] ~241-~241: Possible missing article found.
Context: ...upport your claims. * As needed, add micro-benchmark to objectively evaluate perfo...

(AI_HYDRA_LEO_MISSING_A)

velox/experimental/wave/README.md

[typographical] ~28-~28: Use a comma after an introductory phrase.
Context: ...al CUDA driver installed (like our CI). For this reason we need to use the base functions to cr...

(COMMA_INTRODUCTORY_WORDS_PHRASES)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: pre-commit
🔇 Additional comments (101)
velox/docs/monitoring.rst (1)

9-9: Add trailing newline for POSIX compliance
This matches the pattern applied to other documentation files, ensuring a newline at EOF.

velox/docs/monthly-updates/2022/april-2022.rst (1)

59-59: Append newline at end of file
Aligns with the repository’s convention of terminating text files with a newline.

scripts/ci/presto/etc/hive.properties (1)

5-5: Ensure trailing newline in configuration file
Adds a final newline for consistency and to prevent potential parsing issues.

velox/docs/monthly-updates/2022/may-2022.rst (1)

68-68: Insert EOF newline for consistency
Standardises file endings across documentation.

velox/docs/monthly-updates/2022/october-2022.rst (1)

64-64: Add final newline to conform with POSIX
Maintains consistent formatting for all .rst files.

scripts/ci/hdfs-client.xml (1)

7-7: Add trailing newline for consistent file endings.

Ensures the XML file ends with a newline, aligning with repository conventions.

velox/dwio/common/tests/Lemire/FastPFor/LICENSE (1)

191-191: Add missing trailing newline.

Aligns the LICENSE file with POSIX text file newline conventions.

velox/docs/ext/issue.py (1)

16-16: Remove unused import.

The utils import was correctly removed, tidying up unused references.

velox/docs/monthly-updates/2022/august-2022.rst (1)

88-88: Add trailing newline for POSIX compliance.

Ensures the document ends with a newline, matching repository style guidelines.

velox/docs/functions/spark/binary.rst (1)

35-37: Clean up trailing whitespace.

Removed extraneous spaces at the ends of lines to improve formatting consistency.

velox/docs/monthly-updates/2023/december-2023.rst (1)

99-99: Add missing newline at end of file
Ensures consistent POSIX-style EOF formatting and satisfies pre-commit’s newline requirement.

velox/docs/monthly-updates/july-2024.rst (1)

128-128: Add missing newline at end of file
Maintains uniform file endings across documentation, aligning with pre-commit formatting checks.

velox/docs/monthly-updates/2021/december-2021.rst (1)

38-38: Remove trailing whitespace and add newline at EOF
Cleans up stray whitespace and adds final newline to comply with formatting standards.

velox/docs/functions/presto/window.rst (1)

171-171: Add missing newline at end of file
Aligns file with the project’s newline-at-EOF convention enforced by pre-commit hooks.

velox/docs/monthly-updates/2023/august-2023.rst (1)

85-85: Add missing newline at end of file
Ensures consistent documentation formatting and passes pre-commit checks.

velox/docs/bindings/python/legacy.rst (1)

12-12: Formatting: add missing trailing newline
A newline has been added after the last directive to ensure consistent POSIX‐compliant file termination across documentation.

velox/docs/bindings/python/runners.rst (1)

8-8: Formatting: add missing trailing newline
A newline has been appended at EOF to align with the project's documentation style and avoid warnings in CI checks.

velox/docs/monthly-updates/2021/november-2021.rst (1)

38-38: Formatting: remove extra blank line
The trailing blank line at the end of the credits section was removed to normalize file endings and satisfy the repository’s newline‐at‐EOF policy.

velox/docs/ext/pr.py (1)

16-16: Cleanup: remove unused import
Dropped the unused utils import from docutils, reducing clutter and eliminating linter warnings.

velox/docs/monthly-updates/2023/november-2023.rst (1)

105-105: Formatting: add missing trailing newline
Inserted a newline after the last contributor to comply with the project’s consistent file termination requirements.

velox/docs/monthly-updates/2022/july-2022.rst (1)

58-58: Ensure consistent newline at end of file.

A trailing newline has been added to this documentation file to align with repository conventions and avoid issues with tools that expect EOF newlines.

velox/experimental/cudf/.clang-format (1)

27-27: Add missing newline at end of .clang-format.

Including a final newline prevents potential warnings from formatting utilities and upholds POSIX file standards.

velox/docs/bindings/python/arrow.rst (1)

8-8: Add trailing newline.

This change introduces a final newline to the RST file, ensuring compatibility with Sphinx and other documentation tools.

velox/docs/bindings/python/vector.rst (1)

8-8: Add trailing newline.

A newline at EOF ensures consistent formatting and prevents parsing issues in the documentation build.

python/pyvelox/utils/data_generator.py (1)

160-160: Remove trailing whitespace before inline comment.

The space before # pyre-ignore introduces trailing whitespace that will be flagged by pre-commit hooks. Please remove it.

Apply this diff:

-        f"Written {result.row_count} records to {result.file_count} output files at '{result.output_path}'"  # pyre-ignore
+        f"Written {result.row_count} records to {result.file_count} output files at '{result.output_path}'" # pyre-ignore

Likely an incorrect or invalid review comment.

velox/docs/monthly-updates/2022/june-2022.rst (1)

66-66: Add trailing newline at EOF
Ensures POSIX-compliant file formatting and consistency across documentation.

velox/docs/functions/spark/bitwise.rst (2)

7-7: Remove trailing whitespace
Cleans up an extra space in the function description and keeps the documentation tidy.


50-50: Ensure newline at EOF
Adds a trailing newline for POSIX compliance and consistency with other docs.

CMake/Findzstd.cmake (1)

2-13: Add Apache 2.0 license header
Standardizes licensing comments to match other CMake find modules.

velox/exec/tests/utils/TableScanTestBase.cpp (1)

1-15: Update to Apache 2.0 license header
Replaces the proprietary notice with the standard Apache License block, aligning with project-wide licensing.

scripts/velox_env_linux.yml (2)

25-25: Add space after comment marker
Improves readability by standardizing comment formatting.


40-40: Add space after comment marker
Maintains consistent YAML comment style with other environment configuration files.

velox/experimental/wave/README.md (2)

20-20: Approve removal of trailing whitespace.

The updated line cleans up trailing spaces without altering the intended instructions.


27-28: Add comma after introductory phrase.

Consider inserting a comma after “For this reason” to improve readability:

- For this reason we need to use the base functions...
+ For this reason, we need to use the base functions...

Likely an incorrect or invalid review comment.

CMake/Findlzo2.cmake (1)

2-14: Approve addition of Apache 2.0 license header.

The new header aligns with other CMake modules and introduces no functional changes.

velox/functions/prestosql/coverage/README.md (1)

18-18: Approve removal of trailing space.

This cleanup removes extraneous whitespace without modifying the documentation semantics.

velox/docs/functions/spark/misc.rst (1)

7-7: Approve removal of trailing whitespace.

The formatting change is purely cosmetic and preserves all existing content.

velox/docs/develop/dynamic-loading.rst (1)

15-15: Approve trailing-whitespace removal
This change tidies up formatting and aligns the file with the new pre-commit whitespace rules.

CMake/Findlz4.cmake (1)

2-14: Approve addition of Apache 2.0 license header
The newly inserted header correctly applies the required licensing boilerplate without altering any logic.

velox/docs/functions/spark/comparison.rst (2)

30-30: Approve removal of trailing space
This minor cleanup improves consistency in the documentation source.


47-47: Approve removal of trailing space
The whitespace correction ensures uniform formatting across the docs.

NOTICE.txt (1)

13-13: Approve typo fix in project notice
Removing the extra “The” corrects the phrasing in the legal notice.

velox/docs/functions/spark/array.rst (1)

265-265: Approve removal of trailing space
This adjustment cleans up the shuffle function description to meet formatting standards.

velox/docs/functions/presto/binary.rst (1)

78-86: Whitespace cleanup LGTM

Only trailing-space removal and minor re-flow – no semantic impact.

Also applies to: 92-101

.github/CODEOWNERS (1)

19-20: No-op formatting changes

Trailing-space trims don’t affect CODEOWNERS resolution.
All good.

Also applies to: 32-32, 45-45

velox/docs/functions/spark/aggregate.rst (1)

29-31: Whitespace tweaks acknowledged

Pure formatting; content unchanged.
No further action needed.

Also applies to: 51-53, 165-167, 169-169

velox/experimental/breeze/test/generator_common.py (1)

74-75: Import placement rationale accepted

clang.cindex must be imported after sys.path manipulation; suppressing E402 with # noqa E402 is the correct compromise.
Nothing else to address.

.github/dependabot.yml (1)

17-22: Consistent quoting style – looks good

Unquoting the scalar values while keeping the commit-message.prefix quoted improves readability and poses no functional risk.

velox/docs/functions/spark/json.rst (1)

24-33: Whitespace cleanup approved

Only spacing was touched; content and semantics remain intact.

Also applies to: 56-56

velox/experimental/breeze/test/kernel_generator.py (1)

109-110: Pythonic is not None 👍

Switching from != None to is not None removes a lint warning and is the correct identity check.

scripts/velox_env_mac.yml (1)

25-25: Minor style tweak acknowledged

The added space after comment markers aligns this file with common YAML guidelines.

Also applies to: 39-39

scripts/ci/bm-report/report.qmd (1)

225-225: Trailing-space removal only – no action required

Also applies to: 335-335

velox/docs/develop/aggregations.rst (2)

121-123: Pure formatting cleanup.
Removed trailing spaces and adjusted blank lines in the bullet list for consistent spacing. No content changes introduced.


137-139: Pure formatting cleanup.
Adjusted indentation and blank lines around the SQL example for consistency. No functional or semantic changes.

velox/docs/functions/spark/coverage.rst (1)

84-86: Pure formatting cleanup.
Removed trailing whitespace characters from the function table entries to enforce consistent styling. No content modifications.

velox/docs/ext/spark.py (1)

656-658: Stylistic consistency only.
Updated the f-string quoting around the index entry text for built-in functions. This is purely a style tweak with no behavioural impact.

scripts/ci/benchmark-runner.py (1)

456-459: Updated help text looks good

Re-flowing the description into one line improves readability without altering semantics.

velox/docs/develop/operators.rst (1)

319-319: Whitespace cleanup acknowledged

Trailing-space removals are harmless and keep the docs tidy.

Also applies to: 350-360, 392-394, 400-407, 412-418, 424-425

.github/zizmor.yml (1)

14-17: Rule section LGTM

Switching to the rules: stanza is clear and the ignore list is explicit.

velox/docs/functions/spark/decimal.rst (1)

163-169: Minor wording/whitespace tweak accepted

No functional impact; documentation reads well.

velox/dwio/dwrf/test/CommonTests.cpp (1)

98-99: Formatting nit resolved

Removal of stray spaces keeps clang-format happy. No behaviour change.

Also applies to: 148-149

python/test/test_vector.py (3)

190-198: Underscore-prefixed throw-away variables are fine here

Renaming the captured variables to _a / _v / _a makes their “unused” nature explicit and keeps the linter quiet. No functional impact.


274-276: Consistent unused-variable convention retained

The new _bigger_than_int64 sentinel follows the same pattern as above and preserves the intent of the overflow test.


336-346: Readability of slice step tests unchanged

Only variable names were swapped to the underscore form; the NotImplementedError contract remains intact.

CMake/FindSodium.cmake (3)

270-273: Property list re-formatting LGTM

Purely cosmetic re-wrap of set_target_properties; no behavioural change.


277-281: Static-link branch still sets all required locations

IMPORTED_LOCATION(_DEBUG) now grouped under the same call—looks clean, no regressions spotted.


297-301: Extra IMPORTED_LOCATION_ variants retained*

The additional config-specific locations for the DLL are still wired up correctly.

CMake/Findglog.cmake (2)

2-14: Licence header addition only

Adding the ASF-2.0 header is a non-code change—good housekeeping.


40-46: Imported target properties remain correct

Interface include path and imported location are still set; switching to the modern formatting is harmless.

velox/experimental/breeze/test/test_fixture_generator.py (5)

37-41: Dropped unnecessary f-string – nice micro-clean-up

AUTOGEN_HEADER contained no interpolation, so using a plain triple-quoted string is clearer.


266-267: Kernel launcher line re-wrapped only

Indentation change doesn’t affect code generation; everything still compiles.


417-418: Lambda body formatting tweak

No semantic change; fine to merge.


433-438: Constant include block – interpolation not required

The OpenCL fixture includes no longer depend on test_type, so converting to a raw string is OK.


545-549: Same for Metal fixture includes

Matches the pattern above; good consistency.

.yamllint.yml (1)

14-47: Comprehensive yamllint policy added

The rule-set is strict but sensible and pairs well with the new pre-commit hook.

velox/dwio/parquet/thrift/ParquetThriftTypes.cpp (1)

852-862: Formatting Consistency: Consolidate stream insertions across printTo methods

Stylistic update merges separate out << ", " and field‐label insertions into single streaming expressions for uniform readability. No functional change.

Also applies to: 1363-1363, 1666-1668, 1779-1779, 1997-1997, 2781-2799, 2990-2995

.github/ISSUE_TEMPLATE/enhancement.yml (1)

17-17: YAML list syntax update is correct
Switching to an unquoted list [enhancement] is valid YAML and aligns with other issue templates’ style updates.

scripts/checks/license-header.py (1)

31-33: Update default license header path
Pointing --header to scripts/checks/license.header matches the new file layout. Ensure that license.header resides at this path.

velox/docs/conf.py (1)

32-34: Suppress bare except lint warning correctly
The # noqa E722 comment on the bare except: silences the warning as intended.

.github/workflows/scheduled.yml (2)

20-29: Unquote paths and modernize trigger to pyproject.toml
Removing quotes around paths and replacing setup.py with pyproject.toml keeps workflow configuration consistent with current project standards.


35-44: Verify removal of third_party/** from CI triggers
Dropping third_party/** may skip CI checks on submodule or vendored code. Confirm this change won’t unintentionally bypass necessary tests.

CONTRIBUTING.md (1)

7-8: No substantive change—looks good.

The edits in this block are purely whitespace/word-wrapping adjustments; there is no content impact.

.github/workflows/linux-build.yml (1)

22-30: Quotation removal is acceptable.

Unquoting the path globs is syntactically valid YAML and should not affect the filter logic. Nothing further.

.github/ISSUE_TEMPLATE/bug.yml (1)

17-18: Minor YAML style tweak acknowledged.

Label list formatting change is stylistic only; behaviour remains unchanged.

python/test/test_plan_builder.py (1)

58-59: String literal consolidation is fine.

The expected plan string is functionally identical; test clarity preserved.

.github/ISSUE_TEMPLATE/build.yml (1)

17-17: Standardize YAML list quoting
Removed unnecessary quotes around the labels array to align with other templates.

.github/ISSUE_TEMPLATE/fuzzer.yml (2)

17-17: Standardize YAML list quoting
Removed quotes around the labels array to match other issue templates.


29-29: Unify placeholder formatting
Updated the placeholder to use single quotes for consistency; no functional change.

.cmake-format.yaml (2)

27-28: Normalize YAML string quoting
Removed quotes from command_case and keyword_case values for consistency and readability; no semantic change.


42-45: Normalize YAML list quoting
Unquoted the flags under velox_add_library to match style elsewhere; unchanged behaviour.

.yamlfmt.yml (1)

14-22: Convert to declarative YAML formatter config
Replaced embedded setup script with a structured configuration for yamlfmt. Confirm this aligns with the pre-commit hook configuration.

.github/workflows/docs.yml (4)

20-21: Standardize path pattern quoting
Removed quotes around trigger paths in push and pull_request events; purely stylistic.

Also applies to: 25-26


40-40: Simplify environment variable syntax
Unquoted CCACHE_DIR value for consistency with other workflows.


42-49: Verify ccache restore step
The restore action is explicitly disabled (if: false). Confirm if this was intentional or if caching should be enabled to speed up builds.


68-73: Add ccache save step
Introduced a Save ccache step to persist the cache with a consistent key; this complements the caching strategy.

docker-compose.yml (1)

53-58: Ensure folded style preserves intended whitespace

Using the YAML folded style (>) for EXTRA_CMAKE_FLAGS concatenates lines with spaces, which may alter flag parsing. Verify that this layout yields the correct flags in CMake. If literal line breaks are required, switch to a literal block (|).

.pre-commit-config.yaml (4)

1-8: License header inclusion is correct
Including the full Apache 2.0 header at the top clearly communicates project licensing.


26-35: Verify trailing-whitespace hook arguments
The --markdown-linebreak-ext=md flag is uncommon; please confirm it’s supported in pre-commit-hooks v5.0.0 to avoid hook failures.


48-58: Verify clang-tidy hook configuration
You’ve declared clang-tidy as a Python hook with additional_dependencies: [clang-tidy==18.1.8], but upstream clang-tidy is usually a system binary, not a PyPI package. Please confirm this installs correctly or consider switching to language: system or using the official pre-commit-mirrors-clang-tidy repo.


59-78: Confirm license-header script path
The hook entry points to ./scripts/checks/license-header.py. Ensure that script still exists in the repo at that path and is executable—if it was removed with the legacy scripts, update or restore it.

velox/python/plan_builder/plan_builder.pyi (1)

18-18: Remove unused imports cleanly
Retaining only Optional from typing aligns with PEP 585 improvements and reduces clutter.

# limitations under the License.

from .data_generator import generate_tpch_data
from .data_generator import generate_tpch_data as generate_tpch_data

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Remove redundant import alias.

The alias duplicates the original name and can be omitted for clarity:

-from .data_generator import generate_tpch_data as generate_tpch_data
+from .data_generator import generate_tpch_data
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
from .data_generator import generate_tpch_data as generate_tpch_data
-from .data_generator import generate_tpch_data as generate_tpch_data
+from .data_generator import generate_tpch_data
🧰 Tools
🪛 Pylint (3.3.7)

[convention] 15-15: Import alias does not rename original package

(C0414)

🤖 Prompt for AI Agents
In python/pyvelox/utils/__init__.py at line 15, remove the redundant alias in
the import statement by changing "from .data_generator import generate_tpch_data
as generate_tpch_data" to "from .data_generator import generate_tpch_data" to
improve clarity.

Comment on lines +127 to +129
def ms2sec(x):
return x / 1000

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Add type hints to silence Ruff & improve readability

ms2sec is flagged (ANN001/ANN202). A tiny hint keeps the codebase clean without extra ignores.

-        def ms2sec(x):
-            return x / 1000
+        def ms2sec(x: int | float) -> float:
+            return x / 1000.0
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
def ms2sec(x):
return x / 1000
def ms2sec(x: int | float) -> float:
return x / 1000.0
🧰 Tools
🪛 Ruff (0.11.9)

127-127: Missing return type annotation for private function ms2sec

(ANN202)


127-127: Missing type annotation for function argument x

(ANN001)

🤖 Prompt for AI Agents
In scripts/ci/bm-report/build-metrics.py around lines 127 to 129, the function
ms2sec lacks type hints, causing Ruff to flag it. Add type hints to the function
signature by specifying the input parameter type as float and the return type as
float to improve readability and silence the linter warnings.

Comment on lines 108 to 111
warp_threads = self.num_warp_threads()
if warp_threads != None:
if warp_threads is not None:
out.write(f"enum {{ WARP_THREADS = {warp_threads} }};")
for kernel in kernels:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Missing newline after generated enum may break emitted code

out.write(f"enum {{ WARP_THREADS = {warp_threads} }};") emits no trailing newline, so the next token (often template or a function return-type) will appear on the same line, producing malformed C++.

-        if warp_threads is not None:
-            out.write(f"enum {{ WARP_THREADS = {warp_threads} }};")
+        if warp_threads is not None:
+            out.write(f"enum {{ WARP_THREADS = {warp_threads} }};\n")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
warp_threads = self.num_warp_threads()
if warp_threads != None:
if warp_threads is not None:
out.write(f"enum {{ WARP_THREADS = {warp_threads} }};")
for kernel in kernels:
warp_threads = self.num_warp_threads()
if warp_threads is not None:
out.write(f"enum {{ WARP_THREADS = {warp_threads} }};\n")
for kernel in kernels:
🧰 Tools
🪛 Pylint (3.3.7)

[error] 108-108: Assigning result of a function call, where the function returns None

(E1128)

🤖 Prompt for AI Agents
In velox/experimental/breeze/test/kernel_generator.py around lines 108 to 111,
the code writes an enum declaration without a trailing newline, causing the next
token to be on the same line and resulting in malformed C++ code. Fix this by
appending a newline character to the string passed to out.write, ensuring the
enum declaration ends with a newline.

Comment thread scripts/ci/signature.py
Comment on lines 147 to +149
error_message = ""
for rep_change in delta["repetition_change"]:
error_message += f"""'{rep_change.get_root_key()}{rep_change.t1}' is repeated {rep_change.repetition['new_repeat']} times.\n"""
error_message += f"""'{rep_change.get_root_key()}{rep_change.t1}' is repeated {rep_change.repetition["new_repeat"]} times.\n"""

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Address line length violation.
The new f-string at line 149 is 143 characters long, triggering Pylint C0301. Consider breaking the message into multiple concatenated strings or using parentheses and implicit concatenation for better readability and to satisfy line-length limits.

🧰 Tools
🪛 Pylint (3.3.7)

[convention] 149-149: Line too long (143/100)

(C0301)

🤖 Prompt for AI Agents
In scripts/ci/signature.py around lines 147 to 149, the f-string used to build
error_message exceeds the line length limit. To fix this, break the long
f-string into multiple shorter strings using parentheses for implicit
concatenation or split it into concatenated parts, ensuring each line stays
within the allowed length for better readability and compliance with Pylint
C0301.

Comment on lines +15 to +16
from .legacy import * # noqa: F403
from .legacy import __version__ as __version__

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Remove redundant import alias.
The statement from .legacy import __version__ as __version__ uses an unnecessary alias. Simplify to:

from .legacy import __version__

This preserves clarity and resolves the Pylint C0414 alias warning.

🧰 Tools
🪛 Pylint (3.3.7)

[error] 15-15: Unable to import 'pyvelox.legacy'

(E0401)


[error] 16-16: Unable to import 'pyvelox.legacy'

(E0401)


[convention] 16-16: Import alias does not rename original package

(C0414)

🤖 Prompt for AI Agents
In python/pyvelox/__init__.py at lines 15 to 16, the import statement uses an
unnecessary alias for __version__. Replace `from .legacy import __version__ as
__version__` with `from .legacy import __version__` to remove the redundant
alias and fix the Pylint C0414 warning.

Comment thread CODING_STYLE.md
Comment on lines +45 to +48
The `clang-tidy` hook will *not* be run automatically as it takes a long time and
requires CMake to be run first to create `compile_commands.json`.
It can be run explicitly via `pre-commit run --hook-stage=manual`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Clarify manual clang-tidy invocation

Specify the hook id for clarity:

pre-commit run --hook-stage=manual clang-tidy

This aligns the docs with the actual hook configuration.

🤖 Prompt for AI Agents
In CODING_STYLE.md around lines 45 to 48, clarify the manual invocation of the
clang-tidy hook by specifying the exact hook id in the example command. Update
the documentation to show the command as "pre-commit run --hook-stage=manual
clang-tidy" to align with the actual hook configuration and improve clarity.

Comment thread .clang-tidy
Comment on lines +3 to +7
-abseil-*,
-android-*,
-cert-err58-cpp,
-cert-err58-cpp,
-clang-analyzer-osx-*,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Remove duplicate check entries

The disabled patterns list contains duplicates (e.g., cert-err58-cpp twice). Deduplicate entries to streamline maintenance.

🤖 Prompt for AI Agents
In the .clang-tidy file between lines 3 and 7, there are duplicate entries in
the disabled checks list, specifically the `cert-err58-cpp` pattern appears
twice. Remove the duplicate entries so that each disabled check pattern appears
only once to keep the configuration clean and maintainable.

Comment thread .clang-tidy
Comment on lines +49 to +52
HeaderFilterRegex: '.*'

WarningsAsErrors: ''

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Restrict HeaderFilterRegex for performance

HeaderFilterRegex: '.*' makes clang-tidy run on all headers, including external deps. Narrow this to project directories (e.g., '(src|include)/.*') to speed up analysis.

🤖 Prompt for AI Agents
In the .clang-tidy file around lines 49 to 52, the HeaderFilterRegex is set to
'.*', causing clang-tidy to analyze all headers including external dependencies,
which slows down performance. Change the HeaderFilterRegex value to restrict it
to your project directories, for example '(src|include)/.*', to limit analysis
to relevant headers and improve speed.

Comment thread .clang-tidy
Comment on lines +1 to +15
Checks: >
*,
-abseil-*,
-android-*,
-cert-err58-cpp,
-cert-err58-cpp,
-clang-analyzer-osx-*,
-cppcoreguidelines-avoid-c-arrays,
-cppcoreguidelines-avoid-goto,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-avoid-non-const-global-variables,
-cppcoreguidelines-owning-memory,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
-cppcoreguidelines-pro-type-reinterpret-cast,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Switch to literal block for Checks list

Using YAML folded style (>) merges lines, which can break comma-separated patterns. Prefer a literal block (|) to preserve each entry:

-Checks: >
+Checks: |
   *
   -abseil-*
   -android-*
   ...

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In the .clang-tidy file from lines 1 to 15, the Checks list uses YAML folded
style (>) which merges lines and can break comma-separated patterns. Change the
folded style indicator (>) to a literal block indicator (|) to preserve each
entry on its own line and ensure the list is parsed correctly.

Comment on lines +41 to 46
aliases: dict[str, str] = {},
subfields: dict[str, list[int]] = {},
row_index: str = "",
connector_id: str = "prism",
input_files: List[File] = [],
input_files: list[File] = [],
) -> PlanBuilder: ...

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Avoid mutable default arguments in stubs
Using {} and [] as defaults can be misleading; consider switching to None with Optional[...] for clarity:

aliases: Optional[dict[str, str]] = None
subfields: Optional[dict[str, list[int]]] = None
input_files: Optional[list[File]] = None
🤖 Prompt for AI Agents
In velox/python/plan_builder/plan_builder.pyi around lines 41 to 46, mutable
default arguments like {} and [] are used, which can lead to unexpected
behavior. Change these defaults to None and update the type hints to
Optional[...] accordingly for aliases, subfields, and input_files to clearly
indicate that the default is no value.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (3)
.github/workflows/linux-build-base.yml (3)

31-33: Quote environment variable values

Wrap complex values in quotes to ensure proper YAML parsing and avoid potential ambiguity.

-      CCACHE_DIR: ${{ github.workspace }}/ccache
-      USE_CLANG: ${{ inputs.use-clang && 'true' || 'false' }}
-      STASH_KEY: velox-ccache-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}-${{ replace(github.repository, '/', '-') }}-${{ replace(github.ref_name, '/', '-') }}
+      CCACHE_DIR: "${{ github.workspace }}/ccache"
+      USE_CLANG: "${{ inputs.use-clang && 'true' || 'false' }}"
+      STASH_KEY: "velox-ccache-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}-${{ replace(github.repository, '/', '-') }}-${{ replace(github.ref_name, '/', '-') }}"

57-59: Split the concatenated step name

The step name Clear CCache StatisticsMore actions is malformed; split into a proper name and ensure the run block is correctly indented.

-      - name: Clear CCache StatisticsMore actions
+      - name: Clear CCache Statistics
         run: |
           ccache -sz

65-65: Quote MAKEFLAGS value

Wrap the MAKEFLAGS string to avoid misinterpretation.

-          MAKEFLAGS: MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3
+          MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40afa57 and 3f445dd.

📒 Files selected for processing (1)
  • .github/workflows/linux-build-base.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)


33-33: undefined function "replace". available functions are "always", "cancelled", "contains", "endswith", "failure", "format", "fromjson", "hashfiles", "join", "startswith", "success", "tojson"

(expression)

🔇 Additional comments (7)
.github/workflows/linux-build-base.yml (7)

21-21: Approve user-friendly input description

The use-clang description clearly communicates its purpose.


28-28: Job name is descriptive

Renaming to “Ubuntu release with resolve_dependency” aligns with the job’s scope.


31-33: Verify replace usage in expressions

Actionlint flags replace as undefined. Confirm that GitHub Actions supports replace() here or adjust to a supported function.


39-42: Approve checkout step positioning

Moving actions/checkout@v4 with persist-credentials: false to the top ensures a clean workspace before credential loading.


47-47: Approve stash directory creation

Creating the ccache directory upfront avoids errors in subsequent steps.


68-69: Verify build target change

Confirm that switching from make release to make minimal covers all intended artefacts and that it doesn’t reduce test coverage accidentally.


75-77: Approve cache save step

Saving the ccache stash after the build maintains efficiency for future runs.

Comment thread .github/workflows/linux-build-base.yml Outdated
Comment thread .github/workflows/linux-build-base.yml Outdated
Comment on lines +49 to +51
- name: Get Release Build Ccache Stash
run: |
~/yscache/restore.sh "$STASH_KEY" "$CCACHE_DIR"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Consider using $HOME instead of ~

Using $HOME/yscache/restore.sh improves portability in non-interactive shells.

-          ~/yscache/restore.sh "$STASH_KEY" "$CCACHE_DIR"
+          "$HOME/yscache/restore.sh" "$STASH_KEY" "$CCACHE_DIR"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Get Release Build Ccache Stash
run: |
~/yscache/restore.sh "$STASH_KEY" "$CCACHE_DIR"
- name: Get Release Build Ccache Stash
run: |
"$HOME/yscache/restore.sh" "$STASH_KEY" "$CCACHE_DIR"
🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml around lines 49 to 51, replace the
tilde (~) with $HOME in the path to the restore.sh script to improve portability
in non-interactive shells. Change the script path from ~/yscache/restore.sh to
$HOME/yscache/restore.sh in the run command.

Xiaochong Wei added 2 commits June 18, 2025 12:13

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
.github/workflows/linux-build-base.yml (5)

31-32: Quote environment variable expressions.
Wrap environment values in double quotes to prevent YAML parsing issues, for example:

-env:
-  CCACHE_DIR: ${{ github.workspace }}/ccache
-  USE_CLANG: ${{ inputs.use-clang && 'true' || 'false' }}
+env:
+  CCACHE_DIR: "${{ github.workspace }}/ccache"
+  USE_CLANG: "${{ inputs.use-clang && 'true' || 'false' }}"

59-59: Use $HOME instead of ~ for script paths.
Replace ~ with $HOME to ensure correct expansion in non-interactive shells:

-          ~/yscache/restore.sh "$STASH_KEY" "$CCACHE_DIR"
+          "$HOME/yscache/restore.sh" "$STASH_KEY" "$CCACHE_DIR"

65-67: Fix malformed step name.
Split the concatenated name to clarify the step title:

-      - name: Clear CCache StatisticsMore actions
+      - name: Clear CCache Statistics

73-73: Quote MAKEFLAGS value.
Enclose the complex MAKEFLAGS string in quotes to prevent misinterpretation:

-          MAKEFLAGS: MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3
+          MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"

85-85: Use $HOME instead of ~ for script paths.
Align with the restore step and ensure consistent path expansion:

-          ~/yscache/save.sh "$STASH_KEY" "$CCACHE_DIR"
+          "$HOME/yscache/save.sh" "$STASH_KEY" "$CCACHE_DIR"
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3f445dd and f430fd6.

📒 Files selected for processing (1)
  • .github/workflows/linux-build-base.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

🪛 GitHub Actions: Run Checks
.github/workflows/linux-build-base.yml

[error] 43-50: Zizmor audit detected code injection via template expansion. github.ref_name may expand into attacker-controllable code in the 'Prepare Stash Key' step.

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (1)
.github/workflows/linux-build-base.yml (1)

38-41: Review of checkout step configuration.
Disabling persist-credentials is a good security practice if no write operations on the repo are needed later. Remember to enable it if pushing back to the repository in future steps.

Comment thread .github/workflows/linux-build-base.yml Outdated
Comment thread .github/workflows/linux-build-base.yml Outdated
Comment on lines +43 to +50
- name: Prepare Stash Key
run: |
SANITIZED_REPO="${{ github.repository }}"
SANITIZED_REPO="${SANITIZED_REPO//\//-}"
SANITIZED_REF_NAME="${{ github.ref_name }}"
SANITIZED_REF_NAME="${SANITIZED_REF_NAME//\//-}"
STASH_KEY="velox-ccache-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}-${SANITIZED_REPO}-${SANITIZED_REF_NAME}"
echo "STASH_KEY=$STASH_KEY" >> $GITHUB_ENV

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Sanitize stash key components to prevent injection.
Using github.ref_name directly can enable code injection via template expansion. Restrict characters to alphanumerics, hyphens and underscores:

-  SANITIZED_REPO="${{ github.repository }}"
-  SANITIZED_REPO="${SANITIZED_REPO//\//-}"
+  SANITIZED_REPO=$(echo "${{ github.repository }}" | sed 's/[^A-Za-z0-9_-]/-/g')
-  SANITIZED_REF_NAME="${{ github.ref_name }}"
-  SANITIZED_REF_NAME="${SANITIZED_REF_NAME//\//-}"
+  SANITIZED_REF_NAME=$(echo "${{ github.ref_name }}" | sed 's/[^A-Za-z0-9_-]/-/g')
🧰 Tools
🪛 GitHub Actions: Run Checks

[error] 43-50: Zizmor audit detected code injection via template expansion. github.ref_name may expand into attacker-controllable code in the 'Prepare Stash Key' step.

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml around lines 43 to 50, sanitize the
stash key components by restricting github.ref_name and github.repository to
only alphanumeric characters, hyphens, and underscores to prevent code
injection. Replace any disallowed characters in these variables with safe
characters (e.g., hyphens) before constructing the STASH_KEY. This ensures the
stash key is safe for use in the environment.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (5)
.github/workflows/linux-build-base.yml (5)

31-33: Quote environment variable expressions for YAML parsing

The CCACHE_DIR and USE_CLANG values should be wrapped in quotes to prevent parsing issues:

-      CCACHE_DIR: ${{ github.workspace }}/ccache
-      USE_CLANG: ${{ inputs.use-clang && 'true' || 'false' }}
+      CCACHE_DIR: "${{ github.workspace }}/ccache"
+      USE_CLANG: "${{ inputs.use-clang && 'true' || 'false' }}"

73-73: Quote complex MAKEFLAGS string

Unquoted MAKEFLAGS may be misinterpreted. Wrap the value in quotes:

-          MAKEFLAGS: MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3
+          MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"

85-85: Avoid using ~ in scripts path

Same here: prefer $HOME over ~ in CI environments:

-          ~/yscache/save.sh "$STASH_KEY" "$CCACHE_DIR"
+          "$HOME/yscache/save.sh" "$STASH_KEY" "$CCACHE_DIR"

59-59: Avoid using ~ in scripts path

Paths like ~/yscache/restore.sh may not resolve in non-interactive shells. Use $HOME instead:

-          ~/yscache/restore.sh "$STASH_KEY" "$CCACHE_DIR"
+          "$HOME/yscache/restore.sh" "$STASH_KEY" "$CCACHE_DIR"

43-51: Sanitize stash key components to prevent injection

Using github.ref_name and github.repository directly can allow code injection via template expansion. Restrict these values to alphanumeric characters, hyphens, and underscores:

-          SANITIZED_REPO="${{ github.repository }}"
-          SANITIZED_REPO="${SANITIZED_REPO//\//-}"
-          SANITIZED_REF_NAME="${{ github.ref_name }}"
-          SANITIZED_REF_NAME="${SANITIZED_REF_NAME//\//-}"
+          SANITIZED_REPO=$(echo "${{ github.repository }}" | sed 's/[^A-Za-z0-9_-]/-/g')
+          SANITIZED_REF_NAME=$(echo "${{ github.ref_name }}" | sed 's/[^A-Za-z0-9_-]/-/g')
           STASH_KEY="velox-ccache-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}-${SANITIZED_REPO}-${SANITIZED_REF_NAME}"
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f430fd6 and a8d72a0.

📒 Files selected for processing (1)
  • .github/workflows/linux-build-base.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

🪛 GitHub Actions: Run Checks
.github/workflows/linux-build-base.yml

[error] 43-50: zizmor: code injection via template expansion detected. github.ref_name may expand into attacker-controllable code in step 'Prepare Stash Key'. Audit confidence: High.

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (2)
.github/workflows/linux-build-base.yml (2)

79-82: Display cache stats after build

Including the ccache -vs step post-build is a good practice to inspect cache efficiency.


76-77: ```shell
#!/bin/bash
set -e

Look for a 'release' target in the root Makefile

if rg "^[[:space:]]*release:" -n Makefile; then
echo "Found 'release' target"
else
echo "No 'release' target in Makefile"
fi

Look for a 'minimal' target in the root Makefile

if rg "^[[:space:]]*minimal:" -n Makefile; then
echo "Found 'minimal' target"
else
echo "No 'minimal' target in Makefile"
fi


</details>

</blockquote></details>

</details>

<!-- This is an auto-generated comment by CodeRabbit for review status -->

Comment thread .github/workflows/linux-build-base.yml Outdated
Xiaochong Wei added 2 commits June 18, 2025 14:02

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (2)
.github/workflows/preliminary_checks.yml (1)

39-42: Fetch full history for accurate diffs.

fetch-depth: 2 can omit earlier commits, leading to incomplete diffs when generating the file list. Use fetch-depth: 0 to fetch the full history.

.github/workflows/linux-build-base.yml (1)

55-55: Quote the MAKEFLAGS string.

Unquoted multi-value env vars can be misinterpreted. Enclose MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3 in double quotes.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a8d72a0 and 0659d3e.

📒 Files selected for processing (2)
  • .github/workflows/linux-build-base.yml (1 hunks)
  • .github/workflows/preliminary_checks.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (1)
.github/workflows/preliminary_checks.yml (1)

52-56: Ensure pre-commit targets all PR changes.

git diff --name-only HEAD^1 HEAD only covers the latest commit. For multi-commit PRs, diff against the base ref (e.g., origin/${{ github.event.pull_request.base.ref }}...HEAD) to capture every changed file.

Comment on lines +35 to +36
CCACHE_CONFIGPATH: ~/yscache/pre-commit/ccache.conf
steps:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Use $HOME instead of ~ in CCACHE_CONFIGPATH.

The tilde (~) may not expand in non-interactive shells. Replace it with $HOME for portability.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml at lines 35 to 36, replace the tilde
(~) in the CCACHE_CONFIGPATH environment variable with $HOME to ensure proper
path expansion in non-interactive shells. Change the value from
'~/yscache/pre-commit/ccache.conf' to '$HOME/yscache/pre-commit/ccache.conf' for
better portability.

Comment thread .github/workflows/linux-build-base.yml Outdated
CCACHE_DIR: "${{ github.workspace }}/ccache"
USE_CLANG: "${{ inputs.use-clang && 'true' || 'false' }}"
CCACHE_CONFIGPATH: ~/yscache/velox-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}/ccache.conf
USE_CLANG: ${{ inputs.use-clang && 'true' || 'false' }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Quote the USE_CLANG expression.

Wrapping ${{ inputs.use-clang && 'true' || 'false' }} in double quotes prevents YAML parsing edge cases.

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml at line 32, the expression for
USE_CLANG is not quoted, which can cause YAML parsing issues. Fix this by
wrapping the entire expression `${{ inputs.use-clang && 'true' || 'false' }}` in
double quotes to ensure it is treated as a string and parsed correctly.

Comment thread .github/workflows/linux-build-base.yml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (4)
.github/workflows/linux-build-base.yml (4)

31-31: Use $HOME instead of ~ and quote CCACHE_DIR
Tilde expansion isn’t guaranteed in YAML. Replace ~/yscache/... with $HOME/yscache/... and wrap the entire value in double quotes to ensure reliable path expansion.


33-33: Quote the USE_CLANG expression
Wrapping ${{ inputs.use-clang && 'true' || 'false' }} in double quotes prevents YAML parsing edge cases.


56-56: Quote complex MAKEFLAGS string
The unquoted MAKEFLAGS value can be misinterpreted. Enclose it in double quotes or switch to a list for clarity:

MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"

59-60: Clean up commented-out make release
Either remove the #make release line or add a TODO explaining why it’s disabled to keep the workflow tidy.

📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0659d3e and a1ae373.

📒 Files selected for processing (1)
  • .github/workflows/linux-build-base.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (3)
.github/workflows/linux-build-base.yml (3)

42-42: Securely disable credential persistence
Explicitly setting persist-credentials: false in the checkout step is a strong security practice to avoid leaking GitHub tokens.


48-51: Add Clear CCache Statistics step
Including a dedicated step to clear previous ccache statistics helps maintain consistent cache metrics across builds.


62-64: Display post-build ccache statistics
Running ccache -vs after the build provides visibility into cache performance and hit rates.

ubuntu-release:
name: "Ubuntu release with resolve_dependency"
name: Ubuntu release with resolve_dependency
runs-on: yscope-gh-runner

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix invalid runner label in runs-on
The runner label yscope-gh-runner is not recognized by GitHub Actions. If this is a self-hosted runner, prefix with self-hosted (e.g., runs-on: [self-hosted, yscope-gh-runner]), or switch to a valid hosted runner label.

🧰 Tools
🪛 actionlint (1.7.7)

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml at line 29, the runner label
`yscope-gh-runner` used in `runs-on` is invalid for GitHub Actions. To fix this,
update the `runs-on` value to include the `self-hosted` prefix if this is a
self-hosted runner, changing it to `runs-on: [self-hosted, yscope-gh-runner]`.
Alternatively, replace it with a valid GitHub-hosted runner label if not
self-hosted.

@anlowee
anlowee force-pushed the xwei/upgrade-to-precommit branch from fefbc4b to 16e8eaf Compare June 18, 2025 18:26

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🔭 Outside diff range comments (2)
.github/workflows/preliminary_checks.yml (2)

49-58: Install system dependencies required by C/C++ hooks
Your .pre-commit-config.yaml includes clang-format and clang-tidy hooks, but the runner doesn’t install those binaries by default. Add a step to install them before running pre-commit.

Suggested addition:

      - name: Install C/C++ tools
        run: |
          sudo apt-get update
          sudo apt-get install -y clang-format clang-tidy

53-58: Make file diff detection more robust
Using git diff HEAD^1 HEAD can break in merge commits or nested PR workflows. Consider comparing against the base branch or using the github.event.before and github.sha context variables.

Example:

-          files=$(git diff --name-only HEAD^1 HEAD)
+          files=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }})
♻️ Duplicate comments (7)
.github/workflows/preliminary_checks.yml (1)

37-40: Increase fetch-depth for accurate diffs
With fetch-depth: 2, older commits may be omitted and some file changes can be missed. Use fetch-depth: 0 to fetch the full history.

.github/workflows/linux-build-base.yml (6)

46-50: Use $HOME instead of ~ for portability.

Tilde expansion isn’t guaranteed in non-interactive shells. Replace ~ with $HOME:

- cp -r ~/yscache/velox-ubuntu-release-"${{ inputs.use-clang && 'clang' || 'gcc' }}"/ccache "$CCACHE_DIR"
+ cp -r "$HOME/yscache/velox-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}/ccache" "$CCACHE_DIR"

64-64: Quote the MAKEFLAGS string.

Wrap the complex MAKEFLAGS value in quotes to prevent misinterpretation:

- MAKEFLAGS: MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3
+ MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"

67-68: Address commented-out build command.

Either remove #make release or add a TODO explaining why it’s disabled to keep the workflow clean.


74-77: Consistent stash save path.

Also replace ~ with $HOME when saving the ccache stash to avoid path-expansion issues.


35-35: Quote boolean expression.

Wrap the USE_CLANG expression in quotes to ensure it’s treated as a string:

- USE_CLANG: ${{ inputs.use-clang && 'true' || 'false' }}
+ USE_CLANG: "${{ inputs.use-clang && 'true' || 'false' }}"

31-32: Quote environment variable values.

To avoid YAML parsing edge cases, wrap complex values in quotes:

- CCACHE_DIR: ${{ github.workspace }}/ccache
- CCACHE_CONFIGPATH: ${{ github.workspace }}/ccache.conf
+ CCACHE_DIR: "${{ github.workspace }}/ccache"
+ CCACHE_CONFIGPATH: "${{ github.workspace }}/ccache.conf"
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a1ae373 and 49ee963.

📒 Files selected for processing (2)
  • .github/workflows/linux-build-base.yml (1 hunks)
  • .github/workflows/preliminary_checks.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

🪛 YAMLlint (1.37.1)
.github/workflows/linux-build-base.yml

[error] 33-33: trailing spaces

(trailing-spaces)


[warning] 34-34: missing starting space in comment

(comments)

🪛 GitHub Actions: Run Checks
.github/workflows/linux-build-base.yml

[error] 31-31: trailing-whitespace hook failed and fixed trailing whitespace issues in this file. Command exited with code 1.

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (5)
.github/workflows/linux-build-base.yml (5)

21-21: Well-defined input description.

The use-clang input has a clear description aligning with its boolean type.


28-28: Clarify job name.

The custom job name reflects its purpose; it’s clear and descriptive.


29-29: Validate runs-on runner label.

The yscope-gh-runner label is not a standard GitHub Actions runner. If this is a self-hosted runner, prepend self-hosted (e.g., runs-on: [self-hosted, yscope-gh-runner]), or switch to a valid hosted runner.


44-44: Disable credential persistence.

Explicitly disabling credential persistence is a good security practice for downstream steps.


70-73: Good visibility of cache stats.

Adding a ccache -vs step after the build helps in monitoring cache effectiveness.

Comment on lines +14 to +23
name: Run Checks

on:
pull_request:
types:
- opened
- reopened
- edited
- synchronize

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Consider adding manual and push triggers
Currently, this workflow only runs on pull request events. It may be useful to allow manual (workflow_dispatch) or push triggers to test formatting and linting on branches before opening a PR.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml around lines 14 to 23, the workflow
triggers only on pull request events. To enable manual runs and trigger on push
events, add `workflow_dispatch` and `push` under the `on` section. This allows
running the workflow manually and on branch pushes for earlier feedback on
formatting and linting.

Comment on lines +27 to +30
concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.head_ref || github.sha }}
cancel-in-progress: ${{github.ref != 'refs/heads/presto-0.293-clp-connector'}}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Simplify cancel-in-progress logic
The special-case branch exclusion (presto-0.293-clp-connector) is unusual and will need updates for every new branch. To ensure in-flight runs are always cancelled on new pushes, you can set cancel-in-progress: true.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml around lines 27 to 30, the
cancel-in-progress field uses a special-case condition to exclude a specific
branch, which complicates maintenance. Replace the conditional expression with a
simple boolean true to always cancel in-progress runs on new pushes, removing
the branch-specific exception.

Comment on lines +35 to +36
- run: python -m pip install pre-commit

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Pin the pre-commit version for reproducibility
Installing the latest pre-commit by default can introduce breaking changes unexpectedly. Lock to a tested version (e.g. 2.20.0) or a version range.

Proposed diff:

-      - run: python -m pip install pre-commit
+      - run: python -m pip install "pre-commit>=2.20,<3.0"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- run: python -m pip install pre-commit
- run: python -m pip install "pre-commit>=2.20,<3.0"
🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml at lines 35 to 36, the pre-commit
installation command installs the latest version without version pinning, which
can cause unexpected breaking changes. Modify the pip install command to specify
a fixed version of pre-commit, such as 2.20.0, by changing it to "python -m pip
install pre-commit==2.20.0" to ensure reproducibility and stability.

Comment on lines +42 to +49
- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
pre-commit-

- name: Run pre-commit

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Use semver tags for actions/cache
Referencing a commit SHA pins you forever and can be confusing when upgrading. Switch to the latest stable version tag (e.g. actions/cache@v3).

Example:

-      - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      - uses: actions/cache@v4.2.3
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
pre-commit-
- name: Run pre-commit
- uses: actions/cache@v4.2.3
with:
path: ~/.cache/pre-commit
key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}
restore-keys: |
pre-commit-
- name: Run pre-commit
🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml around lines 42 to 49, the
actions/cache step uses a commit SHA to reference the action, which makes
upgrades confusing and pins the workflow indefinitely. Replace the commit SHA
with a stable semver tag like 'actions/cache@v3' to ensure clarity and easier
maintenance.

Comment thread .github/workflows/linux-build-base.yml Outdated
Comment on lines +56 to +59
- name: Clear CCache Statistics
run: |
ccache -sz

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Ensure cache directory exists.

The ccache -sz command will fail if CCACHE_DIR doesn’t exist. Add a step or inline mkdir -p "$CCACHE_DIR" before clearing stats.

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml around lines 56 to 59, the ccache
clear stats command fails if the CCACHE_DIR does not exist. Add a command to
create the cache directory before running ccache -sz by inserting mkdir -p
"$CCACHE_DIR" as a step or inline before the ccache command to ensure the
directory exists.

Comment thread .github/workflows/linux-build-base.yml Outdated
CCACHE_DIR: ${{ github.workspace }}/ccache
CCACHE_CONFIGPATH: ${{ github.workspace }}/ccache.conf

#CCACHE_CONFIGPATH: ~/yscache/velox-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}/ccache.conf

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Add space after comment marker.

YAML style requires a space after # for readability:

- #CCACHE_CONFIGPATH: ...
+ # CCACHE_CONFIGPATH: ...
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#CCACHE_CONFIGPATH: ~/yscache/velox-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}/ccache.conf
# CCACHE_CONFIGPATH: ~/yscache/velox-ubuntu-release-${{ inputs.use-clang && 'clang' || 'gcc' }}/ccache.conf
🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 34-34: missing starting space in comment

(comments)

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml at line 34, the comment line starting
with # does not have a space after the # symbol. Add a single space after the #
to comply with YAML style guidelines for better readability.

@anlowee
anlowee requested a review from kirkrodrigues June 19, 2025 00:53
Comment thread .github/workflows/linux-build-base.yml Outdated
Comment on lines +31 to +32
CCACHE_CONFIGPATH: ${{ github.workspace }}/ccache.conf
CCACHE_DIR: ${{ github.workspace }}/ccache

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can configure ccache using environment variables, to avoid needing to set up the runner with a config file. I'll explain in the other comment why we don't need to set CCACHE_DIR.

Suggested change
CCACHE_CONFIGPATH: ${{ github.workspace }}/ccache.conf
CCACHE_DIR: ${{ github.workspace }}/ccache
CCACHE_COMPRESSLEVEL: 2
CCACHE_MAX_SIZE: 5G

Comment thread .github/workflows/linux-build-base.yml Outdated
Comment on lines +44 to +48
- name: Get Release Build Ccache Stash
run: |
rm -rf "$CCACHE_DIR"
cp -r ~/yscache/velox-ubuntu-release-"${{ inputs.use-clang && 'clang' || 'gcc' }}"/ccache "$CCACHE_DIR"
cp ~/yscache/velox-ubuntu-release-"${{ inputs.use-clang && 'clang' || 'gcc' }}"/ccache.conf "$CCACHE_CONFIGPATH"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of moving these directories around, we can just let ccache fully manage the cache:

  • ccache already handles keeping track of which compiler a file was built with, so we don't need to do that ourselves.
  • I guess the reason you want to only "commit" the cache is if the build is successful. However, let's say a source file gets cached even though the build fails; that cache entry will either get reused in the future or eventually get evicted because it's not used frequently, right?

@anlowee anlowee Jun 19, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the first one I initially direclty set the CCACHE_DIR to the ~/yscache/velox-ubuntu-release-"${{ inputs.use-clang && 'clang' || 'gcc' }}"/ccache, however, even I put the same cache contents there, it cannot detect any existing cache. But if I put the cache at ${{ github.workspace }}/ccache, then it can be detected. I don't know why, but I can try to just use the default ccache dir.

For the second, yea, I agree. Didn't realize this before because my thought was limited by the current Velox's workflows, which is not designed for a consistent usage but for per PR and saving disk space.

- opened
- reopened
- edited
- synchronize

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- synchronize
- synchronize
push:

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (4)
.github/workflows/linux-build-base.yml (2)

56-56: Quote the complex MAKEFLAGS string
Unquoted values with spaces may be parsed incorrectly. Wrap the string in quotes:

-          MAKEFLAGS: MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3
+          MAKEFLAGS: "MAX_HIGH_MEM_JOBS=4 MAX_LINK_JOBS=3"

48-51: Ensure ccache directory exists before clearing stats
The ccache -sz command will fail if the default cache directory doesn’t exist. Add a step or inline command to create it, for example:

+      - run: mkdir -p "$HOME/.ccache"
        - name: Clear CCache Statistics
          run: |
            ccache -sz
.github/workflows/preliminary_checks.yml (2)

36-36: Pin pre-commit version for reproducibility
Installing the latest pre-commit can introduce breaking changes. Lock to a tested range, for example:

-      - run: python -m pip install pre-commit
+      - run: python -m pip install "pre-commit>=2.20,<3.0"

43-43: Use semver tag for actions/cache
Referencing a commit SHA pins the action indefinitely. Switch to a stable tag, for example:

-      - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      - uses: actions/cache@v4
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 49ee963 and d99245f.

📒 Files selected for processing (2)
  • .github/workflows/linux-build-base.yml (1 hunks)
  • .github/workflows/preliminary_checks.yml (1 hunks)
🧰 Additional context used
🪛 actionlint (1.7.7)
.github/workflows/linux-build-base.yml

29-29: label "yscope-gh-runner" is unknown. available labels are "windows-latest", "windows-latest-8-cores", "windows-2025", "windows-2022", "windows-2019", "ubuntu-latest", "ubuntu-latest-4-cores", "ubuntu-latest-8-cores", "ubuntu-latest-16-cores", "ubuntu-24.04", "ubuntu-24.04-arm", "ubuntu-22.04", "ubuntu-22.04-arm", "ubuntu-20.04", "macos-latest", "macos-latest-xl", "macos-latest-xlarge", "macos-latest-large", "macos-15-xlarge", "macos-15-large", "macos-15", "macos-14-xl", "macos-14-xlarge", "macos-14-large", "macos-14", "macos-13-xl", "macos-13-xlarge", "macos-13-large", "macos-13", "self-hosted", "x64", "arm", "arm64", "linux", "macos", "windows". if it is a custom label for self-hosted runner, set list of labels in actionlint.yaml config file

(runner-label)

🪛 GitHub Actions: Run Checks
.github/workflows/preliminary_checks.yml

[error] 23-23: yamllint: empty value in block mapping (empty-values)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency
🔇 Additional comments (5)
.github/workflows/linux-build-base.yml (4)

21-21: Looks good: input description
The use-clang description is clear and correctly documented.


31-33: Environment variables configuration
The new CCACHE_COMPRESSLEVEL, CCACHE_MAX_SIZE, and USE_CLANG entries simplify ccache and clang usage under CI. Ensure these values match your intended cache strategy and build requirements.


42-42: Explicitly disable credential persistence
Setting persist-credentials: false for the checkout step is a good security practice to avoid leaking tokens to subsequent steps.


61-64: Display ccache stats after build
The addition of the ccache -vs step improves visibility into cache usage and hit rates.

.github/workflows/preliminary_checks.yml (1)

14-14: Validate workflow naming
The Run Checks name accurately reflects the job’s purpose.

jobs:
ubuntu-release:
name: "Ubuntu release with resolve_dependency"
name: Ubuntu release with resolve_dependency

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Consider hyphenating job name for consistency
The name uses an underscore in resolve_dependency. To align with the hyphenated naming in other parts (e.g., ubuntu-release), consider renaming to resolve-dependency.

🤖 Prompt for AI Agents
In .github/workflows/linux-build-base.yml at line 28, the job name uses an
underscore in "resolve_dependency" which is inconsistent with other hyphenated
names like "ubuntu-release". Rename "resolve_dependency" to "resolve-dependency"
to maintain consistent hyphenated naming conventions.

Comment thread .github/workflows/preliminary_checks.yml Outdated

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.head_ref || github.sha }}
cancel-in-progress: ${{github.ref != 'refs/heads/presto-0.293-clp-connector'}}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Simplify cancel-in-progress logic
The conditional exception for presto-0.293-clp-connector complicates maintenance. Use cancel-in-progress: true to always cancel in-flight runs on new pushes.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml at line 30, simplify the
cancel-in-progress setting by replacing the conditional expression with a direct
boolean true value. Change the line to "cancel-in-progress: true" to always
cancel in-progress workflow runs on new pushes, removing the special case for
the 'presto-0.293-clp-connector' branch.

Comment on lines +17 to +23
pull_request:
types:
- opened
- reopened
- edited
- synchronize
push:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Enable manual and branch push triggers
Consider adding workflow_dispatch under on, and explicitly list branch patterns under push, to allow manual runs and early feedback on non-PR branches.

🧰 Tools
🪛 GitHub Actions: Run Checks

[error] 23-23: yamllint: empty value in block mapping (empty-values)

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml around lines 17 to 23, the workflow
triggers lack manual trigger support and explicit branch push triggers. Add
`workflow_dispatch` under the `on` section to enable manual runs, and specify
branch patterns explicitly under `push` to allow early feedback on non-PR
branches. This will improve flexibility and coverage of the workflow execution.

Comment on lines +40 to +41
fetch-depth: 2
persist-credentials: false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Fetch full history for accurate diffs
With fetch-depth: 2, earlier commits might be omitted, causing incomplete diffs for pre-commit. Use fetch-depth: 0 to fetch the full history.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml at lines 40 to 41, the fetch-depth
is set to 2, which limits the git history and can cause incomplete diffs for
pre-commit checks. Change the fetch-depth value from 2 to 0 to fetch the full
git history and ensure accurate diffs.

@anlowee
anlowee requested a review from kirkrodrigues June 19, 2025 13:55

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (5)
.github/workflows/preliminary_checks.yml (5)

17-23: Consider adding manual and branch‐push triggers
To enable early feedback and ad-hoc runs, you can include workflow_dispatch under on and list branch patterns explicitly under push.


28-31: Simplify the cancel-in-progress logic
Replace the conditional exception with a boolean true so all in-flight runs are cancelled on new pushes, removing the special‐case branch.


36-36: Pin the pre-commit version for reproducibility
Installing the latest pre-commit can introduce unexpected breaking changes. Lock to a tested version, e.g.:

-run: python -m pip install pre-commit
+run: python -m pip install "pre-commit>=2.20,<3.0"

38-41: Fetch full Git history for accurate diffs
With fetch-depth: 2, only the last two commits are retrieved, which may miss changes outside the most recent commit. Consider:

-    fetch-depth: 2
+    fetch-depth: 0

43-49: Use semver tag for actions/cache
Referencing a commit SHA makes upgrades confusing. Switch to a stable semver tag, e.g.:

-      - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
+      - uses: actions/cache@v4.2.3
📜 Review details

Configuration used: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d99245f and 8d95db1.

📒 Files selected for processing (1)
  • .github/workflows/preliminary_checks.yml (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Build with GCC / Ubuntu release with resolve_dependency


- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
with:
path: ~/.cache/pre-commit

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Ensure proper path expansion in cache step
Tildes may not expand in non-interactive shells. Replace ~/.cache/pre-commit with:

path: $HOME/.cache/pre-commit
🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml at line 45, replace the path value
from '~/.cache/pre-commit' to '$HOME/.cache/pre-commit' to ensure proper
environment variable expansion in the cache step, as tildes may not expand
correctly in non-interactive shells.

Comment on lines +1 to +13
# Copyright (c) Facebook, Inc. and its affiliates.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Update license header to match repository ownership.

The current header still references Facebook, Inc.; please update it to reflect the correct project or organisation name and ensure consistency with other files in this repository.

🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml lines 1 to 13, the license header
references Facebook, Inc., which is outdated. Update the license header to
reflect the current project or organization name consistent with other files in
the repository by replacing "Facebook, Inc. and its affiliates" with the correct
entity name.

Comment on lines +54 to +58
files=$(git diff --name-only HEAD^1 HEAD)
echo "::group::Changed files"
echo $files | tr ' ' '\n'
echo "::endgroup::"
pre-commit run --show-diff-on-failure --color=always --files $files

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Revise diff logic to capture the full PR
The current command only lists files changed in the latest commit. It’s better to diff against the PR base so all changes are linted. For example:

- files=$(git diff --name-only HEAD^1 HEAD)
+ files=$(git diff --name-only "$(git merge-base HEAD origin/${{ github.event.pull_request.base.ref }})" HEAD)

This ensures pre-commit runs on every file modified in the pull request.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
files=$(git diff --name-only HEAD^1 HEAD)
echo "::group::Changed files"
echo $files | tr ' ' '\n'
echo "::endgroup::"
pre-commit run --show-diff-on-failure --color=always --files $files
files=$(git diff --name-only "$(git merge-base HEAD origin/${{ github.event.pull_request.base.ref }})" HEAD)
echo "::group::Changed files"
echo $files | tr ' ' '\n'
echo "::endgroup::"
pre-commit run --show-diff-on-failure --color=always --files $files
🤖 Prompt for AI Agents
In .github/workflows/preliminary_checks.yml around lines 54 to 58, the git diff
command only captures files changed in the latest commit, missing other changes
in the PR. Update the diff command to compare against the PR base branch (e.g.,
origin/main or the merge base) instead of HEAD^1, so it lists all files changed
in the entire pull request. This ensures pre-commit runs on every modified file
in the PR.

@kirkrodrigues kirkrodrigues left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For the PR title, how about:

ci: Cherry-pick prestodb/presto#13361 to use `pre-commit` for quality checks; Fix compilation caching by using cache on runner.

@kirkrodrigues kirkrodrigues changed the title ci: Upgrade to pre-commit for quality checks and fix ccache. ci: Cherry-pick prestodb/presto#13361 to use pre-commit for quality checks; Fix compilation caching by using cache on runner. Jun 19, 2025
@kirkrodrigues
kirkrodrigues merged commit 0251e98 into y-scope:presto-0.293-clp-connector Jun 19, 2025
7 checks passed
wraymo pushed a commit that referenced this pull request Jun 26, 2025
…ger-overflow (facebookincubator#13831)

Summary:
Pull Request resolved: facebookincubator#13831

This avoids the following errors:

```
fbcode/third-party-buck/platform010/build/libgcc/include/c++/trunk/bits/std_abs.h:56:41: runtime error: negation of -9223372036854775808 cannot be represented in type 'long'; cast to an unsigned type to negate this value to itself
    #0 0x000000346ce5 in std::abs(long) fbcode/third-party-buck/platform010/build/libgcc/include/c++/trunk/bits/std_abs.h:56
    #1 0x000000345879 in std::shared_ptr<facebook::velox::BiasVector<facebook::velox::test::EvalTypeHelper<long>::Type>> facebook::velox::test::VectorMaker::biasVector<long>(std::vector<std::optional<long>, std::allocator<std::optional<long>>> const&) fbcode/velox/vector/tests/utils/VectorMaker-inl.h:58
    #2 0x000000344d34 in facebook::velox::test::BiasVectorErrorTest::errorTest(std::vector<std::optional<long>, std::allocator<std::optional<long>>>) fbcode/velox/vector/tests/BiasVectorTest.cpp:39
    #3 0x00000033ec99 in facebook::velox::test::BiasVectorErrorTest_checkRangeTooLargeError_Test::TestBody() fbcode/velox/vector/tests/BiasVectorTest.cpp:44
    #4 0x7fe0a2342c46 in void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) fbsource/src/gtest.cc:2727
    #5 0x7fe0a234275d in testing::Test::Run() fbsource/src/gtest.cc:2744
    #6 0x7fe0a2345fb3 in testing::TestInfo::Run() fbsource/src/gtest.cc:2890
    #7 0x7fe0a234c8eb in testing::TestSuite::Run() fbsource/src/gtest.cc:3068
    #8 0x7fe0a237b52b in testing::internal::UnitTestImpl::RunAllTests() fbsource/src/gtest.cc:6059
    #9 0x7fe0a237a0a2 in bool testing::internal::HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool>(testing::internal::UnitTestImpl*, bool (testing::internal::UnitTestImpl::*)(), char const*) fbsource/src/gtest.cc:2727
    #10 0x7fe0a23797f5 in testing::UnitTest::Run() fbsource/src/gtest.cc:5599
    #11 0x7fe0a2239800 in RUN_ALL_TESTS() fbsource/gtest/gtest.h:2334
    #12 0x7fe0a223952c in main fbcode/common/gtest/LightMain.cpp:20
    #13 0x7fe09ec2c656 in __libc_start_call_main /home/engshare/third-party2/glibc/2.34/src/glibc-2.34/csu/../sysdeps/nptl/libc_start_call_main.h:58:16
    #14 0x7fe09ec2c717 in __libc_start_main@GLIBC_2.2.5 /home/engshare/third-party2/glibc/2.34/src/glibc-2.34/csu/../csu/libc-start.c:409:3
    #15 0x00000033d8b0 in _start /home/engshare/third-party2/glibc/2.34/src/glibc-2.34/csu/../sysdeps/x86_64/start.S:116

UndefinedBehaviorSanitizer: signed-integer-overflow fbcode/third-party-buck/platform010/build/libgcc/include/c++/trunk/bits/std_abs.h:56:41
```
Avoid overflow by using the expression (static_cast<uint64_t>(1) + ~static_cast<uint64_t>(min)) to calculate the absolute value of min without using std::abs

Reviewed By: dmm-fb, peterenescu

Differential Revision: D76901449

fbshipit-source-id: 7eb3bd0f83e42f44cdf34ea1759f3aa9e1042dae
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants