================================
Contributing to Apache Clownfish
================================

MAKE A PLAN:

  Clownfish is developed by the Apache Lucy community.

    http://lucy.apache.org/

  If you propose to make non-trivial changes to Clownfish, especially changes
  to the public API, send a note to the Lucy developer's list describing your
  plans:

    http://lucy.apache.org/mailing_lists.html
  
GET THE CODE:

  Clownfish's codebase is available via Git from git-wip-us.apache.org.  Start
  by creating a clone of the repository:

    git clone https://git-wip-us.apache.org/repos/asf/lucy-clownfish.git

  There is also a mirror on Github.

    https://github.com/apache/lucy-clownfish

  Follow the instructions in INSTALL to set up your local workspace.

MAKE CHANGES:

  Edit the source code as you see fit, then build and run tests.

  Please bear the following in mind:

    * All code will eventually need to be portable to multiple operating
      systems and compilers. (This is a complex requirement and it should not
      block your contribution.)
    * All public APIs must be documented.
    * Code should be formatted according to the style guidelines at
      <http://wiki.apache.org/lucy/LucyStyleGuide>.
    * All unit tests must pass.
    * New code needs to be accompanied by new unit tests.
    * Simplicity, both in terms of API and implementation, is highly valued
      within the Lucy development community; the simpler the contribution, the
      more quickly it can be reviewed and integrated. 

OPEN AN ISSUE:

  Clownfish uses Lucy's issue-tracker/bug-tracker installation, which runs
  Atlassian JIRA.  We generally use the term "issue" rather than "bug" because
  not every contribution fixes a "bug".
  
     https://issues.apache.org/jira/browse/CLOWNFISH
  
  1. Create a JIRA account for yourself and sign in.
  2. Once you have signed in, the "create new issue" link will appear.  Either
     use it to open a new issue or navigate to an existing one as appropriate.
  3. To attach files to an issue, use the menu command
     'More Actions > Attach Files'.

  Attaching a file to an issue causes an email notification to be sent to the
  lucy-issues list signalling that a patch has arrived.  Please be patient but
  persistent while engaging with the Lucy committers who review and apply such
  patches.

CONTRIBUTE A PATCH:

  The easiest way to create a patch with Git is to capture the output of
  `git diff`:

    git diff > my_changes.patch

  The resulting patch file can then be attached to a JIRA issue.

GITHUB PULL REQUESTS

  Github users may submit pull requests against our mirror:

    https://github.com/apache/lucy-clownfish

  An email notifying the Lucy developers list of your pull request will be
  triggered automatically.

