blob: 5380939cedb59bac65a1b61e05b3c7f722004840 [file] [view]
<!--
~ 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).