.. _flycheck-maintainers-guide:

====================
 Maintainer’s Guide
====================

Issue triage
============

Please label incoming tickets according to these rules:

- Add the “bug” label to things that you think **must be fixed urgently**.
  Please don’t use this label for bugs that do not severely impede Flycheck’s
  functionality.
- Add the “needs review” label to new bugs and pull requests that need to be
  reviewed.
- Add the “beginner friendly” label to really easy things.  If you add this
  label please also add a comment that outlines a possible solution.
- Add “blocked” to bugs that need further comment or help from the reporter, and
  to pull requests that need to be improved.
- Add “needs help” to anything that no contributor will work on, to mark the
  issue as available for external contributors and inform users that we will not
  work on the issue.
- Add “windows only” for bugs that appear to only affect Windows operating
  systems.

**If you’d like to review a bug or pull request please assign the corresponding
ticket to you.**

In issues for specific languages that Flycheck supports please mention the
corresponding :ref:`language team <flycheck-language-teams>` if one exists.

Git workflow
============

Our Git workflow is simple:

* The ``master`` branch is always shippable.
* Every feature and every non-trivial change goes through a pull request.

GitHub calls this the “GitHub Flow” and has a very nice `visual guide`_ for this
model.

.. _visual guide: https://guides.github.com/introduction/flow/

.. _flycheck-branch-rules:

Branch rules
------------

Our workflow implies a couple of rules about which branches to push code to:

* Please commit new features, larger changes and refactorings and updates to
  documentation to separate branches and open a pull request for review and
  discussion.
* The ``master`` branch is protected.  Only :ref:`owners <flycheck-maintainers>`
  can push directly to it.  Everyone else needs to open a pull request.  Github
  requires maintainer approval and passing CI tests before a pull request
  can be merged to master.

.. important::

   When creating a new branch please use a *descriptive name* to communicate the
   purpose of the branch to other developers and maintainers.  ``fix-bug-42`` is
   not a great name, but ``42-fix-void-function-error-in-error-list`` is.

.. _pull request: https://help.github.com/articles/using-pull-requests/

.. _flycheck-pull-requests-reviews:

Pull requests reviews
---------------------

We review all pull requests, and require two different kinds of approval:

* At least one maintainer must approve the idea and direction with a ``LGTM``
  comment.
* At least one contributor (maintainer or otherwise) must approve the
  implementation by leaving an approved `pull request review`_, and no
  contributors must have requested changes.

.. _pull request review: https://help.github.com/articles/about-pull-request-reviews/

As a maintainer
~~~~~~~~~~~~~~~

* Consider whether you personally think that the change is a good addition to
  Flycheck.
* Weigh the expected benefits and impact of the feature against the
  expected complexity.
* Check whether the pull request complies with our :ref:`style guide
  <flycheck-style-guide>`, but don't go too much into technical details.
* Don't review for technical details.  It's the idea and direction that counts.

If you would like to see the pull request in Flycheck leave a ``LGTM`` comment.

As a contributor
~~~~~~~~~~~~~~~~

* Check the technical implementation.
* Consider the impact on syntax checking for a language.
* Check whether the tests pass.
* Check whether the PR complies with our :ref:`style guide
  <flycheck-style-guide>`.
* Challenge the technical implementation of a pull request, and ask questions
  about dubious code.
* Consider whether there might be a simpler approach or a better solution to the
  problem that the PR solves.

If you find any issues please leave a `pull request review`_ that requests
for changes.  Please try to leave an inline comment wherever possible and try to
suggest a better solution, to make it easy for the PR author to discover and fix
the issues.

If you didn't find any issues leave a `pull request review`_ that approves the
changes.

In doubt request changes first and let the PR author explain their intention and
implementation.  You can still approve the review afterwards if you are
satisfied.

Merge guidelines
~~~~~~~~~~~~~~~~

Any contributor may merge approved pull requests.  Our protection rules for the
``master`` branch ensure that only approved pull requests can be merged, but you
still have to check a few things before merging:

* Are commits squashed?  Before merging please take an extra look at the commits
  to make sure that the commits were properly squashed and have good commit
  messages.  If needed, ask the contributor to improve the commit messages and
  squash the commits first, by requesting changes with a pull request review.
* Does the PR pass the integration tests?  Not all checkers have integration
  tests, and not all tests are run on CI, so contributors should make sure to
  run them on their side.
* Should the PR warrant a line in the changelog?  User-facing changes should be
  documented in ``CHANGES.rst``.

For new features:

* Does the PR include tests?  A new syntax checker should have at least one
  accompanying integration test.
* Does the PR include documentation?  New syntax checkers or options should be
  documented in :ref:`flycheck-languages`.

If all the points above have been addressed, then go ahead and click that green
button :)

.. note::

   We require proper merges for pull requests, to preserve the fact that a
   change came from a pull request in the git history and to retain any commit
   signatures that may exist.  As such you can't squash-merge or rebase-merge
   through GitHub's UI.

.. _flycheck-git-signatures:

Signatures for commits and tags
-------------------------------

We sign all release tags as part of our :ref:`flycheck-release-process`.  Thus
you need a GPG key pair for Git.  Github provides a great guide which helps you
to `generate a key`_ and to `tell Git about your key`_.  Please also `add your
key`_ to your Github account.

We also recommend that you sign all your commits with your key.  Again, Github
provides a good guide to `sign commits`_.

.. seealso::

   `Signing Your Work`_
      For more information about signing commits and tags take a look at the
      section in the Git manual.

.. _Signing Your Work: https://git-scm.com/book/uz/v2/Git-Tools-Signing-Your-Work
.. _generate a key: https://help.github.com/articles/generating-a-gpg-key/
.. _tell Git about your key: https://help.github.com/articles/telling-git-about-your-gpg-key/
.. _add your key: https://help.github.com/articles/adding-a-new-gpg-key-to-your-github-account/
.. _sign commits: https://help.github.com/articles/signing-commits-using-gpg/

Tooling and Services
====================

In addition to Github_ where we host code and do code reviews we use a bit of
extra tooling and some 3rd party services for Flycheck:

* ReadTheDocs_ hosts http://www.flycheck.org and automatically rebuilds it on
  every change.  It works mostly automatically and requires little
  configuration.
* `GitHub Actions`_ runs our tests after every push and for every pull request.
  It's configured through ``.github/workflows/``.
* `CLA assistant`_ checks signatures to our CLA_ and allows contributors to sign
  the CLA through their Github account.

All :ref:`maintainers <flycheck-maintainers>` have administrative access to
these services so in case of an issue just contact them.

.. _Github: https://github.com/flycheck
.. _ReadTheDocs: https://readthedocs.org/projects/flycheck/
.. _GitHub Actions: https://github.com/flycheck/flycheck/actions
.. _CLA assistant: https://cla-assistant.io
.. _CLA: https://gist.github.com/swsnr/c9c0d656fe7e704da2f734779242ec99

.. _flycheck-maintenance-scripts:

Maintenance scripts
===================

Administrative processes are tedious and time-consuming, so we try to automate
as much as possible.  The :file:`maint/` directory contains many scripts for
this purpose.  ``make -C maint/ help`` provides an overview over all
administrative tasks.

Most of these scripts require Python 3.5 and additional Python libraries.  On OS
X it is recommended that you use Homebrew_ to install the latest Python version
with ``brew install python3``.  On Linux you should be able to obtain Python 3.5
from the package manager of your distribution.

To install all required libraries run ``make -C maint init``.  We recommend that
you use virtualenv_ to avoid a global installation of Python modules.  ``make
init`` will warn you if you do not.

.. _Homebrew: https://brew.sh
.. _virtualenv: https://virtualenv.pypa.io/en/latest/

Versioning and releases
=======================

We use a single continuously increasing version number for Flycheck.

.. important::

   Breaking changes may occur **at any point**.

Please feel free to make a release whenever you think it’s appropriate.
It’s generally a good idea to release when

- you fixed an important bug that affects many users,
- there are a couple of new syntax checkers available,
- there’s a major new feature in ``master``,
- etc.

In doubt just make a release.  We aim to release early and frequently.  If
anything breaks anything we can just publish another release afterwards.

.. _flycheck-release-process:

Release process
---------------

First, check that

1. you are on ``master``,
2. your working directory is clean, i.e. has no uncommitted changes or untracked
   files,
3. all commits are pushed,
4. and CI passes for the latest commit on ``master``.

If all is good a new release is as simple as

.. code-block:: console

   $ make -C maint release

This runs the release script in :file:`maint/release.py`.  If any of the above
requirements isn't met the release script will signal an error and abort.

The release script bumps the version number, commits and tags a new release, and
pushes it to Github.

.. note::

    The tag is *signed*; you must configure Git for :ref:`signing commits and
    tags <flycheck-git-signatures>` before you make a release the first time.
    After pushing the new release to Github, the script bumps the version number
    again, to the next snapshot, and commits the changes again.

Once the script is completed please

1. Edit the `release information`_ on Github and add a short summary about the
   release.  Don’t forget to add a link to the complete changelog and upload the
   package TAR file.
2. Enable the new release on the ReadTheDocs `versions dashboard`_.
3. Announce the new release in our Gitter_ channel, and wherever else you see
   fit.

.. _release information: https://github.com/flycheck/flycheck/releases
.. _versions dashboard: https://readthedocs.org/dashboard/flycheck/versions/
.. _Gitter: https://gitter.im/flycheck/flycheck

New maintainers
===============

To propose a new maintainer open a pull request that adds the user to
``MAINTAINERS`` and ``doc/community/people.rst``.  The pull request is subject
to the :ref:`same rules <flycheck-pull-requests-reviews>` as all other pull
requests.  Notably it goes through the same approval process.

Once merged please also

- add the new maintainer to the ``Maintainers`` team of the Github
  organisation.  This does not award additional privileges, it's just to support
  ``@flycheck/maintainers`` mentions for the sake of convenience,
- invite the new maintainer to the internal `Maintainers channel`_ on Gitter,

.. _Maintainers channel: https://gitter.im/flycheck/maintainers
