mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-11-07 01:53:24 +09:00
99 lines
6.4 KiB
Markdown
99 lines
6.4 KiB
Markdown
# Contributing to MobileGL
|
|
|
|
These rules keep the code and its history readable. `scripts/check_text_hygiene.py` checks the ones listed under [Checks](#checks); the rest rely on review.
|
|
|
|
Commands below use `python3`. On Windows, run `python` instead.
|
|
|
|
## Commit messages
|
|
|
|
```
|
|
[Type] (Scope): content
|
|
|
|
- Detail 1
|
|
- Detail 2
|
|
```
|
|
|
|
- **Subject only by default.** Add `- ` detail lines only when a detail really needs to be in the commit message. Leave one blank line after the subject. A detail that wraps continues on at most two lines indented by two spaces. No paragraphs and no trailers.
|
|
- **Content** after `): ` is at most 72 characters of plain English in the imperative mood ("flush once per frame", not "flushes" or "flushed").
|
|
- **Type** is one or more of these, comma-separated (`[Fix, Test]`):
|
|
- `Feat`: new behaviour.
|
|
- `Fix`: corrects behaviour.
|
|
- `Perf`: faster or lighter, same behaviour.
|
|
- `Refactor`: restructures code, same behaviour.
|
|
- `Test`: tests only.
|
|
- `Docs`: documentation and comments only.
|
|
- `Build`: CMake, Gradle, toolchains.
|
|
- `CI`: workflows and CI scripts.
|
|
- `Chore`: housekeeping such as headers, file moves and dead files.
|
|
- `Tools`: developer tools under `tools/` and `scripts/`.
|
|
- **Scope** is each changed path without a leading `MobileGL/`, cut to its first two parts: `MG_Backend/DirectGLES`, `MG_Test/Wire`, `scripts/ci`, `docs/Disaggregated`.
|
|
- A shorter path is used whole: `MG_Backend` for a file directly in a subsystem, `scripts` for a file directly in `scripts/`, and the file name for a file at the repository root (`CMakeLists.txt`).
|
|
- A file directly in `MobileGL/` uses `MobileGL`, and a submodule uses its path (`3rdparty/glslang`).
|
|
- List every scope the commit touches, comma-separated: `(MG_Backend/DirectGLES, MG_Test/Wire)`.
|
|
- `python3 scripts/check_text_hygiene.py scope` prints the scope for the staged changes.
|
|
- **No** planning ids (phase or decision codes such as `P13` or `ID-54`), local paths, external project names or non-English text anywhere in the message.
|
|
- **Merges** use `[Merge] (area): what the merge takes`. The scope is free text there. Write the subject yourself, since git's default merge message fails the check. The commits a merge brings in are not checked again.
|
|
- **Reverts** use `[Fix] (Scope): revert <the reverted subject>`.
|
|
|
|
Example:
|
|
|
|
```
|
|
[Perf] (MG_Backend/DirectGLES): flush once per frame before the window pass
|
|
```
|
|
|
|
## Comments, strings and documentation
|
|
|
|
- Code, comments, log strings and commit messages are in English. Documentation may be in Chinese or English.
|
|
- A comment states what the code does now and why, in a few lines. Rationale longer than about 15 lines belongs in a design document under `docs/`, with a one-line pointer in the code.
|
|
- In code and comments, cite a symbol, file or section, never a line number: `ARCHITECTURE.md §1.3`, `VulkanRenderer::BeginFrame()`. Documents may keep `file:line` citations; the documentation citation check resolves them.
|
|
- State the rule, not its history. No "previously" or "after review", and no planning ids in comments, strings, identifiers or file names.
|
|
- Plain wording, without ALL-CAPS emphasis.
|
|
- In code and comments (C, C++, GLSL, CMake, shell, Python, YAML), do not name external projects such as Mesa, Zink or gallium; describe the technique instead. Naming the driver or hardware where a behaviour was observed (llvmpipe, ANGLE, Adreno, Mali) is fine, and so are file, package and extension names that contain these words (`50_mesa.json`, `GL_MESA_*`).
|
|
|
|
## Code
|
|
|
|
- Format the lines you change with `.clang-format`, using clang-format 23. Install it with `pip install 'clang-format==23.1.3'`; `git clang-format <base>` from the same package formats only the lines changed since `<base>`. `scripts/format_code.sh` reformats whole files, so do not use it on files you only touched.
|
|
- `.inc` files are fragments included in the middle of a `.cpp` file, inside a namespace, or are generated tables. clang-format cannot format them on their own, so the check skips them. Match the indentation of the file that includes them.
|
|
- Text files are UTF-8.
|
|
- These source files under `MobileGL/`, `scripts/` and `tools/` start with the license header:
|
|
- C, C++, `.inc`, GLSL, Java and JavaScript modules, with `//` comments;
|
|
- Python, shell, CMake modules and `CMakeLists.txt`, with `#` comments.
|
|
- Generated files and files under another license are exempt. `python3 scripts/update-source-file-header.py` adds the header.
|
|
- Keep files to about 3,000 lines and functions to about 300 lines.
|
|
- Platform-specific APIs stay behind an abstraction, never raw in logic code.
|
|
- A fix that restores intended behaviour ships unconditionally. Add a switch only for a real trade-off.
|
|
- A cache keyed on object identity uses a monotonic lifetime id, never a GL name or a pointer, because both are recycled.
|
|
|
|
## What goes in the repository
|
|
|
|
- Source, tests, build files and maintained documentation.
|
|
- Generated code, only together with a CI step that regenerates it and fails on any difference.
|
|
- Binary test fixtures.
|
|
- Not raw logs, and not working papers such as agent briefs, review rounds and drafts. Keep those outside the repository and commit the conclusion: a design-document change, a `DEBTS.md` entry, a measurement under `docs/Performance`.
|
|
|
|
## Checks
|
|
|
|
`python3 scripts/check_text_hygiene.py ci` runs what CI runs. It checks the commits on the branch's own line of history since the check was added. The base branch it compares with is `feat/disaggregated`, which you can change with `TEXT_HYGIENE_BASE_BRANCH`.
|
|
|
|
These fail on any violation:
|
|
|
|
- commit messages, as described above;
|
|
- a new file under `docs/Disaggregated/notes/` or a new `.log` file;
|
|
- a missing or wrong license header;
|
|
- a text file that is not UTF-8;
|
|
- an external project name in a comment;
|
|
- a `file:line` citation in code that points past the end of the file;
|
|
- changed lines that clang-format would change.
|
|
|
|
These are ratchets: each total may only go down.
|
|
|
|
- planning ids in comments;
|
|
- comment lines beyond 15 in a block;
|
|
- ALL-CAPS comment lines;
|
|
- non-English comment lines;
|
|
- line-number citations in code.
|
|
|
|
`python3 scripts/check_text_hygiene.py tree --update-baseline` lowers `scripts/data/text_hygiene_baseline.json` after a cleanup. It never raises it, and CI rejects a raised baseline.
|
|
|
|
Not checked by CI: the size limits, the platform, switch and lifetime-id rules, planning ids outside comments, English outside comments, and the regeneration step for generated code.
|