| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556 |
- CMake Review Process
- ********************
- The following documents the process for reviewing and integrating changes.
- See `CONTRIBUTING.rst`_ for instructions to contribute changes.
- See documentation on `CMake Development`_ for more information.
- .. _`CONTRIBUTING.rst`: ../../CONTRIBUTING.rst
- .. _`CMake Development`: README.rst
- .. contents:: The review process consists of the following steps:
- Merge Request
- =============
- A user initiates the review process for a change by pushing a *topic
- branch* to his or her own fork of the `CMake Repository`_ on GitLab and
- creating a *merge request* ("MR"). The new MR will appear on the
- `CMake Merge Requests Page`_. The rest of the review and integration
- process is managed by the merge request page for the change.
- During the review process, the MR submitter should address review comments
- or test failures by updating their local topic branch to fix their commits
- (e.g. via ``git commit --amend`` or ``git rebase -i``), and then issuing a
- (force-)push of the topic branch to their remote (e.g. ``git push --force``).
- This will automatically initiate a new round of review on the existing MR.
- We recommend that users enable the "Remove source branch when merge
- request is accepted" option when creating the MR or by editing it.
- This will cause the MR topic branch to be automatically removed from
- the user's fork during the `Merge`_ step.
- .. _`CMake Merge Requests Page`: https://gitlab.kitware.com/cmake/cmake/-/merge_requests
- .. _`CMake Repository`: https://gitlab.kitware.com/cmake/cmake
- Workflow Status
- ---------------
- `CMake GitLab Project Developers`_ may set one of the following labels
- in GitLab to track the state of a MR:
- * ``workflow:wip`` indicates that the MR needs additional updates from
- the MR submitter before further review. Use this label after making
- comments that require such updates.
- * ``workflow:in-review`` indicates that the MR awaits feedback from a
- human reviewer or from `Topic Testing`_. Use this label after making
- comments requesting such feedback.
- * ``workflow:nightly-testing`` indicates that the MR awaits results
- of `Integration Testing`_. Use this label after making comments
- requesting such staging.
- * ``workflow:expired`` indicates that the MR has been closed due
- to a period of inactivity. See the `Expire`_ step. Use this label
- after closing a MR for this reason.
- * ``workflow:external-discussion`` indicates that the MR has been closed
- pending discussion elsewhere. See the `External Discussion`_ step.
- Use this label after closing a MR for this reason.
- The workflow status labels are intended to be mutually exclusive,
- so please remove any existing workflow label when adding one.
- .. _`CMake GitLab Project Developers`: https://gitlab.kitware.com/cmake/cmake/-/settings/members
- Robot Review
- ============
- The "Kitware Robot" (``@kwrobot``) automatically performs basic checks on
- the commits proposed in a MR. If all is well the robot silently reports
- a successful "build" status to GitLab. Otherwise the robot posts a comment
- with its diagnostics. **A topic may not be merged until the automatic
- review succeeds.**
- Note that the MR submitter is expected to address the robot's comments by
- *rewriting* the commits named by the robot's diagnostics (e.g., via
- ``git rebase -i``). This is because the robot checks each commit individually,
- not the topic as a whole. This is done in order to ensure that commits in the
- middle of a topic do not, for example, add a giant file which is then later
- removed in the topic.
- Automatic Check
- ---------------
- The automatic check is repeated whenever the topic branch is updated.
- One may explicitly request a re-check by adding a comment with the
- following command among the `comment trailing lines`_::
- Do: check
- ``@kwrobot`` will add an award emoji to the comment to indicate that it
- was processed and also run its checks again.
- Automatic Format
- ----------------
- The automatic check will reject commits introducing source code not
- formatted according to ``clang-format``. One may ask the robot to
- automatically rewrite the MR topic branch with expected formatting
- by adding a comment with the following command among the
- `comment trailing lines`_::
- Do: reformat
- ``@kwrobot`` will add an award emoji to the comment to indicate that it
- was processed and also rewrite the MR topic branch and force-push an
- updated version with every commit formatted as expected by the check.
- Human Review
- ============
- Anyone is welcome to review merge requests and make comments!
- Please make comments directly on the MR page Discussion and Changes tabs
- and not on individual commits. Comments on a commit may disappear
- from the MR page if the commit is rewritten in response.
- Reviewers may add comments providing feedback or to acknowledge their
- approval. Lines of specific forms will be extracted during the `merge`_
- step and included as trailing lines of the generated merge commit message.
- Each review comment consists of up to two parts which must be specified
- in the following order: `comment body`_, then `comment trailing lines`_.
- Each part is optional, but they must be specified in this order.
- Comment Body
- ------------
- The body of a comment may be free-form `GitLab Flavored Markdown`_.
- See GitLab documentation on `Special GitLab References`_ to add links to
- things like issues, commits, or other merge requests (even across projects).
- Additionally, a line in the comment body may start with one of the
- following votes:
- * ``-1`` or ``:-1:`` indicates "the change is not ready for integration".
- * ``+1`` or ``:+1:`` indicates "I like the change".
- This adds an ``Acked-by:`` trailer to the `merge`_ commit message.
- * ``+2`` indicates "the change is ready for integration".
- This adds a ``Reviewed-by:`` trailer to the `merge`_ commit message.
- * ``+3`` indicates "I have tested the change and verified it works".
- This adds a ``Tested-by:`` trailer to the `merge`_ commit message.
- .. _`GitLab Flavored Markdown`: https://gitlab.kitware.com/help/user/markdown.md
- .. _`Special GitLab References`: https://gitlab.kitware.com/help/user/markdown.md#special-gitlab-references
- Comment Trailing Lines
- ----------------------
- Zero or more *trailing* lines in the last section of a comment may appear
- with the form ``Key: Value``. The first such line should be separated
- from a preceding `comment body`_ by a blank line. Any key-value pair(s)
- may be specified for human reference. A few specific keys have meaning to
- ``@kwrobot`` as follows.
- Comment Trailer Votes
- ^^^^^^^^^^^^^^^^^^^^^
- Among the `comment trailing lines`_ one may cast a vote using one of the
- following pairs followed by nothing but whitespace before the end of the line:
- * ``Rejected-by: me`` indicates "the change is not ready for integration".
- * ``Acked-by: me`` indicates "I like the change".
- This adds an ``Acked-by:`` trailer to the `merge`_ commit message.
- * ``Reviewed-by: me`` indicates "the change is ready for integration".
- This adds a ``Reviewed-by:`` trailer to the `merge`_ commit message.
- * ``Tested-by: me`` indicates "I have tested the change and verified it works".
- This adds a ``Tested-by:`` trailer to the `merge`_ commit message.
- Each ``me`` reference may instead be an ``@username`` reference or a full
- ``Real Name <user@domain>`` reference to credit someone else for performing
- the review. References to ``me`` and ``@username`` will automatically be
- transformed into a real name and email address according to the user's
- GitLab account profile.
- Comment Trailer Commands
- ^^^^^^^^^^^^^^^^^^^^^^^^
- Among the `comment trailing lines`_ authorized users may issue special
- commands to ``@kwrobot`` using the form ``Do: ...``:
- * ``Do: check`` explicitly re-runs the robot `Automatic Check`_.
- * ``Do: reformat`` rewrites the MR topic for `Automatic Format`_.
- * ``Do: test`` submits the MR for `Topic Testing`_.
- * ``Do: stage`` submits the MR for `Integration Testing`_.
- * ``Do: merge`` submits the MR for `Merge`_.
- See the corresponding sections for details on permissions and options
- for each command.
- Commit Messages
- ---------------
- Part of the human review is to check that each commit message is appropriate.
- The first line of the message should begin with one or two words indicating the
- area the commit applies to, followed by a colon and then a brief summary.
- Committers should aim to keep this first line short. Any subsequent lines
- should be separated from the first by a blank line and provide relevant, useful
- information.
- Area Prefix on Commit Messages
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The appropriateness of the initial word describing the area the commit applies
- to is not something the automatic robot review can judge, so it is up to the
- human reviewer to confirm that the area is specified and that it is
- appropriate. Good area words include the module name the commit is primarily
- fixing, the main C++ source file being edited, ``Help`` for generic
- documentation changes or a feature or functionality theme the changes apply to
- (e.g. ``server`` or ``Autogen``). Examples of suitable first lines of a commit
- message include:
- * ``Help: Fix example in cmake-buildsystem(7) manual``
- * ``FindBoost: Add support for 1.64``
- * ``Autogen: Extended mocInclude tests``
- * ``cmLocalGenerator: Explain standard flag selection logic in comments``
- Referencing Issues in Commit Messages
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- If the commit fixes a particular reported issue, this information should
- ideally also be part of the commit message. The recommended way to do this is
- to place a line at the end of the message in the form ``Fixes: #xxxxx`` where
- ``xxxxx`` is the GitLab issue number and to separate it from the rest of the
- text by a blank line. For example::
- Help: Fix FooBar example robustness issue
- FooBar supports option X, but the example provided
- would not work if Y was also specified.
- Fixes: #12345
- GitLab will automatically create relevant links to the merge request and will
- close the issue when the commit is merged into master. GitLab understands a few
- other synonyms for ``Fixes`` and allows much more flexible forms than the
- above, but committers should aim for this format for consistency. Note that
- such details can alternatively be specified in the merge request description.
- Referencing Commits in Commit Messages
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- The preferred form for references to other commits is
- ``commit <shorthash> (<subject>, <date>)``, where:
- * ``<shorthash>``:
- The abbreviated hash of the commit.
- * ``<subject>``:
- The first line of the commit message.
- * ``<date>``:
- The author date of the commit, in its original time zone, formatted as
- ``CCYY-MM-DD``. ``git-log(1)`` shows the original time zone by default.
- This may be generated with ``git show -s --pretty=reference <commit>`` with
- Git 2.25 and newer. Older versions of Git can generate the same format via
- ``git show -s --date=short --pretty="format:%h (%s, %ad)" <commit>``.
- If the commit is a fix for the mentioned commit, consider using a ``Fixes:``
- trailer in the commit message with the specified format. This trailer should
- not be word-wrapped. Note that if there is also an issue for what is being
- fixed, it is preferable to link to the issue instead.
- If relevant, add the first release tag of CMake containing the commit after
- the ``<date>``, i.e., ``commit <shorthash> (<subject>, <date>, <tag>)``.
- Or, use the output of ``git describe --contains <commit>`` as the ``<tag>``.
- Alternatively, the full commit ``<hash>`` may be used.
- Revising Commit Messages
- ^^^^^^^^^^^^^^^^^^^^^^^^
- Reviewers are encouraged to ask the committer to amend commit messages to
- follow these guidelines, but prefer to focus on the changes themselves as a
- first priority. Maintainers will also make a check of commit messages before
- merging.
- Topic Testing
- =============
- CMake uses `GitLab CI`_ to test merge requests, configured by the top-level
- ``.gitlab-ci.yml`` file. Results may be seen both on the merge request's
- pipeline page and on the `CMake CDash Page`_. Filtered CDash results
- showing just the pipeline's jobs can be reached by selecting the ``cdash``
- job in the ``External`` stage of the pipeline.
- Lint and documentation build jobs run automatically after every push.
- Heavier jobs require a manual trigger to run:
- * Merge request authors may visit their merge request's pipeline and click the
- "Play" button on one or more jobs manually. If the merge request has the
- "Allow commits from members who can merge to the target branch" check box
- enabled, CMake maintainers may use the "Play" button too.
- * `CMake GitLab Project Developers`_ may trigger CI on a merge request by
- adding a comment with a command among the `comment trailing lines`_::
- Do: test
- ``@kwrobot`` will add an award emoji to the comment to indicate that it
- was processed and also trigger all manual jobs in the merge request's
- pipeline.
- The ``Do: test`` command accepts the following arguments:
- * ``--named <regex>``, ``-n <regex>``: Trigger jobs matching ``<regex>``
- anywhere in their name. Job names may be seen on the merge request's
- pipeline page.
- * ``--stage <stage>``, ``-s <stage>``: Only affect jobs in a given stage.
- Stage names may be seen on the merge request's pipeline page. Note that
- the names are determined by what is in the ``.gitlab-ci.yml`` file and may
- be capitalized in the web page, so lowercasing the webpage's display name
- for stages may be required.
- * ``--action <action>``, ``-a <action>``: The action to perform on the jobs.
- Possible actions:
- * ``manual`` (the default): Start jobs awaiting manual interaction.
- * ``unsuccessful``: Start or restart jobs which have not completed
- successfully.
- * ``failed``: Restart jobs which have completed, but without success.
- * ``completed``: Restart all completed jobs.
- In order to keep job names shorter and keep as much information visible on the
- GitLab web interface as possible, jobs have a short prefix which indicates
- what its main purpose is:
- * ``b:`` jobs build CMake for the purposes of running the
- test suite.
- * ``l:`` jobs perform "linting" on the CMake source tree such as static
- analysis.
- * ``p:`` jobs perform preparatory tasks for use in other jobs.
- * ``t:`` jobs perform testing of CMake.
- * ``u:`` jobs upload other job results to permanent locations.
- If the merge request topic branch is updated by a push, a new manual trigger
- using one of the above methods is needed to start CI again.
- .. _`GitLab CI`: https://gitlab.kitware.com/help/ci/README.md
- .. _`CMake CDash Page`: https://open.cdash.org/index.php?project=CMake
- Integration Testing
- ===================
- The above `topic testing`_ tests the MR topic independent of other
- merge requests and on only a few key platforms and configurations.
- `CMake Integration Testing`_ also uses a large number of machines
- provided by Kitware and generous volunteers that cover nearly all
- supported platforms, generators, and configurations. In order to
- avoid overwhelming these resources, they do not test every MR
- individually. Instead, these machines follow an *integration branch*,
- run tests on a nightly basis (or continuously during the day), and
- post to the `CMake CDash Page`_. Some follow ``master``. Most follow
- a special integration branch, the *topic stage*.
- The topic stage is a special branch maintained by the "Kitware Robot"
- (``@kwrobot``). It consists of the head of the MR target integration
- branch (e.g. ``master``) branch followed by a sequence of merges each
- integrating changes from an open MR that has been staged for integration
- testing. Each time the target integration branch is updated the stage
- is rebuilt automatically by merging the staged MR topics again.
- The branch is stored in the upstream repository by special refs:
- * ``refs/stage/master/head``: The current topic stage branch.
- This is used by continuous builds that report to CDash.
- * ``refs/stage/master/nightly/latest``: Topic stage as of 1am UTC each night.
- This is used by most nightly builds that report to CDash.
- * ``refs/stage/master/nightly/<yyyy>/<mm>/<dd>``: Topic stage as of 1am UTC
- on the date specified. This is used for historical reference.
- `CMake GitLab Project Developers`_ may stage a MR for integration testing
- by adding a comment with a command among the `comment trailing lines`_::
- Do: stage
- ``@kwrobot`` will add an award emoji to the comment to indicate that it
- was processed and also attempt to add the MR topic branch to the topic
- stage. If the MR cannot be added (e.g. due to conflicts) the robot will
- post a comment explaining what went wrong.
- Once a MR has been added to the topic stage it will remain on the stage
- until one of the following occurs:
- * The MR topic branch is updated by a push.
- * The MR target integration branch (e.g. ``master``) branch is updated
- and the MR cannot be merged into the topic stage again due to conflicts.
- * A developer or the submitter posts an explicit ``Do: unstage`` command.
- This is useful to remove a MR from the topic stage when one is not ready
- to push an update to the MR topic branch. It is unnecessary to explicitly
- unstage just before or after pushing an update because the push will cause
- the MR to be unstaged automatically.
- * The MR is closed.
- * The MR is merged.
- Once a MR has been removed from the topic stage a new ``Do: stage``
- command is needed to stage it again.
- .. _`CMake Integration Testing`: integration-testing.rst
- Resolve
- =======
- The workflow used by the CMake project supports a number of different
- ways in which a MR can be moved to a resolved state. In addition to
- the conventional practices of merging or closing a MR without merging it,
- a MR can also be moved to a quasi-resolved state pending some action.
- This may involve moving discussion to an issue or it may be the result of
- an extended period of inactivity. These quasi-resolved states are used
- to help manage the relatively large number of MRs the project receives
- and are not an indication of the changes being rejected. The following
- sections explain the different resolutions a MR may be given.
- Merge
- -----
- Once review has concluded that the MR topic is ready for integration,
- `CMake GitLab Project Masters`_ may merge the topic by adding a comment
- with a command among the `comment trailing lines`_::
- Do: merge
- ``@kwrobot`` will add an award emoji to the comment to indicate that it
- was processed and also attempt to merge the MR topic branch to the MR
- target integration branch (e.g. ``master``). If the MR cannot be merged
- (e.g. due to conflicts) the robot will post a comment explaining what
- went wrong. If the MR is merged the robot will also remove the source
- branch from the user's fork if the corresponding MR option was checked.
- The robot automatically constructs a merge commit message of the following
- form::
- Merge topic 'mr-topic-branch-name'
- 00000000 commit message subject line (one line per commit)
- Acked-by: Kitware Robot <[email protected]>
- Merge-request: !0000
- Mention of the commit short sha1s and MR number helps GitLab link the
- commits back to the merge request and indicates when they were merged.
- The ``Acked-by:`` trailer shown indicates that `Robot Review`_ passed.
- Additional ``Acked-by:``, ``Reviewed-by:``, and similar trailers may be
- collected from `Human Review`_ comments that have been made since the
- last time the MR topic branch was updated with a push.
- The ``Do: merge`` command accepts the following arguments:
- * ``-t <topic>``: substitute ``<topic>`` for the name of the MR topic
- branch in the constructed merge commit message.
- Additionally, ``Do: merge`` extracts configuration from trailing lines
- in the MR description (the following have no effect if used in a MR
- comment instead):
- * ``Backport: release[:<commit-ish>]``: merge the topic branch into
- the ``release`` branch to backport the change. This is allowed
- only if the topic branch is based on a commit in ``release`` already.
- If only part of the topic branch should be backported, specify it as
- ``:<commit-ish>``. The ``<commit-ish>`` may use `git rev-parse`_
- syntax to reference commits relative to the topic ``HEAD``.
- See additional `backport instructions`_ for details.
- For example:
- ``Backport: release``
- Merge the topic branch head into both ``release`` and ``master``.
- ``Backport: release:HEAD~1^2``
- Merge the topic branch head's parent's second parent commit into
- the ``release`` branch. Merge the topic branch head to ``master``.
- * ``Topic-rename: <topic>``: substitute ``<topic>`` for the name of
- the MR topic branch in the constructed merge commit message.
- It is also used in merge commits constructed by ``Do: stage``.
- The ``-t`` option to a ``Do: merge`` command overrides any topic
- rename set in the MR description.
- .. _`CMake GitLab Project Masters`: https://gitlab.kitware.com/cmake/cmake/-/settings/members
- .. _`backport instructions`: https://gitlab.kitware.com/utils/git-workflow/-/wikis/Backport-topics
- .. _`git rev-parse`: https://git-scm.com/docs/git-rev-parse
- Close
- -----
- If review has concluded that the MR should not be integrated then it
- may be closed through GitLab. This would normally be a final state
- with no expectation that the MR would be re-opened in the future.
- It is also used when a MR is being superseded by another separate one,
- in which case a reference to the new MR should be added to the MR being
- closed.
- Expire
- ------
- If progress on a MR has stalled for a while, it may be closed with a
- ``workflow:expired`` label and a comment indicating that the MR has
- been closed due to inactivity (it may also be done where the MR is blocked
- for an extended period by work in a different MR). This is not an
- indication that there is a problem with the MR's content, it is only a
- practical measure to allow the reviewers to focus attention on MRs that
- are actively being worked on. As a guide, the average period of inactivity
- before transitioning a MR to the expired state would be around 2 weeks,
- but this may decrease to 1 week or less when there is a high number of
- open merge requests.
- Reviewers would usually provide a message similar to the following when
- resolving a MR as expired::
- Closing for now. @<MR-author> please re-open when ready to continue work.
- This is to make it clear to contributors that they are welcome to re-open
- the expired MR when they are ready to return to working on it and moving
- it forward. In the meantime, the MR will appear as ``Closed`` in GitLab,
- but it can be differentiated from permanently closed MRs by the presence
- of the ``workflow:expired`` label.
- **NOTE:** Please re-open *before* pushing an update to the MR topic branch
- to ensure GitLab will still act on the association. If changes are pushed
- before re-opening the MR, the reviewer should initiate a ``Do: check`` to
- force GitLab to act on the updates.
- External Discussion
- -------------------
- In some situations, a series of comments on a MR may develop into a more
- involved discussion, or it may become apparent that there are broader
- discussions that need to take place before the MR can move forward in an
- agreed direction. Such discussions are better suited to GitLab issues
- rather than in a MR because MRs may be superseded by a different MR, or
- the set of changes may evolve to look quite different to the context in
- which the discussions began. When this occurs, reviewers may ask the
- MR author to open an issue to discuss things there and they will transition
- the MR to a resolved state with the label ``workflow:external-discussion``.
- The MR will appear in GitLab as closed, but it can be differentiated from
- permanently closed MRs by the presence of the ``workflow:external-discussion``
- label. Reviewers should leave a message clearly explaining the action
- so that the MR author understands that the MR closure is temporary and
- it is clear what actions need to happen next. The following is an example
- of such a message, but it will usually be necessary to tailor the message
- to the individual situation::
- The desired behavior here looks to be more involved than first thought.
- Please open an issue so we can discuss the relevant details there.
- Once the path forward is clear, we can re-open this MR and continue work.
- When the discussion in the associated issue runs its course and the way
- forward is clear, the MR can be re-opened again and the
- ``workflow:external-discussion`` label removed. Reviewers should ensure
- that the issue created contains a reference to the MR so that GitLab
- provides a cross-reference to link the two.
|