The guidelines in this file are the ideals; it's better to send a
not-fully-following-guidelines patch than no patch at all, though.  We
can always polish it up.

Mailing list
===

The D-Bus mailing list is dbus@lists.freedesktop.org; discussion
of patches, etc. should go there.

Security
===

Most of D-Bus is security sensitive.  Guidelines related to that:

 - avoid memcpy(), sprintf(), strlen(), snprintf, strlcat(),
   strstr(), strtok(), or any of this stuff. Use DBusString. 
   If DBusString doesn't have the feature you need, add it 
   to DBusString. 

   There are some exceptions, for example
   if your strings are just used to index a hash table 
   and you don't do any parsing/modification of them, perhaps
   DBusString is wasteful and wouldn't help much. But definitely 
   if you're doing any parsing, reallocation, etc. use DBusString.

 - do not include system headers outside of dbus-memory.c, 
   dbus-sysdeps.c, and other places where they are already 
   included. This gives us one place to audit all external 
   dependencies on features in libc, etc.

 - do not use libc features that are "complicated" 
   and may contain security holes. For example, you probably shouldn't
   try to use regcomp() to compile an untrusted regular expression.
   Regular expressions are just too complicated, and there are many 
   different libc's out there.

 - we need to design the message bus daemon (and any similar features)
   to use limited privileges, run in a chroot jail, and so on.

http://vsftpd.beasts.org/ has other good security suggestions.

Coding Style
===

 - The C library uses GNU coding conventions, with GLib-like
   extensions (e.g. lining up function arguments). The
   Qt wrapper uses KDE coding conventions.

 - Write docs for all non-static functions and structs and so on. try
   "doxygen Doxyfile" prior to commit and be sure there are no
   warnings printed.

 - All external interfaces (network protocols, file formats, etc.)
   should have documented specifications sufficient to allow an
   alternative implementation to be written. Our implementation should
   be strict about specification compliance (should not for example
   heuristically parse a file and accept not-well-formed
   data). Avoiding heuristics is also important for security reasons;
   if it looks funny, ignore it (or exit, or disconnect).

Development
===

D-Bus uses Git as its version control system. The main repository is
hosted at git.freedesktop.org/dbus/dbus. To clone D-Bus, execute the
following command:

    git clone git://git.freedesktop.org/dbus/dbus
OR
    git clone git.freedesktop.org:dbus/dbus

The latter form is the one that allows pushing, but it also requires
an SSH account on the server. The former form allows anonymous
checkouts.

D-Bus development happens in two branches in parallel: the current
stable branch, with an even minor number (like 1.0, 1.2 and 1.4), and
the next development branch, with the next odd number.

The stable branch is named after the version number itself (dbus-1.2,
dbus-1.4), whereas the development branch is simply known as "master".

When making a change to D-Bus, do the following:

 - check out the earliest branch of D-Bus that makes sense to have
   your change in. If it's a bugfix, it's normally the current stable
   branch; if it's a feature, it's normally the "master" branch. If
   you have an important security fix, you may want to apply to older
   branches too.

 - for large changes:
     if you're developing a new, large feature, it's recommended
     to create a new branch and do your development there. Publish
     your branch at a suitable place and ask others to help you
     develop and test it. Once your feature is considered finalised,
     you may merge it into the "master" branch.

- for small changes:
    . make your change to the source code
    . execute tests to guarantee that you're not introducing a
      regression. For that, execute: make check
      (if possible, add a new test to check the fix you're
      introducing)
    . commit your change using "git commit"
      in the commit message, write a short sentence describing what
      you did in the first line. Then write a longer description in
      the next paragraph(s).
    . repeat the previous steps if necessary to have multiple commits

 - extract your patches and send to the D-Bus mailing list for
   review or post them to the D-Bus Bugzilla, attaching them to a bug
   report. To extract the patches, execute:
     git format-patch origin/master

 - once your code has been reviewed, you may push it to the Git
   server:
     git push origin my-branch:remote
   OR
     git push origin dbus-X.Y
   OR
     git push origin master
   (consult the Git manual to know which command applies)

 - (Optional) if you've not worked on "master", merge your changes to
   that branch. If you've worked on an earlier branch than the current
   stable, merge your changes upwards towards the stable branch, then
   from there into "master".

    . execute: git checkout master
    . ensure that you have the latest "master" from the server, update
      if you don't
    . execute: git merge dbus-X.Y
    . if you have any conflicts, resolve them, git add the conflicted
      files and then git commit
    . push the "master" branch to the server as well

  Executing this merge is recommended, but not necessary for all
  changes. You should do this step if your bugfix is critical for the
  development in "master", or if you suspect that conflicts will arise
  (you're usually the best person to resolve conflicts introduced by
  your own code), or if it has been too long since the last merge.


Making a release
===

To make a release of D-Bus, do the following:

 - check out a fresh copy from Git

 - verify that the libtool versioning/library soname is 
   changed if it needs to be, or not changed if not

 - update the file NEWS based on the git history

 - update the AUTHORS file with "make update-authors" if necessary

 - the version number should have major.minor.micro, even
   if micro is 0, i.e. "1.0.0" and "1.2.0" not "1.0"/"1.2"; the micro
   version should be even for releases, and odd for intermediate snapshots

 - "make distcheck" (DO NOT just "make dist" - pass the check!)

 - if make distcheck fails, fix it.

 - once distcheck succeeds, "git commit -a".  This is the version
   of the tree that corresponds exactly to the released tarball.

 - tag the tree with "git tag -s -m 'Released X.Y.Z' dbus-X.Y.Z"
   where X.Y.Z is the version of the release.  If you can't sign
   then simply created an unsigned annotated tag:
   "git tag -a -m 'Released X.Y.Z' dbus-X.Y.Z".

 - bump the version number up in configure.ac (so the micro version is odd),
   and commit it.  Make sure you do this *after* tagging the previous
   release! The idea is that git has a newer version number
   than anything released.

 - merge the branch you've released to the chronologically-later
   branch (usually "master"). You'll probably have to fix a merge
   conflict in configure.ac (the version number).

 - push your changes and the tag to the central repository with
     git push origin master dbus-X.Y dbus-X.Y.Z

 - scp your tarball to freedesktop.org server and copy it to
   dbus.freedesktop.org:/srv/dbus.freedesktop.org/www/releases/dbus/dbus-X.Y.Z.tar.gz.
   This should be possible if you're in group "dbus"

 - Update the online documentation with `make -C doc maintainer-upload-docs`.

 - update the wiki page http://www.freedesktop.org/Software/dbus by
   adding the new release under the Download heading. Then, cut the
   link and changelog for the previous that was there.

 - update the wiki page
   http://www.freedesktop.org/Software/DbusReleaseArchive pasting the
   previous release. Note that bullet points for each of the changelog
   items must be indented three more spaces to conform to the
   formatting of the other releases there.
  
 - post to dbus@lists.freedesktop.org announcing the release.
 

After making a ".0" stable release
===

We create a branch for each stable release; sometimes the branch is
not done immediately, instead it's possible to wait until someone has
a not-suitable-for-stable change they want to make and then branch to
allow committing that change.

The branch name should be dbus-X.Y which is a branch that has
releases versioned X.Y.Z

To branch:
  git branch dbus-X.Y
and upload the branch tag to the server:
  git push origin dbus-X.Y

To develop in this branch:
  git checkout dbus-X.Y

Environment variables
===

These are the environment variables that are used by the D-Bus client library

DBUS_VERBOSE=1
Turns on printing verbose messages. This only works if D-Bus has been
compiled with --enable-verbose-mode

DBUS_MALLOC_FAIL_NTH=n
Can be set to a number, causing every nth call to dbus_alloc or
dbus_realloc to fail. This only works if D-Bus has been compiled with
--enable-tests.

DBUS_MALLOC_FAIL_GREATER_THAN=n
Can be set to a number, causing every call to dbus_alloc or
dbus_realloc to fail if the number of bytes to be allocated is greater
than the specified number. This only works if D-Bus has been compiled with
--enable-tests.

DBUS_TEST_MALLOC_FAILURES=n
Many of the D-Bus tests will run over and over, once for each malloc
involved in the test. Each run will fail a different malloc, plus some
number of mallocs following that malloc (because a fair number of bugs
only happen if two or more mallocs fail in a row, e.g. error recovery
that itself involves malloc).  This env variable sets the number of
mallocs to fail.
Here's why you care: If set to 0, then the malloc checking is skipped,
which makes the test suite a heck of a lot faster. Just run with this
env variable unset before you commit.

Tests
===

These are the test programs that are built if dbus is compiled using
--enable-tests.

dbus/dbus-test
This is the main unit test program that tests all aspects of the D-Bus
client library.

dbus/bus-test
This it the unit test program for the message bus.

test/break-loader
A test that tries to break the message loader by passing it randomly
created invalid messages.

test/name-test/*
This is a suite of programs which are run with a temporary session bus.
If your test involves multiple processes communicating, your best bet
is to add a test in here.

"make check" runs all the deterministic test programs (i.e. not break-loader).

"make lcov-check" is available if you configure with --enable-compiler-coverage
and gives a complete report on test suite coverage.

Patches
===

Please file them at http://bugzilla.freedesktop.org under component
dbus, and also post to the mailing list for discussion.  The commit
rules are:

 - for fixes that don't affect API or protocol, they can be committed
   if any one qualified reviewer other than patch author
   reviews and approves

 - for fixes that do affect API or protocol, two people
   in the reviewer group have to review and approve the commit, and 
   posting to the list is definitely mandatory

 - if there's a live unresolved controversy about a change,
   don't commit it while the argument is still raging.

 - at their discretion, members of the reviewer group may also commit
   branches/patches under these conditions:

   - the branch does not add or change API, ABI or wire-protocol

   - the branch solves a known problem and is covered by the regression tests

   - there are no objections from the rest of the review group within
     a week of the patches being attached to Bugzilla

   - the committer gets a positive review on Bugzilla from someone they
     consider qualified to review the change (e.g. a colleague with D-Bus
     experience; not necessarily a member of the reviewer group)

 - regardless of reviews, to commit a patch:
    - make check must pass
    - the test suite must be extended to cover the new code
      as much as reasonably feasible (see Tests above)
    - the patch has to follow the portability, security, and 
      style guidelines
    - the patch should as much as reasonable do one thing, 
      not many unrelated changes
   No reviewer should approve a patch without these attributes, and
   failure on these points is grounds for reverting the patch.

The reviewer group that can approve patches:

Havoc Pennington <hp@pobox.net>
Michael Meeks <michael.meeks@novell.com>
Alexander Larsson  <alexl@redhat.com>
Zack Rusin <zack@kde.org>
Joe Shaw <joe@assbarn.com>
Mikael Hallendal <micke@imendio.com>
Richard Hult <richard@imendio.com>
Owen Fraser-Green <owen@discobabe.net>
Olivier Andrieu <oliv__a@users.sourceforge.net>
Colin Walters <walters@verbum.org>
Thiago Macieira <thiago@kde.org>
John Palmieri <johnp@redhat.com>
Scott James Remnant <scott@netsplit.com>
Will Thompson <will.thompson@collabora.co.uk>
Simon McVittie <simon.mcvittie@collabora.co.uk>
David Zeuthen <davidz@redhat.com>
