Skip to content

Commit 3be3316

Browse files
committed
Documentation on the code & project management process
Describes a workflow for tickets - issues and pull requests - on GitHub. This workflow uses a system of labels that help provide key at-a-glance information about the state of any ticket. In particular, the system is intended to provide unambiguous information about a ticket's: * status: a ticket's health and what stage the ticket is at in the workflow * needs: what next actions are required to move it forward The existing labels on GitHub have been renamed and regrouped to conform to this system.
1 parent 710b5d8 commit 3be3316

File tree

4 files changed

+322
-2
lines changed

4 files changed

+322
-2
lines changed

CONTRIBUTING.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ Key points:
1515
If you think you have discovered a security issue in our code, please report
1616
it **privately**, by emailing us at `[email protected]`_.
1717

18-
Please don't raise it on:
18+
Please **do not** raise it on:
1919

2020
* IRC
2121
* GitHub

docs/contributing/contributing.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ Key points:
1616
If you think you have discovered a security issue in our code, please report
1717
it **privately**, by emailing us at `[email protected]`_.
1818

19-
Please don't raise it on:
19+
Please **do not** raise it on:
2020

2121
* IRC
2222
* GitHub
2323
* either of our email lists
2424

2525
or in any other public forum until we have had a chance to deal with it.
2626

27+
.. _community-resources:
2728

2829
*********
2930
Community

docs/contributing/index.rst

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ All activity in the community is governed by our :doc:`code_of_conduct`.
2222

2323
development
2424
contributing
25+
management
2526
testing
2627
code_of_conduct
2728

docs/contributing/management.rst

+318
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,318 @@
1+
###########################
2+
Code and project management
3+
###########################
4+
5+
We use our `GitHub project <http://github.com/divio/django-cms>`_ for managing both django CMS code
6+
and development activity.
7+
8+
This document describes how we manage tickets on GitHub. By "tickets", we mean GitHub issues and
9+
pull requests (in fact as far as GitHub is concerned, pull requests are simply a species of issue).
10+
11+
******
12+
Issues
13+
******
14+
15+
Raising an issue
16+
================
17+
18+
.. ATTENTION::
19+
20+
If you think you have discovered a security issue in our code, please report
21+
it **privately**, by emailing us at `[email protected]`_.
22+
23+
Please **do not** raise it on:
24+
25+
* IRC
26+
* GitHub
27+
* either of our email lists
28+
29+
or in any other public forum until we have had a chance to deal with it.
30+
31+
Except in the case of security matters, of course, you're welcome to raise issues in any way that
32+
suits you - :ref:`on one of our email lists, or the IRC channel <community-resources>` or in person
33+
if you happen to meet another django CMS developer.
34+
35+
It's very helpful though if you don't just raise an issue by mentioning it to people, but actually
36+
file it too, and that means creating a `new issue on GitHub
37+
<https://github.com/divio/django-cms/issues/new>`_.
38+
39+
There's an art to creating a good issue report.
40+
41+
The *Title* needs to be both succint and informative. "show_sub_menu displays incorrect nodes when
42+
used with soft_root" is helpful, whereas "Menus are broken" is not.
43+
44+
In the *Description* of your report, we'd like to see:
45+
46+
* how to reproduce the problem
47+
* what you expected to happen
48+
* what did happen (a traceback is often helpful, if you get one)
49+
50+
Getting your issue accepted
51+
===========================
52+
53+
Other django CMS developers will see your issue, and will be able to comment. A core developer may
54+
add further comments, or a :ref:`label <label-reference>`.
55+
56+
The important thing at this stage is to have your issue *accepted*. This means that we've agreed
57+
it's a genuine issue, and represents something we can or are willing to do in the CMS.
58+
59+
You may be asked for more information before it's accepted, and there may be some discussion before
60+
it is. It could also be rejected as a :term:`non-issue` (it's not actually a problem) or
61+
:term:`won't fix` (addressing your issue is beyond the scope of the project, or is incompatible
62+
with our other aims).
63+
64+
Feel free to explain why you think a decision to reject your issue is incorrect - very few
65+
decisions are final, and we're always happy to correct our mistakes.
66+
67+
**********************
68+
How we process tickets
69+
**********************
70+
71+
Tickets should be:
72+
73+
* given a :ref:`status <label-status>`
74+
* marked with :ref:`needs <label-need>`
75+
* marked with a kind
76+
* marked with the components they apply to
77+
* marked with :ref:`miscellaneous other labels <label-others>`
78+
* commented
79+
80+
A ticket's *status* and *needs* are the most important of these. They tell us two key things:
81+
82+
* *status*: what stage the ticket is at
83+
* *needs*: what next actions are required to move it forward
84+
85+
Needless to say, these labels need to be applied carefully, according to the rules of this system.
86+
87+
GitHub's interface means that we have no alternative but to use colours to help identify our
88+
tickets. We're sorry about this. We've tried to use colours that will cause the fewest issues for
89+
colour-blind people, so we don't use green (since we use red) or yellow (since we use blue) labels,
90+
but we are aware it's not ideal.
91+
92+
django CMS ticket processing system rules
93+
=========================================
94+
95+
* one and only one status **must** be applied to each ticket
96+
* a healthy ticket (blue) **cannot** have any :ref:`critical needs <label-need-critical>` (red)
97+
* when closed, tickets **must** have either a healthy (blue) or dead (black) status
98+
* a ticket with :ref:`critical needs <label-need-critical>` **must not** have :ref:`non-critical
99+
needs <label-need-non-critical>` or :ref:`miscellaneous other <label-others>` labels
100+
* :term:`has patch` and :term:`on hold` labels imply a related pull request, which **must** be
101+
linked-to when these labels are applied
102+
* *component*, :ref:`non-critical need <label-need-non-critical>` and :ref:`miscellaneous other
103+
<label-others>` labels should be applied as seems appropriate
104+
105+
Status
106+
======
107+
108+
The first thing we do is decide whether we accept the ticket, whether it's a pull request or an
109+
issue. An accepted status means the ticket is healthy, and will have a blue label.
110+
111+
Basically, it's good for open tickets to be healthy (blue), because that means they are going
112+
somewhere.
113+
114+
.. IMPORTANT::
115+
Accepting a ticket means marking it as healthy, with one of the blue labels.
116+
117+
issues
118+
The bar for :term:`status: accepted <accepted>` is high. The status can be revoked at any
119+
time, and should be when appropriate. If the issue needs a :term:`design decision`,
120+
:term:`expert opinion` or :term:`more info`, it can't be *accepted*.
121+
122+
pull requests
123+
When a pull request is accepted, it should become :term:`work in progress` or (more rarely)
124+
:term:`ready for review` or even :term:`ready to be merged`, in those rare cases where a
125+
perfectly-formed and unimprovable pull request lands in our laps. As for issues, if it
126+
needs a :term:`design decision`, :term:`expert opinion` or :term:`more info`, it can't be
127+
accepted.
128+
129+
**No issue or pull request can have both a blue (accepted) and a red, grey or black label
130+
at the same time.**
131+
132+
Preferably, the ticket should either be accepted (blue), rejected (black) or marked as having
133+
critical needs (red) *as soon as possible*. It's important that open tickets should have a clear
134+
status, not least for the sake of the person who submitted it so that they know it's being assessed.
135+
136+
Tickets should not be allowed to linger indefinitely with critical (red) needs. If the opinions or
137+
information required to accept the ticket are not forthcoming, the ticket should be declared
138+
unhealthy (grey) with :term:`marked for rejection` and rejected (black) at the next release.
139+
140+
Needs
141+
=====
142+
143+
Critical needs (red) affect status.
144+
145+
:ref:`label-need-non-critical` labels (pink) can be added as appropriate (and of course, removed
146+
as work progresses) to pull requests.
147+
148+
It's important that open tickets should have a clear needs labels, so that it's apparent what needs
149+
to be done to make progress with it.
150+
151+
Kinds and components
152+
====================
153+
154+
Of necessity, these are somewhat porous categories. For example, it's not always absolutely clear
155+
whether a pull request represents an enhancement or a bug-fix, and tickets can apply to multiple
156+
parts of the CMS - so do the best you can with them.
157+
158+
Other labels
159+
============
160+
161+
:term:`backport`, :term:`blocker`, :term:`has patch` or :term:`easy pickings` labels should be applied as appropriate, to healthy (blue) tickets only/
162+
163+
Comments
164+
========
165+
166+
At any time, people can comment on the ticket, of course. Although only core maintainers can change
167+
labels, anyone can suggest changing a label.
168+
169+
.. _label-reference:
170+
171+
***************
172+
Label reference
173+
***************
174+
175+
*Components* and *kinds* should be self-explanatory, but :ref:`statuses <label-status>`,
176+
:ref:`needs <label-need>` and :ref:`miscellaneous other labels <label-others>` are clarified below.
177+
178+
.. _label-status:
179+
180+
Statuses
181+
========
182+
183+
A ticket's *status* is its position in the pipeline - its point in our workflow.
184+
185+
Every issue should have a status, and be given one as soon as possible. **An issue should have only
186+
one status applied to it**.
187+
188+
Many of these statuses apply equally well to both issues and pull requests, but some make sense
189+
only for one or the other
190+
191+
.. glossary::
192+
193+
accepted
194+
(issues only) The issue has been accepted as a genuine issue that needs to be addressed.
195+
Note that it doesn't necessarily mean we will do what the issue suggests, if it makes a
196+
suggestion - simply that we agree that there is an issue to be resolved.
197+
198+
non-issue
199+
The issue or pull request are in some way mistaken - the 'problem' is in fact correct and
200+
expected behaviour, or the problems were caused by (for example) misconfiguration.
201+
202+
When this label is applied, an explanation must be provided in a comment.
203+
204+
won't fix
205+
The issue or pull request imply changes to django CMS's design or behaviour that the core
206+
team consider incompatible with our chosen approach.
207+
208+
When this label is applied, an explanation must be provided in a comment.
209+
210+
marked for rejection
211+
We've been unable to reproduce the issue, and it has lain dormant for a long time. Or, it's
212+
a pull request of low significance that requires more work, and looks like it might have
213+
been abandoned. These tickets will be closed when we make the next release.
214+
215+
When this label is applied, an explanation must be provided in a comment.
216+
217+
work in progress
218+
(pull requests only) Work is on-going.
219+
220+
The author of the pull request should include "(work in progress)" in its title, and remove
221+
this when they feel it's ready for final review.
222+
223+
ready for review
224+
(pull requests only) The pull request needs to be reviewed. (Anyone can review and make
225+
comments recommending that it be merged (or indeed, any further action) but only a core
226+
maintainer can change the label.)
227+
228+
ready to be merged
229+
(pull requests only) The pull request has successfully passed review. Core maintainers
230+
should not mark their own code, except in the simplest of cases, as *ready to be merged*,
231+
nor should they mark any code as *ready to be merged* and then merge it themselves - there
232+
should be another person involved in the process.
233+
234+
When the pull request is merged, the label should be removed.
235+
236+
.. _label-need:
237+
238+
Needs
239+
=====
240+
241+
If an issue or pull request lacks something that needs to be provided for it to progress further,
242+
this should be marked with a "needs" label. A "needs" label indicates an *action* that should
243+
be taken in order to advance the item's status.
244+
245+
.. _label-need-critical:
246+
247+
Critical needs
248+
--------------
249+
250+
*Critical needs* (red) mean that a ticket is 'unhealthy' and won't be :term:`accepted`
251+
(issues) or :term:`work in progress`, :term:`ready for review` or :term:`ready to be merged` until
252+
those needs are addressed. In other words, no ticket can have both a blue and a red label.)
253+
254+
.. glossary::
255+
256+
more info
257+
Not enough information has been provided to allow us to proceed, for example to reproduce a
258+
bug or to explain the purpose of a pull request.
259+
260+
expert opinion
261+
The issue or pull request presents a technical problem that needs to be looked at by a
262+
member of the core maintenance team who has a special insight into that particular aspect
263+
of the system.
264+
265+
design decision
266+
The issue or pull request has deeper implications for the CMS, that need to be considered
267+
carefully before we can proceed further.
268+
269+
.. _label-need-non-critical:
270+
271+
Non-critical needs
272+
------------------
273+
274+
A healthy (blue) ticket can have non-critical needs:
275+
276+
.. glossary::
277+
278+
patch
279+
(issues only) The issue has been given a *status: accepted*, but now someone needs to write
280+
the patch to address it.
281+
282+
tests
283+
docs
284+
(pull requests only) Code without docs or tests?! In django CMS? No way!
285+
286+
.. _label-others:
287+
288+
Other
289+
=====
290+
291+
.. glossary::
292+
293+
has patch
294+
(issues only) A patch intended to address the issue exists. This doesn't imply that the
295+
patch will be accepted, or even that it contains a viable solution.
296+
297+
When this label is applied, a comment should cross-reference the pull request(s) containing
298+
the patch.
299+
300+
easy pickings
301+
An easy-to-fix issue, or an easy-to-review pull request - newcomers to django CMS
302+
development are encouraged to tackle *easy pickings* tickets.
303+
304+
blocker
305+
We can't make the next release without resolving this issue.
306+
307+
backport
308+
Any patch will should be backported to a previous release, either because it has security
309+
implications or it improves documentation.
310+
311+
on hold
312+
(pull requests only) The pull request has to wait for a higher-priority pull request to land
313+
first, to avoid complex merges or extra work later. Any *on hold* pull request is by
314+
definition :term:`work in progress`.
315+
316+
When this label is applied, a comment should cross-reference the other pull request(s).
317+
318+

0 commit comments

Comments
 (0)