First cut at development guide
parent
c57baa1f11
commit
edab99d3df
@ -0,0 +1,182 @@
|
||||
Development Guide
|
||||
=================
|
||||
|
||||
Consider any rules here *reasonably soft* and significantly at your discretion.
|
||||
Do not let a rule prevent you from accomplishing something: work on the
|
||||
principle that it is easier to ask forgiveness than permission.
|
||||
|
||||
|
||||
Layering
|
||||
--------
|
||||
|
||||
The repository contains two projects that were developed in tandem primarily
|
||||
due to historical incident. Early development was accelerated by working in one
|
||||
repository, and while components like ``setup.py`` and the test framework are
|
||||
presently shared, the ``ansible_mitogen`` and ``mitogen`` packages are still
|
||||
logically independent.
|
||||
|
||||
The ``ansible_mitogen`` package should depend on the ``mitogen`` package,
|
||||
however the ``mitogen`` package must not depend on the ``ansible_mitogen``
|
||||
package.
|
||||
|
||||
|
||||
Code Style
|
||||
----------
|
||||
|
||||
Try to conform to house style, but also note there is no precise house style.
|
||||
Working code trumps all other concerns.
|
||||
|
||||
That aside, some general ideas:
|
||||
|
||||
* Vaguely PEP-8ish overall
|
||||
* Black-like use of explicit parenthesis to break up lines and expressions that
|
||||
would otherwise wrap
|
||||
* Typically max 80 column lines. Code that cannot be diffed side-by-side by a
|
||||
semi-blind person on a small laptop display without wrapping will likely be
|
||||
reformatted
|
||||
* One import per line, with imports sorted and grouped except where wrapped in
|
||||
a control structure
|
||||
* ``from .. import ..`` for package-internal imports only, use extremely
|
||||
sparingly for non-module imports. Unless creating a distinct name for an
|
||||
object is explicitly desired, prefer avoiding aliases (``from foo.bar import
|
||||
somefunc``) if possible
|
||||
* Functions generally should try to avoid exceeding 48 lines in length, except
|
||||
where there may be good reason to, such as inlining code used in a hot loop
|
||||
* Try to keep every function documented, and tweak the documentation if a
|
||||
change modifies the semantics of the function
|
||||
* Try to avoid if/else spaghetti in any single function or across a set of functions
|
||||
* Try to aggressively split out large sub-functions into their own functions
|
||||
* If adding or removing some public function or class, ensure the ``docs/``
|
||||
documentation is updated to match
|
||||
* Almost all material changes should include a changelog entry
|
||||
|
||||
|
||||
Repository Layout
|
||||
-----------------
|
||||
|
||||
The repository is developed in "traditional Git" style, there is no requirement
|
||||
for every change to have an associated pull request, except where it is
|
||||
desirable to trigger GitHub features such as CI or to request review.
|
||||
|
||||
It is expected that Git is used as it were designed, as a graph of patches each
|
||||
having their own permanent identity and ancestry, and that they may flow freely
|
||||
across branches, in a primarily command-line driven workflow.
|
||||
|
||||
|
||||
Branches
|
||||
--------
|
||||
|
||||
The following branches exist:
|
||||
|
||||
* ``master``: development branch for the latest major (0.3 as of writing) series
|
||||
* ``stable``: release branch for the latest major series
|
||||
* ``0.2``: development branch for the 0.2 series
|
||||
* ``0.2-stable``: release branch for the 0.2 series
|
||||
|
||||
|
||||
Commit Messages
|
||||
---------------
|
||||
|
||||
Where possible, prefer to include any associated ticket number in commit
|
||||
messages, prefixed with ``ticket #123``. For example, instead of:
|
||||
|
||||
``fix crash in WidgetClass``
|
||||
|
||||
Write:
|
||||
|
||||
``ticket #22: fix crash in WidgetClass``
|
||||
|
||||
This allows straightforward use of ``git blame`` and ``git log`` to immediately
|
||||
discover the reason and history behind some change. It also avoids the creating
|
||||
a dedicated pull request and merge for each small change to track the
|
||||
relationship between commits and tickets, and allows tagging a ticket after any
|
||||
PR for it has already been merged.
|
||||
|
||||
|
||||
Commit Descriptions
|
||||
-------------------
|
||||
|
||||
Feel free to use commit message bodies to communicate sundry information about
|
||||
a change that is not permanent enough to be a comment, but still of historical
|
||||
value. These bodies are distinctly separate from what may appear in a ticket as
|
||||
one is user-facing and the other is developer-facing.
|
||||
|
||||
|
||||
Revision History
|
||||
----------------
|
||||
|
||||
Prefer preserving full history of your changes, as this allows precise use of
|
||||
most Git tooling (particularly ``blame``, ``cherry-pick`` and ``revert``).
|
||||
|
||||
Feel free to partially squash away meaningless related changes using ``git
|
||||
rebase`` prior to merging to another branch such as the main development
|
||||
branch, but avoid this after the changes have been merged somewhere where they
|
||||
are or likely will become part of the permanent repository history.
|
||||
|
||||
|
||||
Documentation Branch
|
||||
--------------------
|
||||
|
||||
In order to avoid running CI for documentation changes and tweaks, the
|
||||
documentation is built from the ``docs-master`` branch. This branch often drifts
|
||||
away from ``master``, but usually just requires a quick merge to bring things
|
||||
back to normal.
|
||||
|
||||
The documentation branch semantics are that it contains whatever it makes sense
|
||||
to display on the web. There is no enforced relationship between it and master,
|
||||
except that whatever it contains should eventually end up back on ``master``.
|
||||
|
||||
Automation rebuilds and publishes the ``docs-master`` branch on each commit.
|
||||
|
||||
Use your discretion if you decide to bypass CI and commit to ``docs-master``
|
||||
directly, but if you do, ensure the changes eventually make it back on to
|
||||
``master``.
|
||||
|
||||
|
||||
Merging to a development branch
|
||||
-------------------------------
|
||||
|
||||
If you can commit directly to the repository, you have been entrusted with the
|
||||
ability to merge to the development branch at your discretion, so long as tests
|
||||
are passing and you believe your change to be good.
|
||||
|
||||
* Adding extensive new functionality should have some accompanying tests, or
|
||||
existing tests augmented to tickle the new functionality
|
||||
|
||||
* Request review using a PR from another contributor if you have some doubt
|
||||
about a change
|
||||
|
||||
Consider requesting review where a change:
|
||||
|
||||
* Breaks any interface, either API or user-exposed interface
|
||||
|
||||
* Changes compatibility
|
||||
|
||||
* Increases dependencies
|
||||
|
||||
|
||||
Release Process
|
||||
---------------
|
||||
|
||||
1. Ensure Changelog is completely up to date with all major changes made since
|
||||
the prior release. Use ``git log master..stable`` to determine which commits
|
||||
may be missing.
|
||||
2. Merge any documentations up to ``docs-master`` branch, and verify
|
||||
``docs-master`` is not carrying any changes that are not on ``master``.
|
||||
2. `Update __init.py__ <https://github.com/dw/mitogen/commit/153d79b878f6be55bcae63b35bf2b21f545820af>`_
|
||||
3. Create PR for appropriate stable branch and get it reviewed by another maintainer
|
||||
4. Merge the PR
|
||||
5. ``git stash``
|
||||
6. ``git checkout stable``
|
||||
7. ``git pull``
|
||||
8. ``git reset --hard origin/stable``
|
||||
9. ``git tag v0.3.123 -a "Mitogen v0.3.123"`` -- tags must be annotated
|
||||
10. ``git push --tags``
|
||||
11. ``python setup.py sdist bdist_wheel``
|
||||
12. [TBD] https://github.com/mitogen-hq/mitogen/issues/771
|
||||
13. ``twine upload dist/*.{tar.gz,whl}``
|
||||
|
||||
Mailing list:
|
||||
|
||||
1. Run ``python scripts/release-notes.py 0.3.123`` and copy its output
|
||||
2. [TBD]
|
Loading…
Reference in New Issue