Thanks for considering contributing to the Learn-OCaml project!
The guidelines below summarize the main conventions involved in the development of Learn-OCaml.
Bug reports and feature requests are very welcome. They are tracked as GitHub issues, using various labels.
First, search if a related issue already exists in the
ocaml-sf/learn-ocaml
bug tracker.
Otherwise, you can open a new issue using one of the issue forms.
In the sequel, we assume you are familiar with Git.
We use pull requests to review bug fixes and new features.
If the underlying bug or feature request has not been reported beforehand, it can be a good idea to open an issue first (unless it is a minor one).
Then, you can state in this issue that you are working on a fix and/or discuss the design of the implementation with Learn-OCaml maintainers.
Next, you may want to read the documentation regarding How to set up your development environment.
Pull Requests should be created from a feature branch (≠ master
),
typically from a fork of
ocaml-sf/learn-ocaml
, and
target the master
branch.
If you need to fix merge conflicts, we generally prefer that you
rebase your branch on
master
,
rather than creating a merge commit.
Borrowing some suggestions of the Git Style Guide, ideally:
Each commit should be a single logical change. Don't make several logical changes in one commit. For example, if a patch fixes a bug and optimizes the performance of a feature, split it into two separate commits.
Don't split a single logical change into several commits. For example, the implementation of a feature and the corresponding tests should be in the same commit.
In particular, please avoid to reformat lines you need not touch for a given logical change, in order to make code review easier.
Thus, the Learn-OCaml maintainers may suggest you adapt the commits of your PR
(using git rebase -i
and git push -f
)
to better comply with these suggestions as well as with the Conventional Commits guidelines below.
However, these conventions can be somewhat lifted if the Pull Request is intended to be "squashed" in a single commit, as the maintainer could refine the squashed-commit message in this case (cf. the Learn-OCaml maintainers wiki).
The commits messages should follow the Conventional Commits specification.
This is necessary as Learn-OCaml relies on the
release-please
tool to
automatically generate the CHANGELOG.md
and the
Release Notes,
assuming Semantic Versioning.
To sum up, each commit message contains a header, a body, and a footer, with the following structure:
type[optional scope]: description blank_line [optional body] blank_line [optional footers]
where:
type
is one of the conventional commits types (feat
,fix
, …); an exclamation mark after the type denotes a non-backward-compatible change (e.g.,refactor!: Use ocamlformat
)scope
is a keyword between parentheses providing more context on the impacted part of the project (e.g.: API, grader, UI, dune, make, opam, docker, GHA, or just a given filename.ml)description
is a mandatory summary (typically starting with a verb in imperative, present tense), with no period in the end; it should be short but informative, just like an e-mail subject line.body
is an optional body, useful to explain why the change is necessary or has been implemented this way.- several kinds of
footers
can be provided:- References that auto-close issues →
Fix #1
orClose #1
(online doc) - References to commits or issues →
Related: #1
or mere URLs (online doc) - A Conventional Commits footer →
BREAKING CHANGE: description
(which plays the same role as thetype!
suffix mentioned above) - A co-authorship footer →
Co-authored-by: First Last <address@example.com>
(online doc) - Or any footer following the usual Git trailers convention.
- References that auto-close issues →
Here are two example commit messages:
7e389ef
(this commit was obtained after squash-merging PR #434)feat(release.yml): Add a (3 jobs)-based GHA using release-please * Use var `OPAM_RELEASE` (GitHub PAC) * Use `expect` to workaround the fact that the feature wish https://github.com/ocaml-opam/opam-publish/issues/132 is not yet available. Co-Authored-By: Yann Régis-Gianas <yann@regis-gianas.org> Co-Authored-By: Erik Martin-Dorel <erik@martin-dorel.org>
35941b5
, reworded (this commit was part of PR #448)fix(grader): Display negative numbers with mandatory parens * Thanks @letouzey for reporting this issue and suggesting a fix * Update some learn-ocaml-client tests accordingly Fix #440
As specified in commit 87bb9b5
, the table below summarizes the commit types (lowercase prefixes before a colon) that are recognized by the release-please
GitHub Action:
commit type | CHANGELOG section title |
Comments |
---|---|---|
feat |
Features | Add a new feature (use feat! if it is non-backward compatible) |
fix |
Bug Fixes | Patch a bug |
revert |
Reverts | Revert commit (include that commit header, SHA1, and motivation) |
perf |
Performance Improvements | Change code to improve performance |
refactor |
Code Refactoring | Change code without adding a feature nor fixing a bug |
deps |
Dependencies | Change external dependencies (e.g., for scopes opam, docker) |
build |
Build System | Change the build system (e.g., for scopes dune, make, docker) |
test |
Tests | Add missing tests or correct existing tests |
ci |
CI/CD | Change the CI/CD configuration |
docs |
Documentation | Change documentation only |
style |
Style | Change code without affecting its meaning (white-space, formatting, semi-colons or so) |
chore |
Miscellaneous Chores | (hidden by default) Change files unrelated to code, tests, docs, build or ci config |
See also:
All contributed code and comments should be written in English.
If you change .mli
interface files, make sure you also update the
(** ocamldoc comments *)
accordingly (see also this page).
If your contribution contains user-facing changes, it can be a good idea to also update the Learn-OCaml documentation stored in the docs/ directory.
If your contribution (whether a fix or an enhancement) impacts the grading feature, make sure you also update the test suite stored in the tests/ directory.
Contributions to this repository are placed under the MIT license.