Thanks for your interest in Sonata projects!
This document is about issues and pull requests.
First, check if you are up to date: is your version still supported, and are you using the latest patch version?
GitHub Issues is for issues, as opposed to question on how to use Sonata.
If you are not sure this is a bug, or simply want to ask such a question,
please post your question on Stack Overflow,
using the sonata
tags.
If you happen to find a bug, we kindly request you report it. However, before submitting it, please check the project documentation available online.
Then, if it appears that it is indeed a real bug, you may report it using Github by following these points are taken care of:
-vvv
option to get a stack trace.NOTE: Don't hesitate to give as much information as you can (OS, PHP version, extensions...)
All the sonata team will be glad to review your code changes propositions! :smile:
But please, read the following before.
Each project follows PSR-1, PSR-2 and Symfony Coding Standards for coding style, PSR-4 for autoloading.
Please install PHP Coding Standard Fixer and run this command before committing your modifications:
php-cs-fixer fix --verbose
The documentation is mostly written with the rst
format, and can be found in the Resources/doc
directory.
You can test the doc rendering with the make docs
command, but to do this, you will need Sphinx.
Just like php dependencies can be managed with Composer, python dependencies can be managed with pip.
To get sphinx, simply run the following command.
pip install --requirement Resources/doc/requirements.txt --user
Some python binaries should be downloaded to ~/.local/bin
for Linux or ~/Library/Python/2.7/bin
for Mac OS,
modify your $PATH
environment variable
so that it contains this path and then, from the root of the project, run make docs
If make docs
is successful, you should be able to see your modifications:
$YOUR_FAVORITE_BROWSER Resources/doc/_build/html/index.html
If your PR contains a new feature, you must add documentation for it. Of course, you can also create PRs consisting only in documentation changes.
Documentation contributions should comply with the Symfony documentation standards.
If your PR contains a fix, tests should be added to prove the bug.
If your PR contains an addition, a new feature, this one has to be fully covered by tests.
Some rules have to be respected about the test:
@covers
@coversDefaultClass
@coversNothing
@codeCoverageIgnore
@codeCoverageIgnoreStart
@codeCoverageIgnoreEnd
test
. Example: public function testItReturnsNull()
.@test
annotation is prohibited.Test
.@expectedException*
annotations are prohibited. Use PHPUnit_Framework_TestCase::setExpectedException()
.Since version 4.5, PHPUnit requires and integrates the phpspec/prophecy. Historically, Sonata has been using the built-in test doubles implementation, but has decided to move to Prophecy, which is more concise than its built-in counterpart is most cases. This means the current Sonata codebase currently uses both implementations. If you want to contribute a test that uses test doubles, please follow these rules :
Ideally, a Pull Request should concern one and only one subject, so that it remains clear, and independent changes can be merged quickly.
If you want to fix a typo and improve the performance of a process, you should try as much as possible to do it in a separate PR, so that we can quickly merge one while discussing the other.
The goal is to have a clear commit history and make a possible revert easier.
If you found an issue/typo while writing your change that is not related to your work, please do another PR for that. In some rare cases, you might be forced to do it on the same PR. In this kind of situation, please add a comment on your PR explaining why you feel it is the case.
For each PR, a change log must be provided.
There are few cases where no change log is necessary:
Do not edit the CHANGELOG.md
directly though, because having every
contributor write PR with changes in the same file, at roughly the same line is
a recipe for conflicts. Instead, fill in the dedicated section that should
appear in a textaread when submitting your PR.
Your note can be put on one of these sections:
Added
for new features.Changed
for changes in existing functionality.Deprecated
for deprecation of features that will be removed in next major release.Removed
for deprecated features removed in this release.Fixed
for any bug fixes.Security
to invite users to upgrade in case of vulnerabilities.More information about the followed changelog format: keepachangelog.com
Before writing a PR, you have to check on which branch your changes should be based.
Each project follows semver convention for release management.
Here is a short table resuming on which you have to start:
Kind of modification | Backward Compatible (BC) | Type of release | Branch to target | Label |
---|---|---|---|---|
Bug fixes | Yes | Patch | 3.x |
|
Bug fixes | Not on legacy | Patch | 3.x |
|
Bug fixes | No (Only if no choice) | Major | master |
|
Feature | Yes | Minor | 3.x |
|
Feature | No (Only if no choice) | Major | master |
|
Deprecation | Yes (Have to) | Minor | 3.x |
|
Deprecation removal | No (Can't be) | Major | master |
Notes:
3.x
is the branch of the latest stable patch releases and
has to be used for Backward Compatible bug fixes only.3.x
is the branch of the latest stable minor release and
has to be used for Backward compatible enhancement PRs.
No bug fix will be accepted here, except if the bug fix concerns 3.x
and only this one.
Bug fixes merged on 3.x
will be ported on other branches by fallback merging.master
branch which removes the deprecated code.If you have a non-BC PR to propose, please try to create a related BC PR first.
This BC PR should mark every piece of code that needs to be removed / uncommented / reworked
in the corresponding non-BC PR with the following marker comment : NEXT_MAJOR
.
When the BC PR is merged in the stable branch, wait for the stable branch to be
merged in the unstable branch, and then work on your non-BC PR.
For instance, assuming you want to introduce a new method to an existing interface, you should do something like this:
<?php
namespace Foo;
interface BarInterface
{
/**
* NEXT_MAJOR: Uncomment this method
*
* This method does useful stuff.
*/
// public function usefulMethod();
// …
}
In some cases, you will have the possibility to warn the user that things will change, and recommend a new way of doing things. You can do so by triggering the dedicated kind of error, like this:
<?php
if (/* some condition showing the user is using the legacy way */) {
@trigger_error(
'The '.__METHOD__.' method is deprecated since 42.x, to be removed in 43.0. '.
'Use FooClass::barMethod() instead.',
E_USER_DEPRECATED
);
} else {
// new way of doing things
}
Additionally, and when applicable, you must use the @deprecated
tag on classes or methods you wish to deprecate,
along with a message directed at the end user (as opposed to other contributors).
/**
* NEXT_MAJOR: remove this method
*
* @deprecated since 3.x, to be removed in 4.0. Use Foo::bar instead.
*/
public function baz()
{
}
In that case, unit tests might show your deprecation notice. You must mark such tests with the @group legacy
annotation,
and if need be, isolate them in a new test method that can simply be removed in the non-BC PR.
Be aware that pull requests with BC breaks could be rejected or postponed to next major release if BC is not possible.
If you are not sure what should be done, don't hesitate to open an issue about your PR project.
Sonata is a big project with many contributors, and a big part of the job is being able to understand the code at all times, be it when submitting a PR or looking at the history. Good commit messages are crucial to achieve this goal.
There are already a few articles (or even single purpose websites) about this, we cannot recommend enough the following:
To sum them up, the commit message has to be crystal clear and of course, related to the PR content.
The first line of the commit message must be short, keep it under 50 characters. It must say concisely but precisely what you did. The other lines, if needed, should contain a complete description of why you did this.
Bad commit message subject:
Update README.md
Good commit message subject :
Document how to install the project
Also, when you specify what you did avoid commit message subjects with "Fix bug in such and such feature". Saying you are fixing something implies the previous implementation was wrong and yours is right, which might not even be true. Instead, state unquestionable technical facts about your changes, not opinions. Then, in the commit description, explain why you did that and how it fixes something.
call foo::bar() instead of bar::baz()
This fixes a bug that arises when doing this or that, because baz() needs a
flux capacitor object that might not be defined.
Fixes #42
The description is optional but strongly recommended. It could be asked by the team if needed. PR will often lead to complicated, hard-to-read conversations with many links to other web pages.
The commit description should be able to live without what is said in the PR, and should ideally sum it up in a crystal clear way, so that people do not have to open a web browser to understand what you did. Links to PRs/Issues and external references are of course welcome, but should not be considered enough. When you reference an issue, make sure to use one of the keywords described in the dedicated github article.
Good commit message with description :
Change web UI background color to pink
This is a consensus made on #4242 in addition to #1337.
We agreed that blank color is boring and so deja vu. Pink is the new way to do.
(Obviously, this commit is fake. :wink:)
Grooming a PR until it is ready to get merged is a contribution by itself. Indeed, why contribute a PR if there are hundreds of PRs already waiting to get reviewed and hopefully, merged? By taking up this task, you will try to speed up this process by making sure the merge can be made with peace of mind.
Before doing anything refrain to dive head-first in the details of the PR and try to see the big picture, to understand the subject of the PR. If the PR fixes an issue, read the issue first. This is to avoid the pain of making a reviewer rework their whole PR and then not merging it.
Things to hunt for :
master
branch is used.data
, result
, WhateverManager
, SomethingService
?
Are exception names still meaningful if you remove the Exception
suffix? Do all
exceptions have a custom message?
Is the contributor trying to be clever or to be clear?new
keyword or a static call?Leave no stone unturned. When in doubt, ask for a clarification. If the clarification seems useful, and does not appear in a code comment or in a commit message, say so and / or make use a squash-merge to customize the commit message. Ideally, the project history should be understandable without an internet connection, and the PR should be understandable without having a look at the changes.
Also, make sure your feedback is actionable, it is important to keep the ball rolling, so if you raise a question, try to also provide solutions.
Applying labels requires write access to PRs, but you can still advise if you do not have them. There are several labels that will help determine what the next version number will be. Apply the first label that matches one of this conditions, in that order:
major
: there is a BC-break. The PR should target the master
branch.minor
: there is a backwards-compatible change in the API. The PR should target the stable branch.patch
: this fixes an issue (not necessarily reported). The PR should target the stable branch.docs
: this PR is solely about the docs. pedantic
is implied.pedantic
: this change does not warrant a release.Also if you see that the PR lacks documentation, tests, a changelog note, or an upgrade note, use the appropriate label.
If there are several commits in a PR, make sure you review it commit by commit, so that you can check the commit messages, and make sure the commit are independent and atomic.
Do not merge something you wrote yourself. Do not merge a PR you reviewed alone, instead, merge PRs that have already be reviewed and approved by another reviewer. If the commit history is unclear or irrelevant, prefer the "Squash and merge" feature, otherwise, always use the "Rebase and merge" feature. And finally, use your common sense : if you see a PR about a typo, or if there is a situation (faulty commit, revert needed) maybe you can merge it directly.
Thank them for contributing. Encourage them if you feel this is going to be long. In short, try to make them want to contribute again. If they are stuck, try to provide them with code yourself, or ping someone who can help.