Add CONTRIBUTING.md
This commit is contained in:
parent
2efaeeb887
commit
df2b913573
|
@ -7,6 +7,7 @@
|
||||||
[Features](#currently-implemented-features) ⬥
|
[Features](#currently-implemented-features) ⬥
|
||||||
[Installation](docs/INSTALL.md) ⬥
|
[Installation](docs/INSTALL.md) ⬥
|
||||||
[Configuration & Theming](#configuration--theming) ⬥
|
[Configuration & Theming](#configuration--theming) ⬥
|
||||||
|
[Contributing](docs/CONTRIBUTING.md) ⬥
|
||||||
[Screenshots](#more-screenshots)
|
[Screenshots](#more-screenshots)
|
||||||
|
|
||||||
A fancy, customizable, keyboard-operable [Matrix](https://matrix.org/) chat
|
A fancy, customizable, keyboard-operable [Matrix](https://matrix.org/) chat
|
||||||
|
@ -155,6 +156,10 @@ restarting the app.
|
||||||
|
|
||||||
GUI settings will also be implemented in the future.
|
GUI settings will also be implemented in the future.
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](docs/CONTRIBUTING.md)
|
||||||
|
|
||||||
## Screenshots
|
## Screenshots
|
||||||
|
|
||||||
![Sign-in](docs/screenshots/02-sign-in.png)
|
![Sign-in](docs/screenshots/02-sign-in.png)
|
||||||
|
@ -164,4 +169,3 @@ GUI settings will also be implemented in the future.
|
||||||
![Main pane in small window](docs/screenshots/05-main-pane-small.png)
|
![Main pane in small window](docs/screenshots/05-main-pane-small.png)
|
||||||
![Chat in small window](docs/screenshots/06-chat-small.png)
|
![Chat in small window](docs/screenshots/06-chat-small.png)
|
||||||
![Room pane in small window](docs/screenshots/07-room-pane-small.png)
|
![Room pane in small window](docs/screenshots/07-room-pane-small.png)
|
||||||
|
|
||||||
|
|
292
docs/CONTRIBUTING.md
Normal file
292
docs/CONTRIBUTING.md
Normal file
|
@ -0,0 +1,292 @@
|
||||||
|
# Contributing
|
||||||
|
|
||||||
|
- [Issues](#issues)
|
||||||
|
- [Pull Requests](#pull-requests)
|
||||||
|
- [Procedure](#procedure)
|
||||||
|
- [Commit Guidelines](#commit-guidelines)
|
||||||
|
- [Coding Conventions](#coding-conventions)
|
||||||
|
- [General](#general)
|
||||||
|
- [Python](#python)
|
||||||
|
- [QML](#qml)
|
||||||
|
- [C++](#c)
|
||||||
|
- [Resources](#resources)
|
||||||
|
- [Packaging](#packaging)
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
|
||||||
|
[Issues](https://github.com/mirukana/mirage/issues) on GitHub should be used to
|
||||||
|
ask questions, report problems, request new features,
|
||||||
|
or discuss potential changes before creating pull requests.
|
||||||
|
|
||||||
|
Before opening new issues, please search for any already open or closed
|
||||||
|
issue related to your problem, in order to prevent duplicates.
|
||||||
|
|
||||||
|
You can also join us on the
|
||||||
|
[#mirage-client:matrix.org](https://matrix.to/#/%23mirage-client:matrix.org)
|
||||||
|
room for questions and discussions.
|
||||||
|
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
For changes outside of simple bug/typo/formatting fixes, it is strongly
|
||||||
|
recommended to first discuss your ideas in a related issue or in
|
||||||
|
[#mirage-client:matrix.org](https://matrix.to/#/%23mirage-client:matrix.org).
|
||||||
|
|
||||||
|
New changes are merged to the
|
||||||
|
[`dev` branch](https://github.com/mirukana/mirage/tree/dev) first.
|
||||||
|
Once a new version of the application is released,
|
||||||
|
the current `dev` is merged into the main `master` branch.
|
||||||
|
|
||||||
|
By sending your changes, you agree to license them under the LGPL 3.0 or later.
|
||||||
|
|
||||||
|
### Procedure
|
||||||
|
|
||||||
|
Start by forking the main repository from GitHub, then
|
||||||
|
clone your fork and switch to a new branch based on `dev`, in which
|
||||||
|
you will make your changes:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --recursive https://github.com/yourUsername/mirage
|
||||||
|
cd mirage
|
||||||
|
git remote add upstream https://github.com/mirukana/mirage
|
||||||
|
git fetch upstream
|
||||||
|
git checkout upstream/dev
|
||||||
|
git branch example-branch-name
|
||||||
|
git checkout example-branch-name
|
||||||
|
```
|
||||||
|
|
||||||
|
Test and commit your changes according to the
|
||||||
|
[commit guidelines](#commit-guidelines), and `git push` to your fork's repo.
|
||||||
|
You will then be able to make a pull request by going
|
||||||
|
to the [main repo](https://github.com/mirukana/mirage).
|
||||||
|
|
||||||
|
Once your pull request is merged, you can update `dev`, and delete your
|
||||||
|
GitHub and local branch:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git fetch upstream
|
||||||
|
git checkout upstream/dev
|
||||||
|
|
||||||
|
git push -d origin example-branch-name
|
||||||
|
git branch -d example-branch-name
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure `dev` is up-to-date before creating new branches based on it.
|
||||||
|
|
||||||
|
|
||||||
|
## Commit Guidelines
|
||||||
|
|
||||||
|
Commit messages should be made in this form:
|
||||||
|
|
||||||
|
```
|
||||||
|
Title, a short summary of the changes
|
||||||
|
|
||||||
|
The body, a more detailed summary needed depending on the changes.
|
||||||
|
Explain the goal of the code, how to reproduce the bug it solves
|
||||||
|
(if this is a bug fix), any special reasoning behind the
|
||||||
|
implementation or side-effects.
|
||||||
|
```
|
||||||
|
|
||||||
|
- Write informative titles, e.g.
|
||||||
|
`TextField: fix copying selected text by Ctrl+C` instead of
|
||||||
|
`fix field bug`
|
||||||
|
(assuming `TextField` was the name of the component affected by the bug)
|
||||||
|
|
||||||
|
- Write the title in imperative form and without a period at the end,
|
||||||
|
e.g. `Fix thing` instead of `Fixed thing` or `Fixes thing.`
|
||||||
|
|
||||||
|
- The title must not exceed 50 characters
|
||||||
|
|
||||||
|
- A blank line is required between the first line summary and detailed
|
||||||
|
body, if there is one
|
||||||
|
|
||||||
|
- Lines of the body must not exceed 72 characters
|
||||||
|
|
||||||
|
- Split independent changes into separate commits,
|
||||||
|
don't combine fixes for different problems or add multiple systems forming a
|
||||||
|
complex feature all at once
|
||||||
|
|
||||||
|
- Every commit should be able to build and run the application without
|
||||||
|
obvious crashes or tracebacks
|
||||||
|
|
||||||
|
- Check for linter errors before committing by running `make test` in the
|
||||||
|
repository's root. The test tools can be installed with
|
||||||
|
`pip3 install --user -Ur requirements-dev.txt`.
|
||||||
|
|
||||||
|
- For changes that aren't yet merged in a branch of the main repo,
|
||||||
|
prefer amending or editing previous commits via git interactive rebase,
|
||||||
|
rather than adding new "fix this" commits.
|
||||||
|
This helps keeping the history clean.
|
||||||
|
|
||||||
|
|
||||||
|
## Coding Conventions
|
||||||
|
|
||||||
|
### General
|
||||||
|
|
||||||
|
- Use four space indentations, no tabs
|
||||||
|
|
||||||
|
- Use double quotes for strings, unless single quotes would avoid having to
|
||||||
|
escape quotes in the text
|
||||||
|
|
||||||
|
- Keep lines under 80 columns, the only exception for this is long URL links
|
||||||
|
that can't be broken in multiple parts
|
||||||
|
|
||||||
|
- Keep lines free from any trailing whitespace
|
||||||
|
|
||||||
|
- For function definitions, calls and list/dict/etc not fitting in
|
||||||
|
one line, keep a trailing comma on the last element:
|
||||||
|
|
||||||
|
```python3
|
||||||
|
short_function(1, 2, 3)
|
||||||
|
|
||||||
|
long_function(
|
||||||
|
long_argument_1, long_argument_1, long_argument_3, long_argument_4, # 🡐
|
||||||
|
)
|
||||||
|
|
||||||
|
large_list = [
|
||||||
|
"some long piece of text here number 1",
|
||||||
|
"some long piece of text here number 2",
|
||||||
|
"some long piece of text here number 3", # 🡐
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
- When creating new files, don't forget the copyright and license
|
||||||
|
header you see in other files of the same language.
|
||||||
|
|
||||||
|
### Python
|
||||||
|
|
||||||
|
- All functions, class attributes or top-level variables should have type hints
|
||||||
|
|
||||||
|
- Separate all top-level classes and functions by two blank lines.
|
||||||
|
For classes with many long methods, separate those methodes by two blank
|
||||||
|
lines too.
|
||||||
|
|
||||||
|
- Readability is important. Vertically align consecutive lines of assignments,
|
||||||
|
function definition arguments, dictionaries and inline comments:
|
||||||
|
|
||||||
|
```python3
|
||||||
|
# Bad:
|
||||||
|
|
||||||
|
num: int = 1 # A comment
|
||||||
|
args: List[str] = ["a", "b"] # Another comment
|
||||||
|
|
||||||
|
def func(
|
||||||
|
self,
|
||||||
|
example_argument: int = 300, # Comment
|
||||||
|
other: str = "Sample text", # Other comment
|
||||||
|
some_floats: Tuple[float, float, float] = (4.2, 1.1, 9.8),
|
||||||
|
xyz: bool = False,
|
||||||
|
things_set: Optional[Set[str]] = None,
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Good:
|
||||||
|
|
||||||
|
num: int = 1 # A comment
|
||||||
|
args: List[str] = ["a", "b"] # Another comment
|
||||||
|
|
||||||
|
def func(
|
||||||
|
self,
|
||||||
|
example_arg: int = 300, # Comment
|
||||||
|
other: str = "Sample text", # Other comment
|
||||||
|
some_floats: Tuple[float, float] = (4.2, 9.8),
|
||||||
|
xyz: bool = False,
|
||||||
|
things_set: Optional[Set[str]] = None,
|
||||||
|
) -> None:
|
||||||
|
pass
|
||||||
|
```
|
||||||
|
|
||||||
|
If this is annoying, consider getting a plugin for your editor to automate it
|
||||||
|
(e.g. [EasyAlign](https://github.com/junegunn/vim-easy-align) for vim).
|
||||||
|
|
||||||
|
- Use f-strings as long as the readability isn't impacted.
|
||||||
|
For more complex string formatting, use the shorter `%` syntax when features
|
||||||
|
special to `str.format()` aren't needed.
|
||||||
|
|
||||||
|
- Otherwise, follow the
|
||||||
|
[PEP-8 standard](https://www.python.org/dev/peps/pep-0008/)
|
||||||
|
|
||||||
|
### QML
|
||||||
|
|
||||||
|
- Don't add trailing semicolons to lines
|
||||||
|
|
||||||
|
- If an object has more than one property, always keep each property on their
|
||||||
|
own line:
|
||||||
|
|
||||||
|
```qml
|
||||||
|
Rectangle { x: 10; width: 100; height: width; color: "black" } // Bad!
|
||||||
|
|
||||||
|
Rectangle { // Good
|
||||||
|
x: 10
|
||||||
|
width: 100
|
||||||
|
height: width
|
||||||
|
color: "black"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Don't use [States](https://doc.qt.io/qt-5/qml-qtquick-state.html).
|
||||||
|
The Rectangle in the description's example could simply be written like this:
|
||||||
|
|
||||||
|
```qml
|
||||||
|
Rectangle {
|
||||||
|
width: 100
|
||||||
|
height: 100
|
||||||
|
color: mouseArea.containsPress ? "red" : "black"
|
||||||
|
|
||||||
|
MouseArea {
|
||||||
|
id: mouseArea
|
||||||
|
anchors.fill: parent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Otherwise, follow the
|
||||||
|
[QML Coding Conventions](https://doc.qt.io/qt-5/qml-codingconventions.html)
|
||||||
|
|
||||||
|
### C++
|
||||||
|
|
||||||
|
- Add C++ only if it can't easily be done in QML or Python;
|
||||||
|
or if doing it in Python requires adding a dependency while a
|
||||||
|
similar feature is already provided by Qt, feature that just needs to be
|
||||||
|
exposed with some wrapper code
|
||||||
|
([example](https://github.com/mirukana/mirage/blob/v0.6.4/src/utils.h#L31)).
|
||||||
|
|
||||||
|
- Always use `this->` to refer to methods and class attributes, explicit is
|
||||||
|
better than implicit
|
||||||
|
|
||||||
|
- Don't split modules between `.h` and `.cpp` files, this creates unnecessary
|
||||||
|
code repetition and is detrimental to performance when most functions will
|
||||||
|
contain very few lines and will only get included once before
|
||||||
|
starting the GUI.
|
||||||
|
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
Resources include background images, icons or sounds.
|
||||||
|
New resources must have a permissive license that does not require attribution.
|
||||||
|
Built-in icons must be in the SVG format. The majority of icons used in the
|
||||||
|
application come from [iconmonstr](https://iconmonstr.com).
|
||||||
|
|
||||||
|
When possible without any noticable quality loss, reduce the size of
|
||||||
|
resources and strip any metadata by using tools such as:
|
||||||
|
|
||||||
|
- `svgcleaner --allow-bigger-file --indent 4 <file> <output>` for SVG images
|
||||||
|
- `pngquant --force --speed=1 --strip <file> <output>` for PNG images
|
||||||
|
- `jpegoptim --quality 80 --strip-all <file>` for JPEG images
|
||||||
|
|
||||||
|
|
||||||
|
## Packaging
|
||||||
|
|
||||||
|
If a new package for a distribution or any other easy way
|
||||||
|
of installing the application exists, [pull request](#pull-requests) for
|
||||||
|
adding instructions to the [INSTALL.md](INSTALL.md) are welcome.
|
||||||
|
|
||||||
|
Some suggestions when creating packages:
|
||||||
|
|
||||||
|
- As the `mirage` name is sometimes already taken by other software,
|
||||||
|
prefer naming your package `mirage-im`
|
||||||
|
|
||||||
|
- Among the dependencies from the `submodules` directory, `hsluv-c` is the
|
||||||
|
only one that is still needed for building.
|
||||||
|
The other folders are kept to allow building past versions of the
|
||||||
|
application, and should be ignored.
|
Loading…
Reference in New Issue
Block a user