1 | Submitting Patches
|
---|
2 | ==================
|
---|
3 |
|
---|
4 | .. _guidelines:
|
---|
5 |
|
---|
6 | Basic guidelines
|
---|
7 | ----------------
|
---|
8 |
|
---|
9 | - Patches should not mix code changes with code formatting changes
|
---|
10 | (except, perhaps, in very trivial cases.)
|
---|
11 | - Code patches should follow Mesa :doc:`coding
|
---|
12 | conventions <codingstyle>`.
|
---|
13 | - Whenever possible, patches should only affect individual Mesa/Gallium
|
---|
14 | components.
|
---|
15 | - Patches should never introduce build breaks and should be bisectable
|
---|
16 | (see ``Git bisect``.)
|
---|
17 | - Patches should be properly :ref:`formatted <formatting>`.
|
---|
18 | - Patches should be sufficiently :ref:`tested <testing>` before
|
---|
19 | submitting.
|
---|
20 | - Patches should be :ref:`submitted <submit>` via a merge request for
|
---|
21 | :ref:`review <reviewing>`.
|
---|
22 |
|
---|
23 | .. _formatting:
|
---|
24 |
|
---|
25 | Patch formatting
|
---|
26 | ----------------
|
---|
27 |
|
---|
28 | - Lines should be limited to 75 characters or less so that Git logs
|
---|
29 | displayed in 80-column terminals avoid line wrapping. Note that
|
---|
30 | ``git log`` uses 4 spaces of indentation (4 + 75 < 80).
|
---|
31 | - The first line should be a short, concise summary of the change
|
---|
32 | prefixed with a module name. Examples:
|
---|
33 |
|
---|
34 | ::
|
---|
35 |
|
---|
36 | mesa: Add support for querying GL_VERTEX_ATTRIB_ARRAY_LONG
|
---|
37 |
|
---|
38 | gallium: add PIPE_CAP_DEVICE_RESET_STATUS_QUERY
|
---|
39 |
|
---|
40 | i965: Fix missing type in local variable declaration.
|
---|
41 |
|
---|
42 | - Subsequent patch comments should describe the change in more detail,
|
---|
43 | if needed. For example:
|
---|
44 |
|
---|
45 | ::
|
---|
46 |
|
---|
47 | i965: Remove end-of-thread SEND alignment code.
|
---|
48 |
|
---|
49 | This was present in Eric's initial implementation of the compaction code
|
---|
50 | for Sandybridge (commit 077d01b6). There is no documentation saying this
|
---|
51 | is necessary, and removing it causes no regressions in piglit on any
|
---|
52 | platform.
|
---|
53 |
|
---|
54 | - A "Signed-off-by:" line is not required, but not discouraged either.
|
---|
55 | - If a patch addresses an issue in GitLab, use the Closes: tag For
|
---|
56 | example:
|
---|
57 |
|
---|
58 | ::
|
---|
59 |
|
---|
60 | Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/1
|
---|
61 |
|
---|
62 | Prefer the full URL to just ``Closes: #1``, since the URL makes it
|
---|
63 | easier to get to the bug page from ``git log``
|
---|
64 |
|
---|
65 | **Do not use the ``Fixes:`` tag for this!** Mesa already uses
|
---|
66 | ``Fixes:`` for something else.
|
---|
67 | See :ref:`below <fixes>`.
|
---|
68 |
|
---|
69 | - If there have been several revisions to a patch during the review
|
---|
70 | process, they should be noted such as in this example:
|
---|
71 |
|
---|
72 | ::
|
---|
73 |
|
---|
74 | st/mesa: add ARB_texture_stencil8 support (v4)
|
---|
75 |
|
---|
76 | if we support stencil texturing, enable texture_stencil8
|
---|
77 | there is no requirement to support native S8 for this,
|
---|
78 | the texture can be converted to x24s8 fine.
|
---|
79 |
|
---|
80 | v2: fold fixes from Marek in:
|
---|
81 | a) put S8 last in the list
|
---|
82 | b) fix renderable to always test for d/s renderable
|
---|
83 | fixup the texture case to use a stencil only format
|
---|
84 | for picking the format for the texture view.
|
---|
85 | v3: hit fallback for getteximage
|
---|
86 | v4: put s8 back in front, it shouldn't get picked now (Ilia)
|
---|
87 |
|
---|
88 | - If someone tested your patch, document it with a line like this:
|
---|
89 |
|
---|
90 | ::
|
---|
91 |
|
---|
92 | Tested-by: Joe Hacker <[email protected]>
|
---|
93 |
|
---|
94 | - If the patch was reviewed (usually the case) or acked by someone,
|
---|
95 | that should be documented with:
|
---|
96 |
|
---|
97 | ::
|
---|
98 |
|
---|
99 | Reviewed-by: Joe Hacker <[email protected]>
|
---|
100 | Acked-by: Joe Hacker <[email protected]>
|
---|
101 |
|
---|
102 | - When updating a merge request add all the tags (``Acked-by:``, ``Reviewed-by:``,
|
---|
103 | ``Fixes:``, ``Backport-to:`` and/or other) to the commit messages.
|
---|
104 | This provides reviewers with quick feedback if the patch has already
|
---|
105 | been reviewed.
|
---|
106 |
|
---|
107 | .. _fixes:
|
---|
108 |
|
---|
109 | The ``Fixes:`` tag
|
---|
110 | ------------------
|
---|
111 |
|
---|
112 | If a patch addresses a issue introduced with earlier commit, that
|
---|
113 | should be noted in the commit message. For example::
|
---|
114 |
|
---|
115 | Fixes: d7b3707c612 ("util/disk_cache: use stat() to check if entry is a directory")
|
---|
116 |
|
---|
117 | You can produce those fixes lines by running this command once::
|
---|
118 |
|
---|
119 | git config --global alias.fixes "show -s --pretty='format:Fixes: %h (\"%s\")'"
|
---|
120 |
|
---|
121 | After that, using ``git fixes <sha1>`` will print the full line for you.
|
---|
122 |
|
---|
123 | The stable tag
|
---|
124 | ~~~~~~~~~~~~~~
|
---|
125 |
|
---|
126 | If you want a commit to be applied to a stable branch, you should add an
|
---|
127 | appropriate note to the commit message.
|
---|
128 |
|
---|
129 | Using a ``Fixes:`` tag as described in :ref:`Patch formatting <formatting>`
|
---|
130 | is the preferred way to nominate a commit that should be backported.
|
---|
131 | There are scripts that will figure out which releases to apply the patch
|
---|
132 | to automatically, so you don't need to figure it out.
|
---|
133 |
|
---|
134 | Alternatively, you may use the ``Backport-to:`` tag, as presented in the
|
---|
135 | following example::
|
---|
136 |
|
---|
137 | Backport-to: 21.0
|
---|
138 |
|
---|
139 | Multiple ``Backport-to:`` lines are allowed.
|
---|
140 |
|
---|
141 | The last option is deprecated and mostly here for historical reasons
|
---|
142 | dating back to when patch submision was done via emails: using a ``Cc:``
|
---|
143 | tag. Support for this tag will be removed at some point.
|
---|
144 | Here are some examples of such a note::
|
---|
145 |
|
---|
146 | Cc: mesa-stable
|
---|
147 | Cc: 20.0 <mesa-stable>
|
---|
148 | CC: 20.0 19.3 <mesa-stable>
|
---|
149 |
|
---|
150 | Using the CC tag **should** include the stable branches you want to
|
---|
151 | nominate the patch to. If you do not provide any version it is nominated
|
---|
152 | to all active stable branches.
|
---|
153 |
|
---|
154 | .. _testing:
|
---|
155 |
|
---|
156 | Testing Patches
|
---|
157 | ---------------
|
---|
158 |
|
---|
159 | It should go without saying that patches must be tested. In general, do
|
---|
160 | whatever testing is prudent.
|
---|
161 |
|
---|
162 | You should always run the Mesa test suite before submitting patches. The
|
---|
163 | test suite can be run using the 'meson test' command. All tests must
|
---|
164 | pass before patches will be accepted, this may mean you have to update
|
---|
165 | the tests themselves.
|
---|
166 |
|
---|
167 | Whenever possible and applicable, test the patch with
|
---|
168 | `Piglit <https://piglit.freedesktop.org>`__ and/or
|
---|
169 | `dEQP <https://android.googlesource.com/platform/external/deqp/>`__ to
|
---|
170 | check for regressions.
|
---|
171 |
|
---|
172 | As mentioned at the beginning, patches should be bisectable. A good way
|
---|
173 | to test this is to make use of the \`git rebase\` command, to run your
|
---|
174 | tests on each commit. Assuming your branch is based off
|
---|
175 | ``origin/main``, you can run:
|
---|
176 |
|
---|
177 | .. code-block:: console
|
---|
178 |
|
---|
179 | $ git rebase --interactive --exec "meson test -C build/" origin/main
|
---|
180 |
|
---|
181 | replacing ``"meson test"`` with whatever other test you want to run.
|
---|
182 |
|
---|
183 | .. _submit:
|
---|
184 |
|
---|
185 | Submitting Patches
|
---|
186 | ------------------
|
---|
187 |
|
---|
188 | Patches are submitted to the Mesa project via a
|
---|
189 | `GitLab <https://gitlab.freedesktop.org/mesa/mesa>`__ Merge Request.
|
---|
190 |
|
---|
191 | Add labels to your MR to help reviewers find it. For example:
|
---|
192 |
|
---|
193 | - Mesa changes affecting all drivers: mesa
|
---|
194 | - Hardware vendor specific code: AMD common, intel, ...
|
---|
195 | - Driver specific code: ANV, freedreno, i965, iris, radeonsi, RADV,
|
---|
196 | vc4, ...
|
---|
197 | - Other tag examples: gallium, util
|
---|
198 |
|
---|
199 | Tick the following when creating the MR. It allows developers to rebase
|
---|
200 | your work on top of main.
|
---|
201 |
|
---|
202 | ::
|
---|
203 |
|
---|
204 | Allow commits from members who can merge to the target branch
|
---|
205 |
|
---|
206 | If you revise your patches based on code review and push an update to
|
---|
207 | your branch, you should maintain a **clean** history in your patches.
|
---|
208 | There should not be "fixup" patches in the history. The series should be
|
---|
209 | buildable and functional after every commit whenever you push the
|
---|
210 | branch.
|
---|
211 |
|
---|
212 | It is your responsibility to keep the MR alive and making progress, as
|
---|
213 | there are no guarantees that a Mesa dev will independently take interest
|
---|
214 | in it.
|
---|
215 |
|
---|
216 | Some other notes:
|
---|
217 |
|
---|
218 | - Make changes and update your branch based on feedback
|
---|
219 | - After an update, for the feedback you handled, close the feedback
|
---|
220 | discussion with the "Resolve Discussion" button. This way the
|
---|
221 | reviewers know which feedback got handled and which didn't.
|
---|
222 | - Old, stale MR may be closed, but you can reopen it if you still want
|
---|
223 | to pursue the changes
|
---|
224 | - You should periodically check to see if your MR needs to be rebased
|
---|
225 | - Make sure your MR is closed if your patches get pushed outside of
|
---|
226 | GitLab
|
---|
227 | - Please send MRs from a personal fork rather than from the main Mesa
|
---|
228 | repository, as it clutters it unnecessarily.
|
---|
229 |
|
---|
230 | .. _reviewing:
|
---|
231 |
|
---|
232 | Reviewing Patches
|
---|
233 | -----------------
|
---|
234 |
|
---|
235 | To participate in code review, you can monitor the GitLab Mesa `Merge
|
---|
236 | Requests <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests>`__
|
---|
237 | page, and/or register for notifications in your GitLab settings.
|
---|
238 |
|
---|
239 | When you've reviewed a patch, please be unambiguous about your review.
|
---|
240 | That is, state either
|
---|
241 |
|
---|
242 | ::
|
---|
243 |
|
---|
244 | Reviewed-by: Joe Hacker <[email protected]>
|
---|
245 |
|
---|
246 | or
|
---|
247 |
|
---|
248 | ::
|
---|
249 |
|
---|
250 | Acked-by: Joe Hacker <[email protected]>
|
---|
251 |
|
---|
252 | Rather than saying just "LGTM" or "Seems OK".
|
---|
253 |
|
---|
254 | If small changes are suggested, it's OK to say something like:
|
---|
255 |
|
---|
256 | ::
|
---|
257 |
|
---|
258 | With the above fixes, Reviewed-by: Joe Hacker <[email protected]>
|
---|
259 |
|
---|
260 | which tells the patch author that the patch can be committed, as long as
|
---|
261 | the issues are resolved first.
|
---|
262 |
|
---|
263 | These Reviewed-by, Acked-by, and Tested-by tags should also be amended
|
---|
264 | into commits in a MR before it is merged.
|
---|
265 |
|
---|
266 | When providing a Reviewed-by, Acked-by, or Tested-by tag in a GitLab MR,
|
---|
267 | enclose the tag in backticks:
|
---|
268 |
|
---|
269 | ::
|
---|
270 |
|
---|
271 | `Reviewed-by: Joe Hacker <[email protected]>`
|
---|
272 |
|
---|
273 | This is the markdown format for literal, and will prevent GitLab from
|
---|
274 | hiding the < and > symbols.
|
---|
275 |
|
---|
276 | Review by non-experts is encouraged. Understanding how someone else goes
|
---|
277 | about solving a problem is a great way to learn your way around the
|
---|
278 | project. The submitter is expected to evaluate whether they have an
|
---|
279 | appropriate amount of review feedback from people who also understand
|
---|
280 | the code before merging their patches.
|
---|
281 |
|
---|
282 | .. _merging:
|
---|
283 |
|
---|
284 | Merging merge requests
|
---|
285 | ----------------------
|
---|
286 |
|
---|
287 | Once a merge request has been appropriately reviewed, its author can decide to
|
---|
288 | merge it.
|
---|
289 |
|
---|
290 | .. warning::
|
---|
291 | Pushing (``git push``) directly to ``main`` is forbidden. This bypasses all
|
---|
292 | the CI checks and is likely to cause issues for everyone else.
|
---|
293 |
|
---|
294 | .. warning::
|
---|
295 | Do not use the "Merge"/"Merge when pipeline succeeds"/"Set to auto-merge"
|
---|
296 | buttons.
|
---|
297 |
|
---|
298 | We use a `custom script <https://gitlab.com/marge-org/marge-bot>`__ to manage
|
---|
299 | this, triggered by **assigning the MR** to the pseudo-user `@marge-bot
|
---|
300 | <https://gitlab.freedesktop.org/marge-bot>`__.
|
---|
301 |
|
---|
302 | Authors who do not have ``Developer`` access (or above) should ask on the
|
---|
303 | merge request for someone else to do it for them, or reach on
|
---|
304 | :doc:`other channels <lists>` if the MR reviewers don't have access themselves.
|
---|
305 |
|
---|
306 | Do not merge someone else's MR unless you are sure they don't have a new
|
---|
307 | version that they are testing locally for instance.
|
---|
308 | **When in doubt, ask**, for instance by leaving a comment on that MR.
|
---|
309 |
|
---|
310 | Nominating a commit for a stable branch
|
---|
311 | ---------------------------------------
|
---|
312 |
|
---|
313 | There are several ways to nominate a patch for inclusion in the stable
|
---|
314 | branch and release. In order or preference:
|
---|
315 |
|
---|
316 | - By adding the ``Fixes:`` tag in the commit message as described above, if you are fixing
|
---|
317 | a specific commit.
|
---|
318 | - By adding the ``Cc: mesa-stable`` tag in the commit message as described above.
|
---|
319 | - By submitting a merge request against the ``staging/year.quarter``
|
---|
320 | branch on GitLab. Refer to the :ref:`instructions below <backports>`.
|
---|
321 |
|
---|
322 | Please **DO NOT** send patches to [email protected], it
|
---|
323 | is not monitored actively and is a historical artifact.
|
---|
324 |
|
---|
325 | If you are not the author of the original patch, please Cc: them in your
|
---|
326 | nomination request.
|
---|
327 |
|
---|
328 | The current patch status can be observed in the :ref:`staging
|
---|
329 | branch <stagingbranch>`.
|
---|
330 |
|
---|
331 | .. _criteria:
|
---|
332 |
|
---|
333 | Criteria for accepting patches to the stable branch
|
---|
334 | ---------------------------------------------------
|
---|
335 |
|
---|
336 | Mesa has a designated release manager for each stable branch, and the
|
---|
337 | release manager is the only developer that should be pushing changes to
|
---|
338 | these branches. Everyone else should nominate patches using the
|
---|
339 | mechanism described above. The following rules define which patches are
|
---|
340 | accepted and which are not. The stable-release manager is also given
|
---|
341 | broad discretion in rejecting patches that have been nominated.
|
---|
342 |
|
---|
343 | - Patch must conform with the :ref:`Basic guidelines <guidelines>`
|
---|
344 | - Patch must have landed in main first. In case where the original
|
---|
345 | patch is too large and/or otherwise contradicts with the rules set
|
---|
346 | within, a backport is appropriate.
|
---|
347 | - It must not introduce a regression - be that build or runtime wise.
|
---|
348 |
|
---|
349 | .. note::
|
---|
350 | If the regression is due to faulty Piglit/dEQP/CTS/other test
|
---|
351 | the latter must be fixed first. A reference to the offending test(s)
|
---|
352 | and respective fix(es) should be provided in the nominated patch.
|
---|
353 |
|
---|
354 | - Patch cannot be larger than 100 lines.
|
---|
355 | - Patches that move code around with no functional change should be
|
---|
356 | rejected.
|
---|
357 | - Patch must be a bug fix and not a new feature.
|
---|
358 |
|
---|
359 | .. note::
|
---|
360 | An exception to this rule, are hardware-enabling "features". For
|
---|
361 | example, :ref:`backports <backports>` of new code to support a
|
---|
362 | newly-developed hardware product can be accepted if they can be
|
---|
363 | reasonably determined not to have effects on other hardware.
|
---|
364 |
|
---|
365 | - Patch must be reviewed, For example, the commit message has
|
---|
366 | Reviewed-by, Signed-off-by, or Tested-by tags from someone but the
|
---|
367 | author.
|
---|
368 | - Performance patches are considered only if they provide information
|
---|
369 | about the hardware, program in question and observed improvement. Use
|
---|
370 | numbers to represent your measurements.
|
---|
371 |
|
---|
372 | If the patch complies with the rules it will be
|
---|
373 | :ref:`cherry-picked <pickntest>`. Alternatively the release
|
---|
374 | manager will reply to the patch in question stating why the patch has
|
---|
375 | been rejected or would request a backport. The stable-release manager
|
---|
376 | may at times need to force-push changes to the stable branches, for
|
---|
377 | example, to drop a previously-picked patch that was later identified as
|
---|
378 | causing a regression). These force-pushes may cause changes to be lost
|
---|
379 | from the stable branch if developers push things directly. Consider
|
---|
380 | yourself warned.
|
---|
381 |
|
---|
382 | .. _backports:
|
---|
383 |
|
---|
384 | Sending backports for the stable branch
|
---|
385 | ---------------------------------------
|
---|
386 |
|
---|
387 | By default merge conflicts are resolved by the stable-release manager.
|
---|
388 | The release maintainer should resolve trivial conflicts, but for complex
|
---|
389 | conflicts they should ask the original author to provide a backport or
|
---|
390 | denominate the patch.
|
---|
391 |
|
---|
392 | For patches that either need to be nominated after they've landed in
|
---|
393 | main, or that are known ahead of time to not not apply cleanly to a
|
---|
394 | stable branch (such as due to a rename), using a GitLab MR is most
|
---|
395 | appropriate. The MR should be based on and target the
|
---|
396 | ``staging/year.quarter`` branch, not on the ``year.quarter`` branch,
|
---|
397 | per the stable branch policy. Assigning the MR to release maintainer for
|
---|
398 | said branch or mentioning them is helpful, but not required.
|
---|
399 |
|
---|
400 | Make sure to use ``git cherry-pick -x`` when cherry-picking the commits
|
---|
401 | from the main branch. This adds the "cherry picked from commit ..." line
|
---|
402 | to the commit message, to allow the release maintainters to mark those
|
---|
403 | as backported, which in turn allows the tools to correctly report any
|
---|
404 | future ``Fixes:`` affecting the commits you backported.
|
---|
405 |
|
---|
406 | Documentation patches
|
---|
407 | ---------------------
|
---|
408 |
|
---|
409 | Our documentation is written as `reStructuredText`_ files in the
|
---|
410 | :file:`docs` folder, and built using `Sphinx`_.
|
---|
411 |
|
---|
412 | .. code-block:: sh
|
---|
413 |
|
---|
414 | # Install dependencies (adapt for your distro)
|
---|
415 | apk add coreutils graphviz py3-clang clang-dev musl-dev linux-headers
|
---|
416 | pip3 install sphinx===5.1.1 mako===1.2.3 hawkmoth===0.16.0
|
---|
417 |
|
---|
418 | # Build docs
|
---|
419 | sphinx-build -W -b html docs docs-html/
|
---|
420 |
|
---|
421 | The preferred language of the documentation is US English. This
|
---|
422 | doesn't mean that everyone is expected to pay close attention to
|
---|
423 | the different English variants, but it does mean someone might
|
---|
424 | suggest a spelling-change, either during review or as a follow-up
|
---|
425 | merge-request.
|
---|
426 |
|
---|
427 | .. _reStructuredText: https://docutils.sourceforge.io/rst.html
|
---|
428 | .. _Sphinx: https://www.sphinx-doc.org/
|
---|
429 |
|
---|
430 | Git tips
|
---|
431 | --------
|
---|
432 |
|
---|
433 | - ``git rebase -i ...`` is your friend. Don't be afraid to use it.
|
---|
434 | - Apply a fixup to commit FOO.
|
---|
435 |
|
---|
436 | .. code-block:: console
|
---|
437 |
|
---|
438 | git add ...
|
---|
439 | git commit --fixup=FOO
|
---|
440 | git rebase -i --autosquash ...
|
---|
441 |
|
---|
442 | - Test for build breakage between patches e.g last 8 commits.
|
---|
443 |
|
---|
444 | .. code-block:: console
|
---|
445 |
|
---|
446 | git rebase -i --exec="ninja -C build/" HEAD~8
|
---|