Home | History | Annotate | Download | only in source
      1 .. _chapter-contributing:
      2 
      3 ============
      4 Contributing
      5 ============
      6 
      7 We welcome contributions to Ceres, whether they are new features, bug
      8 fixes or tests. The Ceres `mailing
      9 <http://groups.google.com/group/ceres-solver>`_ list is the best place
     10 for all development related discussions. Please consider joining
     11 it. If you have ideas on how you would like to contribute to Ceres, it
     12 is a good idea to let us know on the mailing list before you start
     13 development. We may have suggestions that will save effort when trying
     14 to merge your work into the main branch. If you are looking for ideas,
     15 please let us know about your interest and skills and we will be happy
     16 to make a suggestion or three.
     17 
     18 We follow Google's `C++ Style Guide
     19 <http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml>`_ and
     20 use `git <http://git-scm.com/>`_ for version control. We use the
     21 `Gerrit <https://ceres-solver-review.googlesource.com/>`_ to collaborate and
     22 review changes to Ceres. Gerrit enables pre-commit reviews so that
     23 Ceres can maintain a linear history with clean, reviewed commits, and
     24 no merges.
     25 
     26 We now describe how to set up your development environment and submit
     27 a change list for review via Gerrit.
     28 
     29 Setting up your Environment
     30 ===========================
     31 
     32 1. Download and configure ``git``.
     33 
     34    * Mac ``brew install git``.
     35    * Linux ``sudo apt-get install git``.
     36    * Windows. Download `msysgit
     37      <https://code.google.com/p/msysgit/>`_, which includes a minimal
     38      `Cygwin <http://www.cygwin.com/>`_ install.
     39 
     40 2. Sign up for `Gerrit
     41    <https://ceres-solver-review.googlesource.com/>`_. You will also
     42    need to sign the Contributor License Agreement (CLA) with Google,
     43    which gives Google a royalty-free unlimited license to use your
     44    contributions. You retain copyright.
     45 
     46 3. Clone the Ceres Solver ``git`` repository from Gerrit.
     47 
     48    .. code-block:: bash
     49 
     50       git clone https://ceres-solver.googlesource.com/ceres-solver
     51 
     52 
     53 4. Build Ceres, following the instructions in
     54    :ref:`chapter-building`.
     55 
     56    On Mac and Linux, the ``CMake`` build will download and enable
     57    the Gerrit pre-commit hook automatically. This pre-submit hook
     58    creates `Change-Id: ...` lines in your commits.
     59 
     60    If this does not work OR you are on Windows, execute the
     61    following in the root directory of the local ``git`` repository:
     62 
     63    .. code-block:: bash
     64 
     65       curl -o .git/hooks/commit-msg https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg
     66       chmod +x .git/hooks/commit-msg
     67 
     68 5. Configure your Gerrit password with a ``.netrc`` (Mac and Linux)
     69    or ``_netrc`` (Windows) which allows pushing to Gerrit without
     70    having to enter a very long random password every time:
     71 
     72    * Sign into `http://ceres-solver-review.googlesource.com
     73      <http://ceres-solver-review.googlesource.com>`_.
     74 
     75    * Click ``Settings -> HTTP Password -> Obtain Password``.
     76 
     77    * (maybe) Select an account for multi-login. This should be the
     78      same as your Gerrit login.
     79 
     80    * Click ``Allow access`` when the page requests access to your
     81      ``git`` repositories.
     82 
     83    * Copy the contents of the ``netrc`` into the clipboard.
     84 
     85      - On Mac and Linux, paste the contents into ``~/.netrc``.
     86 
     87      - On Windows, by default users do not have a ``%HOME%``
     88        setting.
     89 
     90 
     91        Executing ``setx HOME %USERPROFILE%`` in a terminal will set up
     92        the ``%HOME%`` environment variable persistently, and is used
     93        by ``git`` to find ``%HOME%\_netrc``.
     94 
     95        Then, create a new text file named ``_netrc`` and put it in
     96        e.g. ``C:\Users\username`` where ``username`` is your user
     97        name.
     98 
     99 
    100 Submitting a change
    101 ===================
    102 
    103 1. Make your changes against master or whatever branch you
    104    like. Commit your changes as one patch. When you commit, the Gerrit
    105    hook will add a `Change-Id:` line as the last line of the commit.
    106 
    107    Make sure that your commit message is formatted in the `50/72 style
    108    <http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html>`_.
    109 
    110 2. Push your changes to the Ceres Gerrit instance:
    111 
    112    .. code-block:: bash
    113 
    114       git push origin HEAD:refs/for/master
    115 
    116    When the push succeeds, the console will display a URL showing the
    117    address of the review. Go to the URL and add atleast one of the
    118    maintainers (Sameer Agarwal, Keir Mierle, or Alex Stewart) as reviewers.
    119 
    120 3. Wait for a review.
    121 
    122 4. Once review comments come in, address them. Please reply to each
    123    comment in Gerrit, which makes the re-review process easier. After
    124    modifying the code in your ``git`` instance, *don't make a new
    125    commit*. Instead, update the last commit using a command like the
    126    following:
    127 
    128    .. code-block:: bash
    129 
    130       git commit --amend -a
    131 
    132    This will update the last commit, so that it has both the original
    133    patch and your updates as a single commit. You will have a chance
    134    to edit the commit message as well. Push the new commit to Gerrit
    135    as before.
    136 
    137    Gerrit will use the ``Change-Id:`` to match the previous commit
    138    with the new one. The review interface retains your original patch,
    139    but also shows the new patch.
    140 
    141    Publish your responses to the comments, and wait for a new round
    142    of reviews.
    143