-
- -
-

Contribute Code

-

We sincerely appreciate your contributions. You can use fork and pull request -workflow to merge your code.

-
-

Code Requirements

-
    -
  • Your code comments must be fully documented by -Doxygen style.
  • -
  • Make sure the compiler option WITH_STYLE_CHECK is on and the compiler -passes the code style check.
  • -
  • All code must have unit test.
  • -
  • Pass all unit tests.
  • -
-

The following tutorial guides you into submitting your contibution.

-
-
-

Creating a Fork

-

Just head over to the GitHub page and click the “Fork” button. -It’s just that simple.

-
-
-

Clone

-

Clone remote repository.

-
➜  git clone https://github.com/USERNAME/Paddle
-➜  cd Paddle
-
-
-
-
-

Create a local branch

-

Paddle is currently using Git-flow branching model.

-

All feature and bug fix development work should be done on a new branch, generally create new branch from develop branch .

-
➜  git checkout -b my-cool-stuff
-
-
-

Before the checkout, you need to keep the current branch directory clean, otherwise the untracked file will be brought to the new branch, which can be inspected by git status.

-
-
-

Using pre-commit hook

-

Paddle developers use pre-commit tool to manage git -pre-commit hooks. It can help us format source codes (cpp, python), check some -basic thing before commit (only one EOL for each file, do not add a huge file -in git). pre-commit tests is a part of unit tests in Travis-CI now, every -PR doesn’t fit hook can not be merged into Paddle.

-

To use pre-commit, you should install it by -pip install pre-commit, and currently, Paddle uses clang-format to format -c/cpp sources. Please make sure clang-format 3.8+ installed.

-

Install and run it as follow:

-
➜  pip install pre-commit
-➜  pre-commit install
-
-
-

When you commit your code, the pre-commit hook will check the local code if there is -anything not suitable to commit, and so on.

-
-
-

Start to develop

-

In this tutorial, I delete a line in README.md and created a new file.

-

We can use git status to inspect the changes of current directory, git diff to see difference.

-
➜  git status
-On branch test
-Changes not staged for commit:
-  (use "git add <file>..." to update what will be committed)
-  (use "git checkout -- <file>..." to discard changes in working directory)
-
-    modified:   README.md
-
-Untracked files:
-  (use "git add <file>..." to include in what will be committed)
-
-    test
-
-no changes added to commit (use "git add" and/or "git commit -a")
-
-
-
-
-

Build and Test

-

We package PaddlePaddle’s compile environment into a Docker image, called the develop image named paddle:dev, it contains all compiling tools that PaddlePaddle needs.

-

If you want to build the develop image, just run:

-
➜  docker build -t paddle:dev .
-
-
-

Then we can use the develop image to build PaddlePaddle source. For example:

-
➜  docker run -v $(pwd):/paddle -e "WITH_GPU=OFF" -e "WITH_AVX=ON" -e "WITH_TEST=ON" paddle:dev
-
-
-

The above command will compile PaddlePaddle and create a Dockerfile for building production image. All the generated files are in the build directory. “WITH_GPU” controls if the generated production image supports GPU. “WITH_AVX” controls if the generated production image supports AVX. “WITH_TEST” controls if the unit test will be generated.

-

Then we can generate the production image by copying the compiled PaddlePaddle program into the image by

-
➜  docker build -t paddle:prod -f build/Dockerfile .
-
-
-

Run unit test finally:

-
➜  docker run -it -v $(pwd):/paddle paddle:dev bash -c "cd /paddle/build && ctest"
-
-
-

For more details, you can read this doc.

-
-
-

Commit

-

Next we cancel the changes to the README.md file and then commit our changes by following command lines:

-
➜  git checkout -- README.md
-➜  git status
-On branch test
-Untracked files:
-  (use "git add <file>..." to include in what will be committed)
-
-    test
-
-nothing added to commit but untracked files present (use "git add" to track)
-➜  git add test
-
-
-

We should write a description of each commit by git commit to allow others to know -the changes in these files.

-
➜  git commit
-CRLF end-lines remover...............................(no files to check)Skipped
-yapf.................................................(no files to check)Skipped
-Check for added large files..............................................Passed
-Check for merge conflicts................................................Passed
-Check for broken symlinks................................................Passed
-Detect Private Key...................................(no files to check)Skipped
-Fix End of Files.....................................(no files to check)Skipped
-clang-formater.......................................(no files to check)Skipped
-[my-cool-stuff c703c041] add test file
- 1 file changed, 0 insertions(+), 0 deletions(-)
- create mode 100644 233
-
-
-
-
-

Keeping Fork Up to Date

-

Before pull your request, you should sync your code from the latest PaddlePaddle. -To do this, you’ll need to add a remote at first:

-
➜  git remote add upstream https://github.com/PaddlePaddle/Paddle
-➜  git remote
-origin
-upstream
-
-
-

Update your fork with the latest upstream changes:

-
➜  git fetch upstream
-➜  git pull upstream develop
-
-
-

Now, your local master branch is up-to-date with everything modified upstream.

-
-
-

Push to GitHub

-
# push to your repository in Github
-➜  git push origin my-cool-stuff
-
-
-
-
-

Create an issue and a Pull Request

-

Create an Issue to describe the problem and record its number.

-

Go to the page for your fork on GitHub, select your development branch, -and click the New pull request.

-

screen shot 2017-04-26 at 9 09 28 pm

-

Then select the target branch:

-

screen shot 2017-04-26 at 9 11 52 pm

-

We can add resolve #Issue number in PR description to close the issue automatically after the PR is merge. More details in https://help.github.com/articles/closing-issues-via-commit-messages/.

-

Then wait for review, if there need to modify, refer to the above steps to update the corresponding origin branch.

-
-
-

Delete origin branch

-

After the PR is merge into the main repository, we can delete the remote branch on the PR page.

-

screen shot 2017-04-26 at 9 18 24 pm

-

Or just run:

-
➜  git push origin :my-cool-stuff
-
-
-
-
-

Delete local branch

-

Finally, we delete local branch:

-
➜  git checkout develop 
-
-# delete my-cool-stuff branch
-➜  git branch -D my-cool-stuff
-
-
-
-
- - -
-