review.rst 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. CMake Review Process
  2. ********************
  3. The following documents the process for reviewing and integrating changes.
  4. See `CONTRIBUTING.rst`_ for instructions to contribute changes.
  5. See documentation on `CMake Development`_ for more information.
  6. .. _`CONTRIBUTING.rst`: ../../CONTRIBUTING.rst
  7. .. _`CMake Development`: README.rst
  8. .. contents:: The review process consists of the following steps:
  9. Merge Request
  10. =============
  11. A user initiates the review process for a change by pushing a *topic
  12. branch* to his or her own fork of the `CMake Repository`_ on GitLab and
  13. creating a *merge request* ("MR"). The new MR will appear on the
  14. `CMake Merge Requests Page`_. The rest of the review and integration
  15. process is managed by the merge request page for the change.
  16. During the review process, the MR submitter should address review comments
  17. or test failures by updating their local topic branch to fix their commits
  18. (e.g. via ``git commit --amend`` or ``git rebase -i``), and then issuing a
  19. (force-)push of the topic branch to their remote (e.g. ``git push --force``).
  20. This will automatically initiate a new round of review on the existing MR.
  21. We recommend that users enable the "Remove source branch when merge
  22. request is accepted" option when creating the MR or by editing it.
  23. This will cause the MR topic branch to be automatically removed from
  24. the user's fork during the `Merge`_ step.
  25. .. _`CMake Merge Requests Page`: https://gitlab.kitware.com/cmake/cmake/-/merge_requests
  26. .. _`CMake Repository`: https://gitlab.kitware.com/cmake/cmake
  27. Workflow Status
  28. ---------------
  29. `CMake GitLab Project Developers`_ may set one of the following labels
  30. in GitLab to track the state of a MR:
  31. * ``workflow:wip`` indicates that the MR needs additional updates from
  32. the MR submitter before further review. Use this label after making
  33. comments that require such updates.
  34. * ``workflow:in-review`` indicates that the MR awaits feedback from a
  35. human reviewer or from `Topic Testing`_. Use this label after making
  36. comments requesting such feedback.
  37. * ``workflow:nightly-testing`` indicates that the MR awaits results
  38. of `Integration Testing`_. Use this label after making comments
  39. requesting such staging.
  40. * ``workflow:expired`` indicates that the MR has been closed due
  41. to a period of inactivity. See the `Expire`_ step. Use this label
  42. after closing a MR for this reason.
  43. * ``workflow:external-discussion`` indicates that the MR has been closed
  44. pending discussion elsewhere. See the `External Discussion`_ step.
  45. Use this label after closing a MR for this reason.
  46. The workflow status labels are intended to be mutually exclusive,
  47. so please remove any existing workflow label when adding one.
  48. .. _`CMake GitLab Project Developers`: https://gitlab.kitware.com/cmake/cmake/-/settings/members
  49. Robot Review
  50. ============
  51. The "Kitware Robot" (``@kwrobot``) automatically performs basic checks on
  52. the commits proposed in a MR. If all is well the robot silently reports
  53. a successful "build" status to GitLab. Otherwise the robot posts a comment
  54. with its diagnostics. **A topic may not be merged until the automatic
  55. review succeeds.**
  56. Note that the MR submitter is expected to address the robot's comments by
  57. *rewriting* the commits named by the robot's diagnostics (e.g., via
  58. ``git rebase -i``). This is because the robot checks each commit individually,
  59. not the topic as a whole. This is done in order to ensure that commits in the
  60. middle of a topic do not, for example, add a giant file which is then later
  61. removed in the topic.
  62. Automatic Check
  63. ---------------
  64. The automatic check is repeated whenever the topic branch is updated.
  65. One may explicitly request a re-check by adding a comment with the
  66. following command among the `comment trailing lines`_::
  67. Do: check
  68. ``@kwrobot`` will add an award emoji to the comment to indicate that it
  69. was processed and also run its checks again.
  70. Automatic Format
  71. ----------------
  72. The automatic check will reject commits introducing source code not
  73. formatted according to ``clang-format``. One may ask the robot to
  74. automatically rewrite the MR topic branch with expected formatting
  75. by adding a comment with the following command among the
  76. `comment trailing lines`_::
  77. Do: reformat
  78. ``@kwrobot`` will add an award emoji to the comment to indicate that it
  79. was processed and also rewrite the MR topic branch and force-push an
  80. updated version with every commit formatted as expected by the check.
  81. Human Review
  82. ============
  83. Anyone is welcome to review merge requests and make comments!
  84. Please make comments directly on the MR page Discussion and Changes tabs
  85. and not on individual commits. Comments on a commit may disappear
  86. from the MR page if the commit is rewritten in response.
  87. Reviewers may add comments providing feedback or to acknowledge their
  88. approval. Lines of specific forms will be extracted during the `merge`_
  89. step and included as trailing lines of the generated merge commit message.
  90. Each review comment consists of up to two parts which must be specified
  91. in the following order: `comment body`_, then `comment trailing lines`_.
  92. Each part is optional, but they must be specified in this order.
  93. Comment Body
  94. ------------
  95. The body of a comment may be free-form `GitLab Flavored Markdown`_.
  96. See GitLab documentation on `Special GitLab References`_ to add links to
  97. things like issues, commits, or other merge requests (even across projects).
  98. Additionally, a line in the comment body may start with one of the
  99. following votes:
  100. * ``-1`` or ``:-1:`` indicates "the change is not ready for integration".
  101. * ``+1`` or ``:+1:`` indicates "I like the change".
  102. This adds an ``Acked-by:`` trailer to the `merge`_ commit message.
  103. * ``+2`` indicates "the change is ready for integration".
  104. This adds a ``Reviewed-by:`` trailer to the `merge`_ commit message.
  105. * ``+3`` indicates "I have tested the change and verified it works".
  106. This adds a ``Tested-by:`` trailer to the `merge`_ commit message.
  107. .. _`GitLab Flavored Markdown`: https://gitlab.kitware.com/help/user/markdown.md
  108. .. _`Special GitLab References`: https://gitlab.kitware.com/help/user/markdown.md#special-gitlab-references
  109. Comment Trailing Lines
  110. ----------------------
  111. Zero or more *trailing* lines in the last section of a comment may appear
  112. with the form ``Key: Value``. The first such line should be separated
  113. from a preceding `comment body`_ by a blank line. Any key-value pair(s)
  114. may be specified for human reference. A few specific keys have meaning to
  115. ``@kwrobot`` as follows.
  116. Comment Trailer Votes
  117. ^^^^^^^^^^^^^^^^^^^^^
  118. Among the `comment trailing lines`_ one may cast a vote using one of the
  119. following pairs followed by nothing but whitespace before the end of the line:
  120. * ``Rejected-by: me`` indicates "the change is not ready for integration".
  121. * ``Acked-by: me`` indicates "I like the change".
  122. This adds an ``Acked-by:`` trailer to the `merge`_ commit message.
  123. * ``Reviewed-by: me`` indicates "the change is ready for integration".
  124. This adds a ``Reviewed-by:`` trailer to the `merge`_ commit message.
  125. * ``Tested-by: me`` indicates "I have tested the change and verified it works".
  126. This adds a ``Tested-by:`` trailer to the `merge`_ commit message.
  127. Each ``me`` reference may instead be an ``@username`` reference or a full
  128. ``Real Name <user@domain>`` reference to credit someone else for performing
  129. the review. References to ``me`` and ``@username`` will automatically be
  130. transformed into a real name and email address according to the user's
  131. GitLab account profile.
  132. Comment Trailer Commands
  133. ^^^^^^^^^^^^^^^^^^^^^^^^
  134. Among the `comment trailing lines`_ authorized users may issue special
  135. commands to ``@kwrobot`` using the form ``Do: ...``:
  136. * ``Do: check`` explicitly re-runs the robot `Automatic Check`_.
  137. * ``Do: reformat`` rewrites the MR topic for `Automatic Format`_.
  138. * ``Do: test`` submits the MR for `Topic Testing`_.
  139. * ``Do: stage`` submits the MR for `Integration Testing`_.
  140. * ``Do: merge`` submits the MR for `Merge`_.
  141. See the corresponding sections for details on permissions and options
  142. for each command.
  143. Commit Messages
  144. ---------------
  145. Part of the human review is to check that each commit message is appropriate.
  146. The first line of the message should begin with one or two words indicating the
  147. area the commit applies to, followed by a colon and then a brief summary.
  148. Committers should aim to keep this first line short. Any subsequent lines
  149. should be separated from the first by a blank line and provide relevant, useful
  150. information.
  151. Area Prefix on Commit Messages
  152. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  153. The appropriateness of the initial word describing the area the commit applies
  154. to is not something the automatic robot review can judge, so it is up to the
  155. human reviewer to confirm that the area is specified and that it is
  156. appropriate. Good area words include the module name the commit is primarily
  157. fixing, the main C++ source file being edited, ``Help`` for generic
  158. documentation changes or a feature or functionality theme the changes apply to
  159. (e.g. ``server`` or ``Autogen``). Examples of suitable first lines of a commit
  160. message include:
  161. * ``Help: Fix example in cmake-buildsystem(7) manual``
  162. * ``FindBoost: Add support for 1.64``
  163. * ``Autogen: Extended mocInclude tests``
  164. * ``cmLocalGenerator: Explain standard flag selection logic in comments``
  165. Referencing Issues in Commit Messages
  166. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  167. If the commit fixes a particular reported issue, this information should
  168. ideally also be part of the commit message. The recommended way to do this is
  169. to place a line at the end of the message in the form ``Fixes: #xxxxx`` where
  170. ``xxxxx`` is the GitLab issue number and to separate it from the rest of the
  171. text by a blank line. For example::
  172. Help: Fix FooBar example robustness issue
  173. FooBar supports option X, but the example provided
  174. would not work if Y was also specified.
  175. Fixes: #12345
  176. GitLab will automatically create relevant links to the merge request and will
  177. close the issue when the commit is merged into master. GitLab understands a few
  178. other synonyms for ``Fixes`` and allows much more flexible forms than the
  179. above, but committers should aim for this format for consistency. Note that
  180. such details can alternatively be specified in the merge request description.
  181. Referencing Commits in Commit Messages
  182. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  183. The preferred form for references to other commits is
  184. ``commit <shorthash> (<subject>, <date>)``, where:
  185. * ``<shorthash>``:
  186. The abbreviated hash of the commit.
  187. * ``<subject>``:
  188. The first line of the commit message.
  189. * ``<date>``:
  190. The author date of the commit, in its original time zone, formatted as
  191. ``CCYY-MM-DD``. ``git-log(1)`` shows the original time zone by default.
  192. This may be generated with ``git show -s --pretty=reference <commit>`` with
  193. Git 2.25 and newer. Older versions of Git can generate the same format via
  194. ``git show -s --date=short --pretty="format:%h (%s, %ad)" <commit>``.
  195. If the commit is a fix for the mentioned commit, consider using a ``Fixes:``
  196. trailer in the commit message with the specified format. This trailer should
  197. not be word-wrapped. Note that if there is also an issue for what is being
  198. fixed, it is preferable to link to the issue instead.
  199. If relevant, add the first release tag of CMake containing the commit after
  200. the ``<date>``, i.e., ``commit <shorthash> (<subject>, <date>, <tag>)``.
  201. Or, use the output of ``git describe --contains <commit>`` as the ``<tag>``.
  202. Alternatively, the full commit ``<hash>`` may be used.
  203. Revising Commit Messages
  204. ^^^^^^^^^^^^^^^^^^^^^^^^
  205. Reviewers are encouraged to ask the committer to amend commit messages to
  206. follow these guidelines, but prefer to focus on the changes themselves as a
  207. first priority. Maintainers will also make a check of commit messages before
  208. merging.
  209. Topic Testing
  210. =============
  211. CMake uses `GitLab CI`_ to test merge requests, configured by the top-level
  212. ``.gitlab-ci.yml`` file. Results may be seen both on the merge request's
  213. pipeline page and on the `CMake CDash Page`_. Filtered CDash results
  214. showing just the pipeline's jobs can be reached by selecting the ``cdash``
  215. job in the ``External`` stage of the pipeline.
  216. Lint and documentation build jobs run automatically after every push.
  217. Heavier jobs require a manual trigger to run:
  218. * Merge request authors may visit their merge request's pipeline and click the
  219. "Play" button on one or more jobs manually. If the merge request has the
  220. "Allow commits from members who can merge to the target branch" check box
  221. enabled, CMake maintainers may use the "Play" button too.
  222. * `CMake GitLab Project Developers`_ may trigger CI on a merge request by
  223. adding a comment with a command among the `comment trailing lines`_::
  224. Do: test
  225. ``@kwrobot`` will add an award emoji to the comment to indicate that it
  226. was processed and also trigger all manual jobs in the merge request's
  227. pipeline.
  228. The ``Do: test`` command accepts the following arguments:
  229. * ``--named <regex>``, ``-n <regex>``: Trigger jobs matching ``<regex>``
  230. anywhere in their name. Job names may be seen on the merge request's
  231. pipeline page.
  232. * ``--stage <stage>``, ``-s <stage>``: Only affect jobs in a given stage.
  233. Stage names may be seen on the merge request's pipeline page. Note that
  234. the names are determined by what is in the ``.gitlab-ci.yml`` file and may
  235. be capitalized in the web page, so lowercasing the webpage's display name
  236. for stages may be required.
  237. * ``--action <action>``, ``-a <action>``: The action to perform on the jobs.
  238. Possible actions:
  239. * ``manual`` (the default): Start jobs awaiting manual interaction.
  240. * ``unsuccessful``: Start or restart jobs which have not completed
  241. successfully.
  242. * ``failed``: Restart jobs which have completed, but without success.
  243. * ``completed``: Restart all completed jobs.
  244. In order to keep job names shorter and keep as much information visible on the
  245. GitLab web interface as possible, jobs have a short prefix which indicates
  246. what its main purpose is:
  247. * ``b:`` jobs build CMake for the purposes of running the
  248. test suite.
  249. * ``l:`` jobs perform "linting" on the CMake source tree such as static
  250. analysis.
  251. * ``p:`` jobs perform preparatory tasks for use in other jobs.
  252. * ``t:`` jobs perform testing of CMake.
  253. * ``u:`` jobs upload other job results to permanent locations.
  254. If the merge request topic branch is updated by a push, a new manual trigger
  255. using one of the above methods is needed to start CI again.
  256. .. _`GitLab CI`: https://gitlab.kitware.com/help/ci/README.md
  257. .. _`CMake CDash Page`: https://open.cdash.org/index.php?project=CMake
  258. Integration Testing
  259. ===================
  260. The above `topic testing`_ tests the MR topic independent of other
  261. merge requests and on only a few key platforms and configurations.
  262. `CMake Integration Testing`_ also uses a large number of machines
  263. provided by Kitware and generous volunteers that cover nearly all
  264. supported platforms, generators, and configurations. In order to
  265. avoid overwhelming these resources, they do not test every MR
  266. individually. Instead, these machines follow an *integration branch*,
  267. run tests on a nightly basis (or continuously during the day), and
  268. post to the `CMake CDash Page`_. Some follow ``master``. Most follow
  269. a special integration branch, the *topic stage*.
  270. The topic stage is a special branch maintained by the "Kitware Robot"
  271. (``@kwrobot``). It consists of the head of the MR target integration
  272. branch (e.g. ``master``) branch followed by a sequence of merges each
  273. integrating changes from an open MR that has been staged for integration
  274. testing. Each time the target integration branch is updated the stage
  275. is rebuilt automatically by merging the staged MR topics again.
  276. The branch is stored in the upstream repository by special refs:
  277. * ``refs/stage/master/head``: The current topic stage branch.
  278. This is used by continuous builds that report to CDash.
  279. * ``refs/stage/master/nightly/latest``: Topic stage as of 1am UTC each night.
  280. This is used by most nightly builds that report to CDash.
  281. * ``refs/stage/master/nightly/<yyyy>/<mm>/<dd>``: Topic stage as of 1am UTC
  282. on the date specified. This is used for historical reference.
  283. `CMake GitLab Project Developers`_ may stage a MR for integration testing
  284. by adding a comment with a command among the `comment trailing lines`_::
  285. Do: stage
  286. ``@kwrobot`` will add an award emoji to the comment to indicate that it
  287. was processed and also attempt to add the MR topic branch to the topic
  288. stage. If the MR cannot be added (e.g. due to conflicts) the robot will
  289. post a comment explaining what went wrong.
  290. Once a MR has been added to the topic stage it will remain on the stage
  291. until one of the following occurs:
  292. * The MR topic branch is updated by a push.
  293. * The MR target integration branch (e.g. ``master``) branch is updated
  294. and the MR cannot be merged into the topic stage again due to conflicts.
  295. * A developer or the submitter posts an explicit ``Do: unstage`` command.
  296. This is useful to remove a MR from the topic stage when one is not ready
  297. to push an update to the MR topic branch. It is unnecessary to explicitly
  298. unstage just before or after pushing an update because the push will cause
  299. the MR to be unstaged automatically.
  300. * The MR is closed.
  301. * The MR is merged.
  302. Once a MR has been removed from the topic stage a new ``Do: stage``
  303. command is needed to stage it again.
  304. .. _`CMake Integration Testing`: integration-testing.rst
  305. Resolve
  306. =======
  307. The workflow used by the CMake project supports a number of different
  308. ways in which a MR can be moved to a resolved state. In addition to
  309. the conventional practices of merging or closing a MR without merging it,
  310. a MR can also be moved to a quasi-resolved state pending some action.
  311. This may involve moving discussion to an issue or it may be the result of
  312. an extended period of inactivity. These quasi-resolved states are used
  313. to help manage the relatively large number of MRs the project receives
  314. and are not an indication of the changes being rejected. The following
  315. sections explain the different resolutions a MR may be given.
  316. Merge
  317. -----
  318. Once review has concluded that the MR topic is ready for integration,
  319. `CMake GitLab Project Masters`_ may merge the topic by adding a comment
  320. with a command among the `comment trailing lines`_::
  321. Do: merge
  322. ``@kwrobot`` will add an award emoji to the comment to indicate that it
  323. was processed and also attempt to merge the MR topic branch to the MR
  324. target integration branch (e.g. ``master``). If the MR cannot be merged
  325. (e.g. due to conflicts) the robot will post a comment explaining what
  326. went wrong. If the MR is merged the robot will also remove the source
  327. branch from the user's fork if the corresponding MR option was checked.
  328. The robot automatically constructs a merge commit message of the following
  329. form::
  330. Merge topic 'mr-topic-branch-name'
  331. 00000000 commit message subject line (one line per commit)
  332. Acked-by: Kitware Robot <[email protected]>
  333. Merge-request: !0000
  334. Mention of the commit short sha1s and MR number helps GitLab link the
  335. commits back to the merge request and indicates when they were merged.
  336. The ``Acked-by:`` trailer shown indicates that `Robot Review`_ passed.
  337. Additional ``Acked-by:``, ``Reviewed-by:``, and similar trailers may be
  338. collected from `Human Review`_ comments that have been made since the
  339. last time the MR topic branch was updated with a push.
  340. The ``Do: merge`` command accepts the following arguments:
  341. * ``-t <topic>``: substitute ``<topic>`` for the name of the MR topic
  342. branch in the constructed merge commit message.
  343. Additionally, ``Do: merge`` extracts configuration from trailing lines
  344. in the MR description (the following have no effect if used in a MR
  345. comment instead):
  346. * ``Backport: release[:<commit-ish>]``: merge the topic branch into
  347. the ``release`` branch to backport the change. This is allowed
  348. only if the topic branch is based on a commit in ``release`` already.
  349. If only part of the topic branch should be backported, specify it as
  350. ``:<commit-ish>``. The ``<commit-ish>`` may use `git rev-parse`_
  351. syntax to reference commits relative to the topic ``HEAD``.
  352. See additional `backport instructions`_ for details.
  353. For example:
  354. ``Backport: release``
  355. Merge the topic branch head into both ``release`` and ``master``.
  356. ``Backport: release:HEAD~1^2``
  357. Merge the topic branch head's parent's second parent commit into
  358. the ``release`` branch. Merge the topic branch head to ``master``.
  359. * ``Topic-rename: <topic>``: substitute ``<topic>`` for the name of
  360. the MR topic branch in the constructed merge commit message.
  361. It is also used in merge commits constructed by ``Do: stage``.
  362. The ``-t`` option to a ``Do: merge`` command overrides any topic
  363. rename set in the MR description.
  364. .. _`CMake GitLab Project Masters`: https://gitlab.kitware.com/cmake/cmake/-/settings/members
  365. .. _`backport instructions`: https://gitlab.kitware.com/utils/git-workflow/-/wikis/Backport-topics
  366. .. _`git rev-parse`: https://git-scm.com/docs/git-rev-parse
  367. Close
  368. -----
  369. If review has concluded that the MR should not be integrated then it
  370. may be closed through GitLab. This would normally be a final state
  371. with no expectation that the MR would be re-opened in the future.
  372. It is also used when a MR is being superseded by another separate one,
  373. in which case a reference to the new MR should be added to the MR being
  374. closed.
  375. Expire
  376. ------
  377. If progress on a MR has stalled for a while, it may be closed with a
  378. ``workflow:expired`` label and a comment indicating that the MR has
  379. been closed due to inactivity (it may also be done where the MR is blocked
  380. for an extended period by work in a different MR). This is not an
  381. indication that there is a problem with the MR's content, it is only a
  382. practical measure to allow the reviewers to focus attention on MRs that
  383. are actively being worked on. As a guide, the average period of inactivity
  384. before transitioning a MR to the expired state would be around 2 weeks,
  385. but this may decrease to 1 week or less when there is a high number of
  386. open merge requests.
  387. Reviewers would usually provide a message similar to the following when
  388. resolving a MR as expired::
  389. Closing for now. @<MR-author> please re-open when ready to continue work.
  390. This is to make it clear to contributors that they are welcome to re-open
  391. the expired MR when they are ready to return to working on it and moving
  392. it forward. In the meantime, the MR will appear as ``Closed`` in GitLab,
  393. but it can be differentiated from permanently closed MRs by the presence
  394. of the ``workflow:expired`` label.
  395. **NOTE:** Please re-open *before* pushing an update to the MR topic branch
  396. to ensure GitLab will still act on the association. If changes are pushed
  397. before re-opening the MR, the reviewer should initiate a ``Do: check`` to
  398. force GitLab to act on the updates.
  399. External Discussion
  400. -------------------
  401. In some situations, a series of comments on a MR may develop into a more
  402. involved discussion, or it may become apparent that there are broader
  403. discussions that need to take place before the MR can move forward in an
  404. agreed direction. Such discussions are better suited to GitLab issues
  405. rather than in a MR because MRs may be superseded by a different MR, or
  406. the set of changes may evolve to look quite different to the context in
  407. which the discussions began. When this occurs, reviewers may ask the
  408. MR author to open an issue to discuss things there and they will transition
  409. the MR to a resolved state with the label ``workflow:external-discussion``.
  410. The MR will appear in GitLab as closed, but it can be differentiated from
  411. permanently closed MRs by the presence of the ``workflow:external-discussion``
  412. label. Reviewers should leave a message clearly explaining the action
  413. so that the MR author understands that the MR closure is temporary and
  414. it is clear what actions need to happen next. The following is an example
  415. of such a message, but it will usually be necessary to tailor the message
  416. to the individual situation::
  417. The desired behavior here looks to be more involved than first thought.
  418. Please open an issue so we can discuss the relevant details there.
  419. Once the path forward is clear, we can re-open this MR and continue work.
  420. When the discussion in the associated issue runs its course and the way
  421. forward is clear, the MR can be re-opened again and the
  422. ``workflow:external-discussion`` label removed. Reviewers should ensure
  423. that the issue created contains a reference to the MR so that GitLab
  424. provides a cross-reference to link the two.