This document contains information potentially relevant for GAP developers.
Please also check out the file CONTRIBUTING.md
for getting started working
on GAP. In contrast, this file here contains more specialized information that
you can use like a reference manual.
At any time, there are two primary branches in the GAP git repository:
master
: all new changes go into this; pull requests usually target itstable-4.X
(whereX
is some number): stable releases of the4.X.*
series are made from this branch
We are using GitHub's "branch protection" feature to restrict direct pushes to these branches. All changes should go through pull requests, to ensure that tests are run automatically and are passing (hard experience taught us that even "trivial" and "obviously correct" changes can break things).
Note that we only make releases from the most recent release branch; older release branches are kept around but we do not expect to e.g. make a new GAP 4.12.x release after 4.13.0 has been released, and so on.
By default all changes go into the master
branch. Once a release 4.X.Y
is out, to get changes into the 4.X.(Y+1) release, the usual process is
to first land them into the master
branch, and have them "backported"
later on the stable-4.X
branch.
The process for backporting is as follows:
- someone adds the
backport-to-4.X
label to the pull request (if you don't have permission, just ask for someone, e.g. @fingolfin, to add the label) - some time after the PR has been merged into
master
, and before the next stable release, someone will go through the list of merged PRs with this label, and backport them (usually by opening a dedicated backporting PR, which may contain the content of multiple PRs being backported). - After a PR has been backported this way, the
backport-to-4.X
label is replaced by abackport-to-4.X-DONE
label, to avoid processing it again (this is also important for our scripts which generate the changelog updates for releases).
Sometimes changes really are only for stable-4.X
and not for master
,
usually because the two branches diverged sufficiently (e.g. code may have
been rewritten in a major way on master
which does not lend itself to
backporting, but we still want to fix a bug in the old implementation for
the release branch). In that case, you can create a pull request which
directly targets the stable-4.X
branch (the target
branch can be selected on GitHub during the creation of pull requests). When making such a pull request, it's
a good idea to point it out (and the reason) in the PR description.
Some simple rules for formatting code
- no tabs
- no trailing whitespace
- all source files should end with a newline
This is automatically done if your editor honours our .editorconfig
file. See https://editorconfig.org for a list of editors supporting
this and how to configure them.
For historical reasons we have no particular rule for formatting code beyond the above. To avoid a chaotic mess, please adapt your contributions to the surrounding code. So if you insert something into a function that uses 2-space indentation, also use that.
Please refrain from reformatting code as you edit it, as this makes it much harder to review your changes. If you really must reformat something, do so in a separate commit which only contains formatting changes.
For completely new kernel code in C/C++, you can use clang-format
to
format it. If you edit existing code, you can try git clang-format
(which reformats only code that is already modified). But here, too,
please avoid large-scale reformatting, and keep reformatting in separate
commits. The following command can sometimes help format just the code
you modified anyway:
git clang-format $(git merge-base master)
For every commit to our primary branches, and also for all pull requests, we use GitHub Actions to run the GAP test suite, in order to detect regressions early.
Which tests are run is controlled by the files .github/workflows/CI.yml
and
.github/workflows/release.yml
. The syntax for these files and more is explained
in the GitHub Actions documentation.
See also dev/ci.sh
and other dev/ci-*.sh
files for the scripts that are
being run as part of these CI tests.
GAP uses Slack, a multi user chat system, for discussions. Everyone can join via a web browser or a dedicated client (e.g for Android or iOS). Just follow the link https://gap-system.org/slack.
There is also an open developer list with currently very low volume. You can subscribe to it at https://lists.uni-kl.de/gap/info/gap.
Contributions to GAP should be done in the form of GitHub pull requests. Then our test suite (see "Testing" below) is automatically run as part of the "Continuous integration (CI)" tests (again see elsewhere in this file for details).
By default, your pull requests should target the master
branch (see the
section "Branches" for details).
We use labels on branches to help us generated release notes for new GAP versions. If you are a new contributor, don't worry about that, we'll take care of it (in fact you won't even have the access rights to set them -- again, don't worry about that).
If you do have the permissions to set labels, here are some guidelines:
- Always add one of the "release notes" labels.
- If the change is meant to be backported to the stable branch, add a "backports" label (see elsewhere in this document for details).
- Consider adding one of the "kind" label to indicate whether the change is a bug fix, enhancement or whatever else.
- Other labels are mostly optional and can help categorize things for the release notes. You are invited to set them but it's not a must.
Some other notes for pull requests
- please read the section on "Code formatting"
- try to focus your pull request, i.e. ideally don't change multiple unrelated things in one PR (this makes reviewing your changes easier).
For details on how GAP releases are made, see dev/releases/README.md
.
GAP includes a test suite inside the tst
directory, which is split into
multiple parts.
testinstall
: quick test suite that one can test frequently. Run via./gap tst/testinstall.g
teststandard
: slower but more comprehensive test suite. Run via./gap tst/teststandard.g
testextra
: very slow test suite that tests even more Run via./gap tst/testextra.g
testbugfix
: additional small test files that are created to verify specific bugfixes work as intended Run via./gap tst/testbugfix.g
The script dev/bisect.sh
can be very helpful in tracking down which commit
introduced a regression. Please read the extensive comments in the file to
learn what it does and how to use it.
GAP contains copies of some third party software, mostly to make it easier to build GAP "out of the box", with its minimal dependencies included. GAP maintainers may wish to update these dependencies from time to time.
extern/gmp
: copy of GMP, the GNU Multiple Precision Arithmetic Libraryextern/zlib
: copy of zlib, a compression library used to implement transparent reading and writing of .gz compressed files.hpcgap/extern/gc
: copy of the Boehm garbage collector used by HPC-GAPhpcgap/extern/libatomic_ops
: copy oflibatomic_ops
, a subproject of Boehm GC; should thus be kept in sync with that.cnf/config.guess
andcnf/config.sub
: used by ourconfigure
script. Ideallyautoconf
orautoreconf
should automatically install the latest versions of these, but this doesn't happen (presumably due to a bug inautoconf
). They can be updated by running theupdate-config.sh
script inside thecnf
directory.