# How to become a contributor and submit your own code

## Contributor License Agreements

We'd love to accept your sample apps and patches! Before we can take them, we
have to jump a couple of legal hurdles.

Please fill out either the individual or corporate Contributor License Agreement
(CLA).

  * If you are an individual writing original source code and you're sure you
    own the intellectual property, then you'll need to sign an [individual CLA]
    (http://code.google.com/legal/individual-cla-v1.0.html).
  * If you work for a company that wants to allow you to contribute your work,
    then you'll need to sign a [corporate CLA]
    (http://code.google.com/legal/corporate-cla-v1.0.html).

Follow either of the two links above to access the appropriate CLA and
instructions for how to sign and return it. Once we receive it, we'll be able to
accept your pull requests.

## Contributing a Patch

1. Sign a Contributor License Agreement, if you have not yet done so (see
   details above).
1. Create your change to the repo in question.
    * Fork the desired repo, develop and test your code changes.
    * Ensure that your code is clear and comprehensible.
    * Ensure that your code has an appropriate set of unit tests which all pass.
1. Submit a pull request.
1. The repo owner will review your request. If it is approved, the change will
   be merged. If it needs additional work, the repo owner will respond with
   useful comments.

## Contributing a New Sample App

1. Sign a Contributor License Agreement, if you have not yet done so (see
   details above).
1. Create your own repo for your app following this naming convention:
    * mirror-{app-name}-{language or plaform}
    * apps: quickstart, photohunt-server, photohunt-client
    * example:  mirror-quickstart-android
    * For multi-language apps, concatenate the primary languages like this:
      mirror-photohunt-server-java-python.

1. Create your sample app in this repo.
    * Be sure to clone the README.md, CONTRIBUTING.md and LICENSE files from the
      googlesamples repo.
    * Ensure that your code is clear and comprehensible.
    * Ensure that your code has an appropriate set of unit tests which all pass.
    * Instructional value is the top priority when evaluating new app proposals for
      this collection of repos.
1. Submit a request to fork your repo in googlesamples organization.
1. The repo owner will review your request. If it is approved, the sample will
   be merged. If it needs additional work, the repo owner will respond with
   useful comments.
