| <!-- |
| ~ Licensed to the Apache Software Foundation (ASF) under one |
| ~ or more contributor license agreements. See the NOTICE file |
| ~ distributed with this work for additional information |
| ~ regarding copyright ownership. The ASF licenses this file |
| ~ to you 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. |
| --> |
| |
| # Contributing |
| |
| We welcome contributions to Apache Iceberg C++. For general Iceberg contribution guidelines, see the [official guide](https://iceberg.apache.org/contribute/). Contributors using AI-assisted tools must follow the [AI-assisted contribution guidelines](https://iceberg.apache.org/contribute/#guidelines-for-ai-assisted-contributions). |
| |
| For build and installation instructions, see [Getting Started](getting-started.md). |
| |
| ## Coding Standard |
| |
| The project follows the same coding standard as [Apache Arrow](https://arrow.apache.org/docs/developers/cpp/development.html#code-style-linting-and-ci) (a variant of the Google’s C++ Style Guide) |
| |
| ### Naming Conventions |
| |
| | Element | Style | Examples | |
| |---------|-------|----------| |
| | Classes / Structs | `PascalCase` | `TableScanBuilder`, `PartitionSpec` | |
| | Factory methods | `PascalCase` | `CreateNamespace()`, `ExtractYear()` | |
| | Accessors / Getters | `snake_case` | `name()`, `type_id()`, `partition_spec()` | |
| | Variables | `snake_case` | `file_io`, `schema_id` | |
| | Constants | `k` + `PascalCase` | `kHeaderContentType`, `kMaxPrecision` | |
| |
| ### General Practices |
| |
| - Prefer smart pointers (`std::unique_ptr`, `std::shared_ptr`) for memory management |
| - Use `Result<T>` for error propagation |
| - Write Doxygen-style comments (`/// \brief ...`) for all public APIs |
| - Do not remove public methods without a deprecation cycle: |
| |
| ```cpp |
| [[deprecated("Use new_method() instead. Will be removed in a future release.")]] |
| void old_method(); |
| ``` |
| |
| ## Development Environment |
| |
| ### Code Formatting |
| |
| Formatting is enforced via `.clang-format` (Google base, `ColumnLimit: 90`). Set up `pre-commit` to run it automatically: |
| |
| ```bash |
| pip install pre-commit |
| pre-commit install |
| ``` |
| |
| To run all hooks manually on the entire codebase: |
| |
| ```bash |
| pre-commit run -a |
| ``` |
| |
| ### Dev Containers |
| |
| We provide Dev Container templates for VS Code: |
| |
| ```bash |
| cd .devcontainer |
| cp Dockerfile.template Dockerfile |
| cp devcontainer.json.template devcontainer.json |
| ``` |
| |
| Then select `Dev Containers: Reopen in Container` from the Command Palette. |
| |
| ## Submitting Changes |
| |
| ### Workflow |
| |
| 1. Fork the repository on GitHub |
| 2. Create a feature branch from `main`: |
| ```bash |
| git checkout -b feature/your-feature-name |
| ``` |
| 3. Make your changes following the coding standards |
| 4. Add or update tests for any behavioral changes |
| 5. Ensure all tests pass and `pre-commit run -a` is clean |
| 6. Push to your fork and open a Pull Request |
| |
| ### Commit Messages |
| |
| Follow [Conventional Commits](https://www.conventionalcommits.org/): |
| |
| ``` |
| feat: add support for S3 file system |
| fix: resolve memory leak in table reader |
| docs: update API documentation |
| test: add unit tests for schema validation |
| refactor(rest): simplify auth token handling |
| ``` |
| |
| ### Pull Request Checklist |
| |
| - Clear problem/solution description |
| - Linked issue(s) when applicable |
| - Tests for behavioral changes |
| - Passing CI checks (tests, pre-commit, license header, sanitizers) |
| |
| ## Getting Help |
| |
| - **GitHub Issues** — [Report bugs or request features](https://github.com/apache/iceberg-cpp/issues/new) |
| - **Good First Issues** — [Browse here](https://github.com/apache/iceberg-cpp/labels/good%20first%20issue) |
| - **Mailing List** — [dev@iceberg.apache.org](mailto:dev@iceberg.apache.org) ([subscribe](mailto:dev-subscribe@iceberg.apache.org?subject=(send%20this%20email%20to%20subscribe)) / [unsubscribe](mailto:dev-unsubscribe@iceberg.apache.org?subject=(send%20this%20email%20to%20unsubscribe)) / [archives](https://lists.apache.org/list.html?dev@iceberg.apache.org)) |
| - **Slack** — [#cpp channel](https://join.slack.com/t/apache-iceberg/shared_invite/zt-1zbov3k6e-KtJfoaxp97YfX6dPz1Bk7A) |
| |
| The Apache Iceberg community follows the [Apache Way](https://www.apache.org/theapacheway/index.html) and the Apache Foundation [Code of Conduct](https://www.apache.org/foundation/policies/conduct.html). |