Revision of the SVN Commit Policy for the change to Git and update to KDE4 only
2011-03-27 - Initial import from SVN Commit Policy 2011-03-27 - Add Introduction, partial change svn to repository, remove some KDE3 specific guidelines
KDE uses a central repository to store our source code and to track changes made. This policy outlines the expected standards when committing code to the this source code repository. Currently KDE uses both Git and Subversion (SVN) to manage the source code repository, this policy applies to both systems except where noted.
When this policy refers to commit it should be taken to mean adding code to the central repository. In Subversion this is done with the commit command, but in Git this is done with the push (the commit command in Git only adds to the local repository).
Committing something to the repository has serious consequences. All other developers will get your changes once they are in the repository, and if they break something, they will break it for everybody. All commits will be publicly available in the repository forever.
On the other hand Git and SVN allow you to revert changes, so it's possible to recover from mistakes. This is relatively easy for commits to single files but it can also be a significant amount of work for bigger changes. The baseline is: Be aware of the consequences of your commits. Take time to think about them before committing.
Compile the code and correct all errors before committing. Make sure that newly added files are committed. If they are missing your local compile will work fine but everybody else won't be able to compile.
You certainly should make sure that the code compiles with your local setup. It would also be nice if it would compile with the --enable-final option, but we don't explicitly support that.
Be especially careful if you change the build system, i.e. CMake files.
Start the application affected by your change and make sure that the changed code behaves as desired.
Run unit and regression tests, if available (make test).
Always update your local repository to the current central repository revision before you commit. Take any messages from the repository about conflicts or problems seriously. Use the repository diff utility to review the changes you will actually commit.
Do a svn update and a svn diff before committing. svn diff will tell you exactly what you will be committing. Check if that's really what you intended to commit.
Log messages should be understandable to someone who sees only the log. They shouldn't depend on information outside the context of the commit. Try to put the log messages only to those files which are really affected by the change described in the log message.
In particular put all important information which can't be seen from the diff in the log message.
When using Git you should use the default Commit Template.
This includes security (shell quoting, buffer overflows, format string vulnerabilities), binary compatibility (d pointers), i18n, usability, user interface style guide, (API) documentation, documentation and definition of memory management and ownership policies, method naming, conditions for inclusion in kdelibs, portability issues and license notices.
These policies are defined separately. If in doubt ask on the mailing list.
Among other things, it means that binary-incompatible changes (BIC) to unreleased APIs in trunk should only happen on Mondays.
Respect the policies of application and library maintainers, and consult with them before making large changes.
Source control systems are not a substitute for developer communication.
When you plan to make changes which affect a lot of different code in the repository, announce them on the mailing list in advance. For instance, changes in libraries might break other code even if they look trivial, e.g., because an application must also compile with older versions of the library for some reasons. By announcing the changes in advance, developers are prepared, and can express concerns before something gets broken.
Don't commit changes to the public API of libraries without prior review by other developers. There are certain special requirements for the public APIs of the KDE libraries, e.g., source and binary compatibility issues. Changes to the public APIs affect many other KDE developers including third party developers, so requiring a review for these changes is intended to avoid problems for the users of the APIs and to improve the quality of the APIs.
If your commit breaks something or has side effects on other code, take the responsibility to fix or help fix the problems. Don't commit something and then take a two week holiday, always leave enough time to correct any problems.
Avoid things like "I don't know why it crashes, but when I do this, it does not crash anymore." or "I'm not completely sure if that's right, but at least it works for me.".
If you don't find a solution to a problem, discuss it with other developers.
If there are disagreements over code changes, these should be resolved by discussing them on the mailing lists or in private, not by forcing code on others by simply committing the changes to the repository.
If you commit bugfixes, consider porting the fixes to other branches. Use the same comment for both the original fix and the backport, that way it is easy to see which fixes have been backported already.
For Git it is preferred to forward-port via merging. If you forward-port or back-port via cherry-pick then always use the -x option to include the original commit number in the message.
If you fix bugs reported on the bug tracking system, add the bug number to the log message. In order to keep the bug tracking system in sync with the repository, you should reference the bug report in your commits, and close the fixed bugs in the bug tracking system.
This doesn't mean that you don't need an understandable log message. It should be clear from the log message what has been changed without looking at the bug report.
There are rules for where to place release tags and branches in the repository. Official KDE branches and release will be created by the release KDE coordinator in the branches/KDE and tags/KDE directories, scripts will ensure that this folders are protected.
Developers should place all branches which are aimed to be released in branches/appname and name them like the release, e.g. branches/appname/1.5. For all release tags, tags/appname is the right place.
All temporary working branches (which should be deleted again after the work has ended) should be located in branches/work with some name describing both which part of KDE (or which application) is branched and which work is done there. A good example would be branches/work/khtml-paged for a khtml working branch to include paged media support. Bad idea would be something like branches/work/make-it-cool.
Files generated at build time shouldn't be checked into the repository because this is redundant information and might cause conflicts. Only real source files should be in SVN. An exception to that are files generated by tools that would be an unusual requirement for building KDE.
Standard tools include gcc, g++, cmake, /bin/sh, perl, moc, uic and the tools part of KDE itself. Tools needed for KDE applications written in non-C++ are allowed as well (e.g. python, ruby).
Tools which shouldn't be a requirement for building KDE include lex/flex, yacc/bison, python, ruby etc.
SVN keywords like Id or Log cause unnecessary conflicts when merging branches and don't contain any information which wouldn't be available in the SVN repository anyway.
SVN has the ability to commit more than one file at a time. Therefore, please commit all related changes in multiple files, even if they span over multiple directories at the same time in the same commit. This way, you ensure that SVN stays in a compileable state before and after the commit, that the commit history (svn log) is more helpful and that the kde-commits mailing list is not flooded with useless mails.
OTOH, commits should be preferably "atomic" - not splittable. That means that every bugfix, feature, refactoring or reformatting should go into an own commit. This, too, improves the readability of the history. Additionally, it makes porting changes between branches (cherry-picking) and finding faulty commits (by bisecting) simpler. While most KDE developers do not pay much attention to that rule, some do so very much. Consequently, you should be very careful about it when making commits in areas which you do not maintain.
Changing formatting like indenting or white spaces blows up the diff, so that it is hard to find code changes if they are mixed with re-indenting commits or similar things when looking at the logs and diffs later. Committing formatting changes separately solves this problem.
If your commit causes user visible GUI changes, add the GUI keyword to the log message. This makes sure that the documentation writers get notified of your changes.
When you commit changes to SVN you will be asked for a description of your commit. There are several special keywords defined that you can use in this description. These keywords are always uppercase.
The following keywords are pseudo-headers - they have to appear at the start of a line and be followed by a colon:
This keyword can appear anywhere on a line:
This page is maintained by Cornelius Schumacher.