blob: dbbcac40f72bbbd28a5506da96b36162351b2e8b [file] [log] [blame]
Contributing to GraphAr
========================
First off, thank you for considering contributing to GraphAr. It's people like you that make GraphAr better and better.
GraphAr is an open source project and we love to receive contributions from our community — you!
There are many ways to contribute, from improving the documentation, submitting bug reports and
feature requests or writing code which can be incorporated into GraphAr itself.
Note that no matter how you contribute, your participation is governed by our `Code of Conduct`_.
Reporting bug
-------------------
If you've noticed a bug in GraphAr, first make sure that you are testing against
the `latest version of GraphAr <https://github.com/alibaba/GraphAr/tree/main>`_ -
your issue may already have been fixed. If not, search our `issues list <https://github.com/alibaba/GraphAr/issues>`_
on GitHub in case a similar issue has already been opened.
If you get confirmation of your bug, `file a bug issue`_ before starting to code.
Requesting feature or enhancement
---------------------------------------
If you find yourself wishing for a feature that doesn't exist in GraphAr, you are probably not alone.
There are bound to be others out there with similar needs. Many of the features that GraphAr has today
have been added because our users saw the need.
`Open a feature request issue`_ on GitHub which describes the feature you would
like to see, why you need it, and how it should work.
Support questions
-----------------
If you have a general question about GraphAr, please don't use the issue tracker for that.
The issue tracker is a tool to address bugs and feature requests in GraphAr itself.
Use our `Github Discussions`_ for questions about using GraphAr or issues with your own code:
Contributing code and documentation changes
-------------------------------------------
If you would like to contribute a new feature or a bug fix to GraphAr,
please discuss your idea first on the GitHub issue. If there is no GitHub issue
for your idea, please open one. It may be that somebody is already working on
it, or that there are particular complexities that you should know about before
starting the implementation. There are often a number of ways to fix a problem
and it is important to find the right approach before spending time on a PR
that cannot be merged.
Install pre-commit
^^^^^^^^^^^^^^^^^^
GraphAr use `pre-commit`_ to ensure no secrets are accidentally committed
into the Git repository, you could first install `pre-commit`_ by
.. code:: bash
$ pip3 install pre-commit
The configure the necessary pre-commit hooks with
.. code:: bash
$ pre-commit install --install-hooks
Minor Fixes
^^^^^^^^^^^^
Any functionality change should have a GitHub issue opened. For minor changes that
affect documentation, you do not need to open up a GitHub issue. Instead you can
prefix the title of your PR with "[MINOR] " if meets the following guidelines:
* Grammar, usage and spelling fixes that affect no more than 2 files
* Documentation updates affecting no more than 2 files and not more
than 500 words.
Fork & create a branch
^^^^^^^^^^^^^^^^^^^^^^^^
You will need to fork the main GraphAr code and clone it to your local machine. See
`github help page <https://help.github.com/articles/fork-a-repo>`_ for help.
Then you need to create a branch with a descriptive name.
A good branch name would be (where issue #42 is the ticket you're working on):
.. code:: shell
$ git checkout -b 42-add-chinese-translations
Get the test suite running
^^^^^^^^^^^^^^^^^^^^^^^^^^
Now initialize the submodules of GraphAr:
.. code:: shell
$ git submodule update --init
For the C++ Library, Check that the system has the `GraphAr C++ Dependencies`_.
Then you can do an out-of-source build using CMake and build the test suite:
.. code:: shell
$ mkdir build
$ cd build
$ cmake ../cpp -DBUILD_TESTS=ON
$ make -j$(nproc)
Now you should be able to run the test suite:
.. code:: shell
$ make test
For the Spark Library, Check that the system has the `GraphAr Spark Dependencies`_.
Then you build and run test suite using Maven:
.. code:: shell
$ cd spark
$ mvn test
How to generate the document
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If you want to improve the document, you need to know how to generate the docs.
The documentation is generated using Doxygen and sphinx. For sphinx and other Python dependency the GraphAr pyspark subproject is used. You need to `install Poetry packaging system first <https://python-poetry.org/docs/#installation>`_. The next step will be installation of docs-related Python dependencies:
.. code:: shell
$ cd pyspark
$ poetry install --with=docs
.. note::
If you want to update PySpark project API documentation, you need also install dependencies from spark group in poetry: poetry install --with=docs,spark. For Cpp API documentation you need to `install also doxygen <https://www.doxygen.nl/manual/install.html>`_ (in most of POSIX-compatible systems installation is also possible via system package manager). For Java/Scala API documentation you need to `install Maven <https://maven.apache.org/install.html>`_ (this step also may be done via system package manager on the most of POSIX-compatible systems).
After that you can build GraphAr's documentation in the :code:`docs/` directory using:
.. code:: shell
$ cd docs
$ make html
The HTML documentation will be available under ``docs/_build/html``.
Implement your fix or feature
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
At this point, you're ready to make your changes! Feel free to ask for help;
everyone is a beginner at first :smile_cat:
Get the code format & style right
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Your patch should follow the same conventions & pass the same code quality
checks as the rest of the project which follows the `Google C++ Style Guide <https://google.github.io/styleguide/cppguide.html>`_.
You can format your code by the command:
.. code:: shell
$ cd build
$ make gar-clformat
You can check & fix style issues by running the *cpplint* linter with the command:
.. code:: shell
$ cd build
$ make gar-cpplint
Submitting your changes
^^^^^^^^^^^^^^^^^^^^^^^
Once your changes and tests are ready to submit for review:
1. Test you changes
Run the test suite to make sure that nothing is broken.
2. Sign the Contributor License Agreement (CLA)
Please make sure you have signed our `Contributor License Agreement`_.
We are not asking you to assign copyright to us, but to give us the right to distribute your code without restriction.
We ask this of all contributors in order to assure our users of the origin and continuing existence of the code. You only need to sign the CLA once.
3. Submit a pull request
At this point, you should switch back to your main branch and make sure it's
up to date with GraphAr's main branch:
.. code:: shell
$ git remote add upstream https://github.com/alibaba/GraphAr.git
$ git checkout main
$ git pull upstream main
Then update your feature branch from your local copy of main, and push it!
.. code:: shell
$ git checkout 42-add-chinese-translations
$ git rebase main
$ git push --set-upstream origin 42-add-chinese-translations
Finally, go to GitHub and `make a Pull Request`_ :D
Github Actions will run our test suite against different environments. We
care about quality, so your PR won't be merged until all tests pass.
Discussing and keeping your Pull Request updated
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
You will probably get feedback or requests for changes to your pull request.
This is a big part of the submission process so don't be discouraged!
It is a necessary part of the process in order to evaluate whether the changes
are correct and necessary.
If a maintainer asks you to "rebase" your PR, they're saying that a lot of code
has changed, and that you need to update your branch so it's easier to merge.
To learn more about rebasing in Git, there are a lot of `good <http://git-scm.com/book/en/Git-Branching-Rebasing>`_
`resources <https://help.github.com/en/github/using-git/about-git-rebase>`_, but here's the suggested workflow:
.. code:: shell
$ git checkout 42-add-chinese-translations
$ git pull --rebase upstream main
$ git push --force-with-lease 42-add-chinese-translations
Feel free to post a comment in the pull request to ping reviewers if you are awaiting an answer
on something. If you encounter words or acronyms that seem unfamiliar, refer to this `glossary`_.
Merging a PR (maintainers only)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
A PR can only be merged into main by a maintainer if:
* It is passing CI.
* It has been approved by at least two maintainers. If it was a maintainer who
opened the PR, only one extra approval is needed.
* It has no requested changes.
* It is up to date with current main.
Any maintainer is allowed to merge a PR if all of these conditions are
met.
Shipping a release (maintainers only)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Maintainers need to do the following to push out a release:
1. Switch to the main branch and make sure it's up to date.
.. code:: shell
$ git checkout main
$ git pull upstream main
2. Tag the release with a version number and push it to GitHub. Note that the version number should follow `semantic versioning <https://semver.org/#summary>`_. e.g.: v0.1.0.
.. code:: shell
$ git tag -a v0.1.0 -m "GraphAr v0.1.0"
$ git push upstream v0.1.0
3. The release draft will be automatically built to GitHub by GitHub Actions. You can edit the release notes draft on `GitHub <https://github.com/alibaba/GraphAr/releases>`_ to add more details.
4. Publish the release.
.. the reviewing part document is referred and derived from
.. https://github.com/nodejs/node/blob/main/doc/contributing/pull-requests.md#the-process-of-making-changes
Reviewing pull requests
-----------------------
All contributors who choose to review and provide feedback on Pull Requests have
a responsibility to both the project and the individual making the contribution.
Reviews and feedback must be helpful, insightful, and geared towards improving
the contribution as opposed to simply blocking it. Do not expect to be able to
block a pull request from advancing simply because you say "No" without giving
an explanation. Be open to having your mind changed. Be open to working with the
contributor to make the pull request better.
Reviews that are dismissive or disrespectful of the contributor or any other
reviewers are strictly counter to the `Code of Conduct`_ and will not be tolerated.
When reviewing a pull request, the primary goals are for the codebase to improve
and for the person submitting the request to succeed. Even if a pull request does
not land, the submitters should come away from the experience feeling like their
effort was not wasted or unappreciated. Every pull request from a new contributor
is an opportunity to grow the community.
Review a bit at a time
^^^^^^^^^^^^^^^^^^^^^^^
Do not overwhelm new contributors.
It is tempting to micro-optimize and make everything about relative performance,
perfect grammar, or exact style matches. Do not succumb to that temptation.
Focus first on the most significant aspects of the change:
1. Does this change make sense for GraphAr?
2. Does this change make GraphAr better, even if only incrementally?
3. Are there clear bugs or larger scale issues that need attending to?
4. Is the commit message readable and correct? If it contains a breaking change
is it clear enough?
When changes are necessary, *request* them, do not *demand* them, and do not
assume that the submitter already knows how to add a test or run a benchmark.
Specific performance optimization techniques, coding styles, and conventions
change over time. The first impression you give to a new contributor never does.
Nits (requests for small changes that are not essential) are fine, but try to
avoid stalling the pull request. Most nits can typically be fixed by the
GraphAr collaborator landing the pull request but they can also be an
opportunity for the contributor to learn a bit more about the project.
It is always good to clearly indicate nits when you comment: e.g.
:code:`Nit: change foo() to bar(). But this is not blocking.`
If your comments were addressed but were not folded automatically after new
commits or if they proved to be mistaken, please, `hide them <https://docs.github.com/en/communities/moderating-comments-and-conversations/managing-disruptive-comments#hiding-a-comment>`_
with the appropriate reason to keep the conversation flow concise and relevant.
Be aware of the person behind the code
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Be aware that *how* you communicate requests and reviews in your feedback can
have a significant impact on the success of the pull request. Yes, we may land
a particular change that makes GraphAr better, but the individual might just
not want to have anything to do with GraphAr ever again. The goal is not just
having good code.
Respect the minimum wait time for comments
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
There is a minimum waiting time which we try to respect for non-trivial
changes, so that people who may have important input in such a distributed
project are able to respond.
For non-trivial changes, pull requests must be left open for at least 48 hours.
Sometimes changes take far longer to review, or need more specialized review
from subject-matter experts. When in doubt, do not rush.
Trivial changes, typically limited to small formatting changes or fixes to
documentation, may be landed within the minimum 48 hour window.
Abandoned or stalled pull requests
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
If a pull request appears to be abandoned or stalled, it is polite to first
check with the contributor to see if they intend to continue the work before
checking if they would mind if you took it over (especially if it just has
nits left). When doing so, it is courteous to give the original contributor
credit for the work they started (either by preserving their name and email
address) in the commit log, or by using an :code:`Author:` meta-data tag in the
commit.
Approving a change
^^^^^^^^^^^^^^^^^^^
Any GraphAr core collaborator (any GitHub user with commit rights in the
:code:`alibaba/GraphAr` repository) is authorized to approve any other contributor's
work. Collaborators are not permitted to approve their own pull requests.
Collaborators indicate that they have reviewed and approve of the changes in
a pull request either by using GitHub's Approval Workflow, which is preferred,
or by leaving an :code:`LGTM` ("Looks Good To Me") comment.
When explicitly using the "Changes requested" component of the GitHub Approval
Workflow, show empathy. That is, do not be rude or abrupt with your feedback
and offer concrete suggestions for improvement, if possible. If you're not
sure **how** a particular change can be improved, say so.
Most importantly, after leaving such requests, it is courteous to make yourself
available later to check whether your comments have been addressed.
If you see that requested changes have been made, you can clear another
collaborator's :code:`Changes requested` review.
Change requests that are vague, dismissive, or unconstructive may also be
dismissed if requests for greater clarification go unanswered within a
reasonable period of time.
Use :code:`Changes requested` to block a pull request from landing. When doing so,
explain why you believe the pull request should not land along with an
explanation of what may be an acceptable alternative course, if any.
Performance is not everything
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
GraphAr has always optimized for speed of execution. If a particular change
can be shown to make some part of GraphAr faster, it's quite likely to be
accepted.
That said, performance is not the only factor to consider. GraphAr also
optimizes in favor of not breaking existing code in the ecosystem, and not
changing working functional code just for the sake of changing.
If a particular pull request introduces a performance or functional
regression, rather than simply rejecting the pull request, take the time to
work *with* the contributor on improving the change. Offer feedback and
advice on what would make the pull request acceptable, and do not assume that
the contributor should already know how to do that. Be explicit in your
feedback.
Continuous integration testing
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
All pull requests that contain changes to code must be run through
continuous integration (CI) testing at `Github Actions <https://github.com/alibaba/GraphAr/actions>`_.
The pull request change will trigger a CI testing run. Ideally, the code change
will pass ("be green") on all platform configurations supported by GraphAr.
This means that all tests pass and there are no linting errors. In reality,
however, it is not uncommon for the CI infrastructure itself to fail on specific
platforms ("be red"). It is vital to visually inspect the results of all failed ("red") tests
to determine whether the failure was caused by the changes in the pull request.
Format specification & Libraries implementation
-----------------------------------------------
The GraphAr includes the format specification and libraries implementation. The libraries implementation is based on the format specification.
When you request a new feature to the format specification, you should first open a feature request issue and discuss with the community.
If the feature is accepted, you can submit a pull request update the `format specification design`_. After the format specification is updated,
you can submit a pull request to the related libraries implementation to implement the new feature and update the `implementation status`_.
.. _pre-commit: https://pre-commit.com/
.. _Code of Conduct: https://github.com/alibaba/GraphAr/blob/main/CODE_OF_CONDUCT.md
.. _file a bug issue: https://github.com/alibaba/GraphAr/issues/new?assignees=&labels=Bug&template=bug_report.yml&title=%5BBug%5D%3A+%3Ctitle%3E
.. _Open a feature request issue: https://github.com/alibaba/GraphAr/issues/new?assignees=&labels=enhancement&template=feature_request.md&title=%5BFeat%5D
.. _fork GraphAr: https://help.github.com/articles/fork-a-repo
.. _make a Pull Request: https://help.github.com/articles/creating-a-pull-request
.. _Github Discussions: https://github.com/alibaba/GraphAr/discussions
.. _git rebasing: http://git-scm.com/book/en/Git-Branching-Rebasing
.. _interactive rebase: https://help.github.com/en/github/using-git/about-git-rebase
.. _GraphAr C++ Dependencies: https://github.com/alibaba/GraphAr/tree/main/cpp#system-setup
.. _GraphAr Spark Dependencies: https://github.com/alibaba/GraphAr/tree/main/spark#system-setup
.. _Contributor License Agreement: https://cla-assistant.io/alibaba/GraphAr
.. _glossary: https://chromium.googlesource.com/chromiumos/docs/+/HEAD/glossary.md
.. _format specification design: https://github.com/alibaba/GraphAr/tree/main/docs/format/file-format.rst
.. _implementation status: https://github.com/alibaba/GraphAr/tree/main/docs/format/status.rst