mirror of
https://github.com/golang/go
synced 2024-11-27 00:31:23 -07:00
aba0775ad8
The previous CL, 107197, overclarified the need for short subject lines. Tweak the wording to be a guideline (keep it short) rather than a limit (76 characters), which is more the Go way. Also be strict about avoiding markup language. Change-Id: I0da1132db8d86052647d96f1caac60289f2209ce Reviewed-on: https://go-review.googlesource.com/107378 Reviewed-by: Mohit Bajoria <mohitbajo36@gmail.com> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
1063 lines
34 KiB
HTML
1063 lines
34 KiB
HTML
<!--{
|
|
"Title": "Contribution Guide"
|
|
}-->
|
|
|
|
<p>
|
|
The Go project welcomes all contributors. The process of contributing
|
|
to the Go project may be different than many projects you are used to.
|
|
This document is intended as a guide to help you through the contribution
|
|
process. This guide assumes you have a basic understanding of Git and Go.
|
|
</p>
|
|
|
|
<p>
|
|
In addition to the information here, the Go community maintains a
|
|
<a href="https://golang.org/wiki/CodeReview">CodeReview</a> wiki page.
|
|
Feel free to contribute to the wiki as you learn the review process.
|
|
</p>
|
|
|
|
<p>
|
|
Note that the <code>gccgo</code> front end lives elsewhere;
|
|
see <a href="gccgo_contribute.html">Contributing to gccgo</a>.
|
|
</p>
|
|
|
|
<h2 id="contributor">Becoming a contributor</h2>
|
|
|
|
<h3>Overview</h3>
|
|
|
|
<p>
|
|
The first step is registering as a Go contributor and configuring your environment.
|
|
Here is a very quick checklist of the required steps, that you will need
|
|
to follow:
|
|
</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<b>Step 0</b>: Decide on a single Google Account you would be using to contribute to Go.
|
|
Use that account for all the following steps and make sure that <code>git</code>
|
|
is configured to create commits with that account's e-mail address.
|
|
</li>
|
|
<li>
|
|
<b>Step 1</b>: <a href="https://cla.developers.google.com/clas">Sign and submit</a> a
|
|
CLA (Contributor License Agreement).
|
|
</li>
|
|
<li>
|
|
<b>Step 2</b>: Configure authentication credentials for our <code>git</code> repository.
|
|
Go to <a href="https://go.googlesource.com/">go.googlesource.com</a>, click
|
|
on "Generate Password" (top right), and follow the instructions.
|
|
</li>
|
|
<li>
|
|
<b>Step 3</b>: Register to Gerrit, the code review tool used by the Go team, by <a href="https://go-review.googlesource.com/login/">visiting this page</a>. The CLA and the registration
|
|
need to be done only once for your account.
|
|
</li>
|
|
<li>
|
|
<b>Step 4</b>: Install <code>git-codereview</code> by running
|
|
<code>go get -u golang.org/x/review/git-codereview</code>
|
|
</li>
|
|
</ul>
|
|
|
|
<p>
|
|
If you prefer, we have an automated tool that walks through these steps. Just
|
|
run:
|
|
</p>
|
|
|
|
<pre>
|
|
$ go get -u golang.org/x/tools/cmd/go-contrib-init
|
|
$ cd /code/to/edit
|
|
$ go-contrib-init
|
|
</pre>
|
|
|
|
<p>
|
|
The rest of this chapter elaborates on these steps.
|
|
If you have completed the steps above (either manually or through the tool), jump to
|
|
<a href="#making_a_change">Making a change</a>.
|
|
</p>
|
|
|
|
<h3 id="google_account">Step 0: Select a Google Account</h3>
|
|
|
|
<p>
|
|
A contribution to Go is made through a Google account, with a specific
|
|
e-mail address. Make sure to pick one and use it throughout the process and
|
|
for all your contributions. You may need to decide whether to
|
|
use a personal address or a corporate address. The choice will depend on who
|
|
will own the copyright for the code that you will be writing
|
|
and submitting. Consider discussing this with your employer.
|
|
</p>
|
|
|
|
<p>
|
|
Google Accounts can either be Gmail email accounts, G-Suite organization accounts, or
|
|
accounts associated with an external e-mail address. For instance, if you need to use
|
|
an existing corporate e-mail that is not managed through G-Suite, you can create
|
|
an account associated
|
|
<a href="https://accounts.google.com/SignUpWithoutGmail">with your existing
|
|
email address</a>.
|
|
</p>
|
|
|
|
<p>
|
|
You also need to make sure that <code>git</code> is configured to author commits
|
|
using the same e-mail address. You can either configure it globally
|
|
(as a default for all projects), or locally (for a single specific project).
|
|
You can check the current configuration with this command:
|
|
<p>
|
|
|
|
<pre>
|
|
$ git config --global user.email # check current global config
|
|
$ git config user.email # check current local config
|
|
</pre>
|
|
|
|
<p>To change the configured address:</p>
|
|
|
|
<pre>
|
|
$ git config --global user.email name@example.com # change global config
|
|
$ git config user.email name@example.com # change local config
|
|
</pre>
|
|
|
|
|
|
<h3 id="cla">Step 1: Contributor License Agreement</h3>
|
|
|
|
<p>
|
|
Before sending your first change to the Go project
|
|
you must have completed one of the following two CLAs.
|
|
Which CLA you should sign depends on who owns the copyright to your work.
|
|
|
|
<ul>
|
|
<li>
|
|
If you are the copyright holder, you will need to agree to the
|
|
<a href="https://developers.google.com/open-source/cla/individual">individual
|
|
contributor license agreement</a>, which can be completed online.
|
|
</li>
|
|
<li>
|
|
If your organization is the copyright holder, the organization
|
|
will need to agree to the
|
|
<a href="https://developers.google.com/open-source/cla/corporate">corporate
|
|
contributor license agreement</a>.<br>
|
|
</li>
|
|
</ul>
|
|
|
|
<p>
|
|
You can check your currently signed agreements and sign new ones, through
|
|
the <a href="https://cla.developers.google.com/clas?pli=1&authuser=1">Google Developers
|
|
Contributor License Agreements</a> website.
|
|
If the copyright holder for your contribution has already completed the
|
|
agreement in connection with another Google open source project,
|
|
it does not need to be completed again.
|
|
</p>
|
|
|
|
<p>
|
|
If the copyright holder for the code you are submitting changes — for example,
|
|
if you start contributing code on behalf of a new company — please send email
|
|
to golang-dev and let us know, so that we can make sure an appropriate agreement is
|
|
completed and update the <code>AUTHORS</code> file.
|
|
</p>
|
|
|
|
|
|
<h3 id="auth">Step 2: Configure git authentication</h3>
|
|
|
|
<p>
|
|
Go development happens on <a href="go.googlesource.com">go.googlesource.com</a>,
|
|
a <code>git</code> server hosted by Google.
|
|
Authentication on the web server is made through your Google account, but
|
|
you also need to configure <code>git</code> on your computer to access it.
|
|
Follow this steps:
|
|
</p>
|
|
|
|
<ol>
|
|
<li>
|
|
Visit <a href="https://go.googlesource.com">go.googlesource.com</a>
|
|
and click on "Generate Password" in the page's top right menu bar.
|
|
You will be redirected to accounts.google.com to sign in.
|
|
</li>
|
|
<li>
|
|
After signing in, you are taken to a page with the title "Configure Git".
|
|
This page contains a personalized script that when run locally will configure git
|
|
to have your unique authentication key.
|
|
This key is paired with one generated server side, analogous to how SSH keys work.
|
|
</li>
|
|
<li>
|
|
Copy and run this script locally in your command line terminal, to store your
|
|
secret authentication token in a <code>.gitcookies</code> file.
|
|
(On a Windows computer using <code>cmd</code> you should instead follow the instructions
|
|
in the yellow box to run the command. If you are using <code>git-bash</code> use the same
|
|
script as *nix.).
|
|
</li>
|
|
</ol>
|
|
|
|
<h3 id="auth">Step 3: Create a Gerrit account </h3>
|
|
|
|
<p>
|
|
Gerrit is an open-source tool used by Go maintainers to discuss and review
|
|
code submissions.
|
|
</p>
|
|
|
|
<p>
|
|
To register your account, visit <a href="https://go-review.googlesource.com/login/">
|
|
go-review.googlesource.com/login/</a> and sign in once using the same Google Account you used above.
|
|
</p>
|
|
|
|
<h3 id="git-codereview_install">Step 4: Install the git-codereview command</h3>
|
|
|
|
<p>
|
|
Changes to Go must be reviewed before they are accepted, no matter who makes the change.
|
|
A custom git command called <code>git-codereview</code>, discussed below,
|
|
helps to send changes to Gerrit.
|
|
</p>
|
|
|
|
<p>
|
|
Install the <code>git-codereview</code> command by running,
|
|
</p>
|
|
|
|
<pre>
|
|
$ go get -u golang.org/x/review/git-codereview
|
|
</pre>
|
|
|
|
<p>
|
|
Make sure <code>git-codereview</code> is installed in your shell path, so that the
|
|
<code>git</code> command can find it. Check that
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview help
|
|
</pre>
|
|
|
|
<p>
|
|
prints help text, not an error.
|
|
</p>
|
|
|
|
<p>
|
|
On Windows, when using git-bash you must make sure that
|
|
<code>git-codereview.exe</code> is in your git exec-path.
|
|
Run <code>git --exec-path</code> to discover the right location then create a
|
|
symbolic link or simply copy the executable from $GOPATH/bin to this directory.
|
|
</p>
|
|
|
|
|
|
<h2 id="making_a_contribution">Before contributing code</h2>
|
|
|
|
<p>
|
|
The project welcomes submissions but please let everyone know what
|
|
you're working on if you want to change or add to the Go repositories.
|
|
</p>
|
|
|
|
<p>
|
|
Before undertaking to write something new for the Go project,
|
|
please <a href="https://golang.org/issue/new">file an issue</a>
|
|
(or claim an <a href="https://golang.org/issues">existing issue</a>).
|
|
</p>
|
|
|
|
<h3>Check the issue tracker</h3>
|
|
|
|
<p>Whether you already know what contribution to make, or you are searching for
|
|
an idea, the <a href="https://github.com/golang/go/issues">issue tracker</a> is
|
|
always the first place to go. Issues are triaged to categorize them and manage
|
|
the workflow.
|
|
</p>
|
|
|
|
<p>Most issues will be marked with one of the following workflow labels:
|
|
<ul>
|
|
<li><b>NeedsInvestigation</b>: The issue is not fully understood well
|
|
and requires analysis to understand the root cause. </li>
|
|
<li><b>NeedsDecision</b>: the issue is relatively well understood, but the
|
|
Go team hasn't yet decided the best way to fix it or implement it among all
|
|
possible options. It would be better to wait for a decision before
|
|
writing code. If you are interested on working on an issue in this state,
|
|
feel free to ping maintainers here if some time has passed without a decision.</li>
|
|
<li><b>NeedsFix</b>: the issue is fully understood and code can be written
|
|
to fix it.</li>
|
|
</ul>
|
|
</p>
|
|
|
|
<h3 id="Design">Open an issue for any new problem</h3>
|
|
|
|
<p>
|
|
Excluding very trivial changes, all contributions should be connected
|
|
to an existing issue. Feel free to open one and discuss what your
|
|
plans are. This process gives everyone a chance to validate the design,
|
|
helps prevent duplication of effort,
|
|
and ensures that the idea fits inside the goals for the language and tools.
|
|
It also checks that the design is sound before code is written;
|
|
the code review tool is not the place for high-level discussions.
|
|
</p>
|
|
|
|
<p>
|
|
When planning work, please note that the Go project follows a <a
|
|
href="https://golang.org/wiki/Go-Release-Cycle">six-month development cycle</a>.
|
|
The latter half of each cycle is a three-month feature freeze during
|
|
which only bug fixes and doc updates are accepted. New contributions can be
|
|
sent during a feature freeze but will not be accepted until the freeze thaws.
|
|
</p>
|
|
|
|
<p>Significant changes must go through the
|
|
<a href="https://golang.org/s/proposal-process">change proposal process</a>
|
|
before they can be accepted.</p>
|
|
|
|
<p>
|
|
Sensitive security-related issues should be reported to <a href="mailto:security@golang.org">security@golang.org</a>.
|
|
</p>
|
|
|
|
<h2 id="making_a_contribution">Sending a change via GitHub</h2>
|
|
|
|
<p>
|
|
First-time contributors that are already familiar with the
|
|
<a href="https://guides.github.com/introduction/flow/">GitHub flow</a>
|
|
are encouraged to use the same process for Go contributions. Even though Go
|
|
maintainers use Gerrit for code review, a bot has been created to sync
|
|
GitHub pull requests to Gerrit.
|
|
</p>
|
|
|
|
<p>
|
|
Open a pull request as you would normally do. Gopherbot will automatically
|
|
sync the code and post a link to Gerrit. When somebody comments on the
|
|
change, it will be posted in the pull request, so you will also get a notification.
|
|
</p>
|
|
|
|
<p>Some things to keep in mind:
|
|
|
|
<ul>
|
|
<li>
|
|
To update the pull request with new code, just push it to the branch; you can either
|
|
add more commits, or rebase and force-push (both styles are accepted).
|
|
</li>
|
|
<li>
|
|
If the request is accepted, all the commits will be squashed, and the final
|
|
commit description will be composed by concatenating the pull request's
|
|
title and description. The individual commits' descriptions will be discarded.
|
|
See <a href="#commit_messages">Writing good commit messages</a> for some
|
|
suggestions.
|
|
</li>
|
|
<li>
|
|
Gopherbot is unable to sync line-by-line codereview into GitHub: only the
|
|
contents of the overall comment on the request will be synced. Remember you
|
|
can always to go Gerrit to see the fine-grained review.
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
|
|
<h2 id="making_a_contribution">Sending a change via Gerrit</h2>
|
|
|
|
<p>
|
|
It is not possible to fully sync Gerrit and GitHub, at least at the moment,
|
|
so we recommend learning Gerrit. It's different but powerful and familiarity
|
|
with help you understand the flow.
|
|
</p>
|
|
|
|
<h3>Overview</h3>
|
|
|
|
<p>This is an overview of the overall process:
|
|
<ul>
|
|
<li><b>Step 1:</b> Clone the Go source code from GitHub or go.googlesource.com, and make sure it's stable by compiling and testing it once:
|
|
<pre>
|
|
$ git clone https://github.com/golang/go # or https://go.googlesource.com/go
|
|
$ cd go/src
|
|
$ ./all.bash # compile and test
|
|
</pre>
|
|
<li><b>Step 2:</b> Prepare changes in a new branch, created from the master branch.
|
|
To commit the changes, use <code>git</code> <code>codereview</code> <code>change</code>, that
|
|
will create or amend a single commit in the branch.
|
|
<pre>
|
|
$ git checkout -b mybranch
|
|
$ [edit files...]
|
|
$ git add [files...]
|
|
$ git codereview change # create commit in the branch
|
|
$ [edit again...]
|
|
$ git add [files...]
|
|
$ git codereview change # amend the existing commit with new changes
|
|
$ [etc.]
|
|
</pre>
|
|
</li>
|
|
<li>
|
|
<b>Step 3:</b> Test your changes, re-running <code>all.bash</code>.
|
|
<pre>
|
|
$ ./all.bash # recompile and test
|
|
</pre>
|
|
</li>
|
|
<li>
|
|
<b>Step 4:</b> Send the changes for review to Gerrit using <code>git</code>
|
|
<code>codereview</code> <code>mail</code> (which doesn't use e-mail, despite the name).
|
|
<pre>
|
|
$ git codereview mail # send changes to Gerrit
|
|
</pre>
|
|
</li>
|
|
<li>
|
|
<b>Step 5:</b> After a review, apply changes to the same single commit, and mail them to Gerrit again:
|
|
<pre>
|
|
$ [edit files...]
|
|
$ git add [files...]
|
|
$ git codereview change # update same commit
|
|
$ git codereview mail # send to Gerrit again
|
|
</li>
|
|
</ul>
|
|
</p>
|
|
|
|
<p>The rest of this chapter describes these steps in more detail.</p>
|
|
|
|
|
|
<h3 id="checkout_go">Step 1: Clone the Go source code</h3>
|
|
|
|
<p>
|
|
In addition to a recent Go installation, you need to have a local copy of the source
|
|
checked out from the correct repository. You should check out the Go source repo anywhere
|
|
you want as long as it's outside of your <code>GOPATH</code>. Either clone from
|
|
<code>go.googlesource.com</code> or GitHub:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git clone https://github.com/golang/go # or https://go.googlesource.com/go
|
|
$ cd go
|
|
</pre>
|
|
|
|
<h3 id="checkout_go">Step 2: Prepare changes in a new branch</h3>
|
|
|
|
<p>
|
|
Each Go change must be made in a separate branch, created from the master branch. You can use
|
|
the normal <code>git</code> commands to create a branch and add changes to the
|
|
staging area:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git checkout -b mybranch
|
|
$ [edit files...]
|
|
$ git add [files...]
|
|
</pre>
|
|
|
|
<p>
|
|
To commit changes, instead of <code>git commit</code>, use <code>git codereview change</code>.
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview change
|
|
(open $EDITOR)
|
|
</pre>
|
|
|
|
<p>
|
|
You can edit the commit description in your favorite editor as usual.
|
|
<code>git</code> <code>codereview</code> <code>change</code> will automatically
|
|
add a <code>Change-Id</code> line near the bottom. That line is used by
|
|
Gerrit to match successive uploads of the same change. Do not edit or delete it.
|
|
This is an example:
|
|
</p>
|
|
|
|
<pre>
|
|
commit fef82cf89a34935a41bd0e3c1e0c2d9d6de29ee2 (HEAD -> test)
|
|
Author: Giovanni Bajo <rasky@develer.com>
|
|
Date: Tue Feb 13 01:07:15 2018 +0100
|
|
|
|
cmd/compile: test
|
|
|
|
Change-Id: I2fbdbffb3aab626c4b6f56348861b7909e3e8990
|
|
</pre>
|
|
|
|
<p>
|
|
<code>git</code> <code>codereview</code> <code>change</code> also checks that you've
|
|
run <code>go</code> <code>fmt</code> over the source code, and that
|
|
the commit message follows the <a href="#commit_messages">suggested format</a>.
|
|
</p>
|
|
|
|
<p>
|
|
If you need to edit the files again, you can stage the new changes and
|
|
re-run <code>git</code> <code>codereview</code> <code>change</code>: each subsequent
|
|
run will amend the existing commit.
|
|
</p>
|
|
|
|
<p>
|
|
Make sure that you always keep a single commit in each branch. If you add more
|
|
commits by mistake, you can use <code>git</code> <code>rebase</code> to
|
|
<a href="https://stackoverflow.com/questions/31668794/squash-all-your-commits-in-one-before-a-pull-request-in-github">squash them together</a>
|
|
into a single one.
|
|
</p>
|
|
|
|
|
|
<h3 id="Testing">Step 3: Test changes</h3>
|
|
|
|
<p>
|
|
You've <a href="code.html">written and tested your code</a>, but
|
|
before sending code out for review, run all the tests for the whole
|
|
tree to make sure the changes don't break other packages or programs:
|
|
</p>
|
|
|
|
<pre>
|
|
$ cd go/src
|
|
$ ./all.bash
|
|
</pre>
|
|
|
|
<p>
|
|
(To build under Windows use <code>all.bat</code>; this also requires
|
|
setting the environment variable <code>GOROOT_BOOTSTRAP</code> to the
|
|
bootstrap compiler)
|
|
</p>
|
|
|
|
<p>
|
|
After running for a while, the command should print:
|
|
</p>
|
|
|
|
<pre>
|
|
"ALL TESTS PASSED".
|
|
</pre>
|
|
|
|
<p>Notice that you can use <code>make.bash</code> instead of <code>all.bash</code>
|
|
to just build the compiler without running the testsuite. Once the compiler is
|
|
built, you can run it directly from <code><GOCLONEDIR>/bin/go</code>; see also
|
|
the section on <a href="#quicktest">quickly test your changes</a>.</p>
|
|
|
|
<h3 id="mail">Step 4: Send changes for review</h3>
|
|
|
|
<p>
|
|
Once the change is ready, send it for review.
|
|
This is done via the <code>mail</code> sub-command which despite its name, doesn't
|
|
directly mail anything, it just sends the change to Gerrit:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview mail
|
|
</pre>
|
|
|
|
<p>
|
|
Gerrit assigns your change a number and URL, which <code>git</code> <code>codereview</code> <code>mail</code> will print, something like:
|
|
</p>
|
|
|
|
<pre>
|
|
remote: New Changes:
|
|
remote: https://go-review.googlesource.com/99999 math: improved Sin, Cos and Tan precision for very large arguments
|
|
</pre>
|
|
|
|
<p>
|
|
If you get an error instead, check the
|
|
<a href="#troubleshooting_mail">Troubleshooting mail errors</a> section.
|
|
</p>
|
|
|
|
<p>
|
|
If your change relates to an open GitHub issue and you have followed the <a href="#commit_messages">
|
|
suggested commit message format</a>, the issue will be updated in a few minutes by a bot,
|
|
linking your Gerrit change in it.
|
|
</p>
|
|
|
|
|
|
<h3 id="revise">Step 5: Revise changes after a review</h3>
|
|
|
|
<p>
|
|
Go maintainers will review your code on Gerrit, and you will get notifications via email.
|
|
You can see the review on Gerrit, and comment on them. You can also reply
|
|
<a href="https://gerrit-review.googlesource.com/Documentation/intro-user.html#reply-by-email">via email</a>
|
|
if you prefer.
|
|
</p>
|
|
|
|
<p>
|
|
When you're ready to revise your submitted code, edit the files in correct branch,
|
|
add them to the git staging area, and then amend the commit with
|
|
<code>git</code> <code>codereview</code> <code>change</code>:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview change # amend current commit
|
|
(open $EDITOR)
|
|
$ git codereview mail # send new changes to Gerrit
|
|
</pre>
|
|
|
|
<p>
|
|
If you don't need to change the commit description, just save and exit from the editor.
|
|
Remember not to touch the special <code>Change-Id</code> line.
|
|
</p>
|
|
|
|
<p>
|
|
Make sure that you always keep a single commit in each branch. If you add more
|
|
commits by mistake, you can use <code>git rebase</code> to
|
|
<a href="https://stackoverflow.com/questions/31668794/squash-all-your-commits-in-one-before-a-pull-request-in-github">squash them together</a>
|
|
into a single one.
|
|
</p>
|
|
|
|
<h2 id="commit_messages">Writing good commit messages</h2>
|
|
|
|
<p>Commit messages in Go follow a specific convention. Read this chapter
|
|
to learn more about it. This is an example of a good one:
|
|
|
|
<pre>
|
|
math: improve Sin, Cos and Tan precision for very large arguments
|
|
|
|
The existing implementation has poor numerical properties for
|
|
large arguments, so use the McGillicutty algorithm to improve
|
|
accuracy above 1e10.
|
|
|
|
The algorithm is described at http://wikipedia.org/wiki/McGillicutty_Algorithm
|
|
|
|
Fixes #159
|
|
</pre>
|
|
|
|
</p>
|
|
|
|
<h3>First line</h3>
|
|
|
|
<p>
|
|
The first line of the change description is conventionally a short one-line
|
|
summary of the change, prefixed by the primary affected package.
|
|
|
|
<p>It should be written so to complete the sentence "This change modifies Go to _____."</p>
|
|
|
|
<h3>Main content</h3>
|
|
|
|
<p>The rest of the description elaborates and should provide context for the
|
|
change and explain what it does.
|
|
Write in complete sentences with correct punctuation, just like
|
|
for your comments in Go.
|
|
Don't use HTML, Markdown, or any other markup language.
|
|
</p>
|
|
|
|
<h3>Referencing issues</h3>
|
|
|
|
<p>
|
|
The special notation "Fixes #159" associates the change with issue 159 in the
|
|
<a href="https://golang.org/issue/159">Go issue tracker</a>.
|
|
When this change is eventually applied, the issue
|
|
tracker will automatically mark the issue as fixed.
|
|
</p>
|
|
|
|
<p>
|
|
If the change is a partial step towards the resolution of the issue,
|
|
uses the notation "Updates #159". This will leave a comment in the issue
|
|
linking back to the change in Gerrit, but it will not close the issue
|
|
when the change is applied.
|
|
</p>
|
|
|
|
<p>
|
|
If you are sending a change against a subrepository, you must use
|
|
the fully-qualified syntax supported by GitHub, to make sure the change is
|
|
linked to the issue in the main repository. The correct form is "Fixes golang/go#159".
|
|
</p>
|
|
|
|
|
|
<h2 id="review">The review process</h2>
|
|
|
|
<p>
|
|
This section explains the review process in details, and how to approach
|
|
reviews after a change was submitted.
|
|
</p>
|
|
|
|
|
|
<h3 id="mistakes">Common beginner mistakes</h3>
|
|
|
|
<p>
|
|
When a change is submitted to Gerrit, it is usually triaged in the next few days.
|
|
A maintainer will give a look and submit some initial review, that for first-time
|
|
contributors usually focus on basic cosmetics and common mistakes. For instance:
|
|
</p>
|
|
|
|
<ul>
|
|
<li>
|
|
Commit messages might not follow the <a href="#commit_messages">suggested
|
|
format</a>.
|
|
</li>
|
|
<li>
|
|
There might not be a linked GitHub issue. The vast majority of changes
|
|
require a linked issue that describes the bug or the feature that the change
|
|
fixes or implements, and consensus should have been reached on the tracker
|
|
to actually proceed with it. Gerrit reviews do not discuss the merit of the change,
|
|
just its implementation.
|
|
<br>Only very trivial or cosmetic changes will be accepted without a issue.
|
|
</li>
|
|
<li>
|
|
The change might have been submitted during the freeze phase, when the tree
|
|
is closed for some specific kind of change (eg: new features). In this case,
|
|
a maintainer might review the code with a line such as <code>R=go1.11</code>,
|
|
which means that it will be reviewed later when the tree opens for a new
|
|
development window. You can add <code>R=go1.XX</code> as a comment yourself
|
|
if you know that it's not the correct timeframe for the change and help the
|
|
maintainers.
|
|
</li>
|
|
</ul>
|
|
|
|
<h3 id="trybots">Trybots</h3>
|
|
|
|
<p>After an initial reading of your patch, maintainers will trigger trybots,
|
|
a cluster of servers that will run the full testsuite on several different
|
|
architectures. Most trybots run complete in a few minutes, and a link will
|
|
be posted in Gerrit where you can see the results.</p>
|
|
|
|
<p>If the trybot run fails, follow the link and check the full logs of the
|
|
platforms on which the tests failed. Try to understand what broke, and
|
|
update your patch. Maintainers will trigger a new trybot run to see
|
|
if the problem was fixed.</p>
|
|
|
|
<p>Sometimes, the tree can be broken on some platforms for a few hours; if
|
|
the failure in trybot logs doesn't seem related to your patch, go to the
|
|
<a href="https://build.golang.org">Build Dashboard</a> and check if the same
|
|
failures appears in the recent commits, on the same platform. In this case,
|
|
feel free to write a comment in Gerrit to mention that the failure is
|
|
unrelated to your change, to help maintainers understanding the situation.</p>
|
|
|
|
<h3 id="reviews">Reviews</h3>
|
|
|
|
<p>The Go team values very thorough reviews. Consider
|
|
each line comment like a ticket: you are expected to somehow "close" it
|
|
by acting on it, either by implementing the suggestion or convincing the
|
|
reviewer otherwise.</p>
|
|
|
|
<p>After you update the change, go through line comments and make sure
|
|
to reply on every one. You can click the "Done" button to reply
|
|
indicating that you've implemented the reviewer's suggestion; otherwise,
|
|
click on "Reply" and explain why you have not.</p>
|
|
|
|
<p>It is absolutely normal for changes to go through several round of reviews,
|
|
in which the reviewer make new comments every time and then wait for an updated
|
|
change to be uploaded. This also happens for experienced contributors, so
|
|
don't feel discouraged by it.</p>
|
|
|
|
<h3 id="votes">Voting conventions</h3>
|
|
|
|
<p>
|
|
At some point, reviewers will express a vote on your change. This is the
|
|
voting convention:
|
|
<ul>
|
|
<li><b>+2</b> The change is approved for being merged. Only Go maintainers
|
|
can cast a +2.</li>
|
|
<li><b>+1</b> The change looks good, but either the reviewer is requesting
|
|
more changes before approving it, or they are not a maintainer and cannot
|
|
approve it, but would like to encourage an approval.</li>
|
|
<li><b>-1</b> The change is not good the way it is. -1 are always casted
|
|
with a comment explaining the reason for it.</li>
|
|
<li><b>-2</b> The change is blocked by a maintainer and cannot be approved.
|
|
There will be a comment explaining the decision.</li>
|
|
</ul>
|
|
</p>
|
|
|
|
<h3 id="submit">Submitting an approved change</h3>
|
|
|
|
<p>
|
|
After the code has been +2'ed, an approver will
|
|
apply it to the master branch using the Gerrit UI. This is
|
|
called "submission".
|
|
</p>
|
|
|
|
<p>
|
|
The two steps are separate because in some cases maintainers
|
|
may want to approve it but not to submit it right away (e.g.
|
|
the tree could be temporarily frozen).
|
|
</p>
|
|
|
|
<p>
|
|
Submission checks the change into the repository.
|
|
The change description will include a link to the code review,
|
|
and the code review will be updated with a link to the change
|
|
in the repository.
|
|
Since the method used to integrate the changes is "Cherry Pick",
|
|
the commit hashes in the repository will be changed by
|
|
the "Submit" operation.
|
|
</p>
|
|
|
|
<p>If your change has been approved for a few days without being
|
|
submitted, feel free to write a comment in Gerrit requesting
|
|
submission.</p>
|
|
|
|
|
|
<h3 id="more_information">More information</h3>
|
|
|
|
<p>
|
|
In addition to the information here, the Go community maintains a <a
|
|
href="https://golang.org/wiki/CodeReview">CodeReview</a> wiki page.
|
|
Feel free to contribute to this page as you learn the review process.
|
|
</p>
|
|
|
|
|
|
|
|
<h2 id="advanced_topics">Advanced topics</h2>
|
|
|
|
<p>
|
|
This section contains more in-depth topics on how to contribute to Go. Read it to
|
|
get a better understanding of the contribution process.
|
|
</p>
|
|
|
|
|
|
<h3 id="copyright">Copyright headers</h3>
|
|
|
|
<p>
|
|
Files in the Go repository don't list author names, both to avoid clutter
|
|
and to avoid having to keep the lists up to date.
|
|
Instead, your name will appear in the
|
|
<a href="https://golang.org/change">change log</a> and in the <a
|
|
href="/CONTRIBUTORS"><code>CONTRIBUTORS</code></a> file and perhaps the <a
|
|
href="/AUTHORS"><code>AUTHORS</code></a> file.
|
|
These files are automatically generated from the commit logs periodically.
|
|
The <a href="/AUTHORS"><code>AUTHORS</code></a> file defines who “The Go
|
|
Authors”—the copyright holders—are.
|
|
</p>
|
|
|
|
<p>New files that you contribute should use the standard copyright header:</p>
|
|
|
|
<pre>
|
|
// Copyright 2018 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
</pre>
|
|
|
|
<p>
|
|
Files in the repository are copyright the year they are added.
|
|
Do not update the copyright year on files that you change.
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h3 id="troubleshooting_mail">Troubleshooting mail errors</h3>
|
|
|
|
<p>
|
|
The most common way that the <code>git</code> <code>codereview</code> <code>mail</code>
|
|
command fails is because the email address in the commit does not match the one
|
|
that you used during <a href="#google_account">the registration process</a>.
|
|
|
|
<br>
|
|
If you see something like...
|
|
</p>
|
|
|
|
<pre>
|
|
remote: Processing changes: refs: 1, done
|
|
remote:
|
|
remote: ERROR: In commit ab13517fa29487dcf8b0d48916c51639426c5ee9
|
|
remote: ERROR: author email address XXXXXXXXXXXXXXXXXXX
|
|
remote: ERROR: does not match your user account.
|
|
</pre>
|
|
|
|
<p>
|
|
You need to set this repo to use the email address that you registered with.
|
|
First, let's change the email address for this repo so this doesn't happen again.
|
|
You can change your email address for this repo with the following command:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git config user.email email@address.com
|
|
</pre>
|
|
|
|
<p>
|
|
Then change the commit to use this alternative email address.
|
|
You can do that with:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git commit --amend --author="Author Name <email@address.com>"
|
|
</pre>
|
|
|
|
<p>
|
|
Finally try to resend with:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview mail
|
|
</pre>
|
|
|
|
|
|
<h3 id="quicktest">Quickly testing your changes</h3>
|
|
|
|
<p>Running <code>all.bash</code> for every single change to the code tree
|
|
is burdensome. Even though it is strongly suggested to run it before
|
|
sending a change, during the normal development cycle you may want
|
|
to quickly compile and locally test your change.</p>
|
|
|
|
<ul>
|
|
<li>
|
|
In general, you can run <code>make.bash</code> instead of <code>all.bash</code>
|
|
to only rebuild the Go toolchain without running the whole testsuite. Or you
|
|
can run <code>run.bash</code> to only run the whole testsuite without rebuilding
|
|
the toolchain. You can think of <code>all.bash</code> as <code>make.bash</code>
|
|
followed by <code>run.bash</code>.
|
|
</li>
|
|
<li>The just-built compiler is in <code><GOCLONEDIR>/bin/go</code>; you
|
|
can run it directly to test whatever you want to test. For instance, if you
|
|
have modified the compiler and you want to test how it affects the
|
|
testsuite of your own project, just run <code>go</code> <code>test</code>
|
|
using it:
|
|
|
|
<pre>
|
|
$ cd <MYPROJECTDIR>
|
|
$ <GOCLONEDIR>/bin/go test
|
|
</pre>
|
|
</li>
|
|
|
|
<li>
|
|
If you're changing the standard library, you probably don't need to rebuild
|
|
the compiler: you can run the tests on the package you have changed.
|
|
You can either do that with whatever Go version you normally develop with, or
|
|
using the Go compiler built from your clone (which is
|
|
sometimes required because the standard library code you're modifying
|
|
might require a newer version than the stable one you have installed).
|
|
|
|
<pre>
|
|
$ cd <GOCLONEDIR>/src/hash/sha1
|
|
$ [make changes...]
|
|
$ <GOCLONEDIR>/bin/go test .
|
|
</pre>
|
|
</li>
|
|
|
|
<li>
|
|
If you're modyfing the compiler itself, you can just recompile
|
|
the <code>compile</code> tool (which is the internal binary invoked
|
|
by <code>go</code> <code>build</code> to compile each single package).
|
|
After that, you will want to test it by compiling or running something.
|
|
|
|
<pre>
|
|
$ cd <GOCLONEDIR>/src
|
|
$ [make changes...]
|
|
$ <GOCLONEDIR>/bin/go install cmd/compile
|
|
$ <GOCLONEDIR>/bin/go build [something...] # test the new compiler
|
|
$ <GOCLONEDIR>/bin/go run [something...] # test the new compiler
|
|
$ <GOCLONEDIR>/bin/go test [something...] # test the new compiler
|
|
</pre>
|
|
|
|
The same applies to other internal tools of the Go toolchain,
|
|
such as <code>asm</code>, <code>cover</code>, <code>link</code>,
|
|
etc. Just recompile and install the tool using <code>go</code>
|
|
<code>install</code> <code>cmd/<TOOL></code> and then use
|
|
the built Go binary to test it.
|
|
</li>
|
|
|
|
<li>
|
|
In addition to the standard per-package tests, there is a top-level
|
|
testsuite in <code><GOCLONEDIR>/test</code> that contains
|
|
several black-box and regression tests. The testsuite is run
|
|
by <code>all.bash</code> but you can also run it manually:
|
|
|
|
<pre>
|
|
$ cd <GOCLONEDIR>/test
|
|
$ go run run.go
|
|
</pre>
|
|
|
|
Note that this will use the Go compiler found in <code>PATH</code>.
|
|
</ul>
|
|
|
|
<h3 id="subrepos">Contributing to subrepositories (golang.org/x/...)</h3>
|
|
|
|
<p>
|
|
If you are contributing a change to a subrepository, obtain the
|
|
Go package using <code>go get</code>. For example, to contribute
|
|
to <code>golang.org/x/oauth2</code>, check out the code by running:
|
|
</p>
|
|
|
|
<pre>
|
|
$ go get -d golang.org/x/oauth2/...
|
|
</pre>
|
|
|
|
<p>
|
|
Then, change your directory to the package's source directory
|
|
(<code>$GOPATH/src/golang.org/x/oauth2</code>), and follow the
|
|
normal contribution flow.
|
|
</p>
|
|
|
|
|
|
|
|
<h3 id="cc">Specifying a reviewer / CCing others</h3>
|
|
|
|
<p>
|
|
Unless explicitly told otherwise, such as in the discussion leading
|
|
up to sending in the change, it's better not to specify a reviewer.
|
|
All changes are automatically CC'ed to the
|
|
<a href="https://groups.google.com/group/golang-codereviews">golang-codereviews@googlegroups.com</a>
|
|
mailing list. If this is your first ever change, there may be a moderation
|
|
delay before it appears on the mailing list, to prevent spam.
|
|
</p>
|
|
|
|
<p>
|
|
You can specify a reviewer or CC interested parties
|
|
using the <code>-r</code> or <code>-cc</code> options.
|
|
Both accept a comma-separated list of email addresses:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview mail -r joe@golang.org -cc mabel@example.com,math-nuts@swtch.com
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h3 id="sync">Synchronize your client</h3>
|
|
|
|
<p>
|
|
While you were working, others might have submitted changes to the repository.
|
|
To update your local branch, run
|
|
</p>
|
|
|
|
<pre>
|
|
$ git sync
|
|
</pre>
|
|
|
|
<p>
|
|
(In git terms, <code>git</code> <code>sync</code> runs
|
|
<code>git</code> <code>pull</code> <code>-r</code>.)
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<h3 id="download">Reviewing code by others</h3>
|
|
|
|
<p>
|
|
As part of the review process reviewers can propose changes directly (in the
|
|
GitHub workflow this would be someone else attaching commits to a pull request).
|
|
|
|
You can import these changes proposed by someone else into your local Git repository.
|
|
On the Gerrit review page, click the "Download ▼" link in the upper right
|
|
corner, copy the "Checkout" command and run it from your local Git repo. It
|
|
should look something like this:
|
|
</p>
|
|
|
|
<pre>
|
|
$ git fetch https://go.googlesource.com/review refs/changes/21/1221/1 && git checkout FETCH_HEAD
|
|
</pre>
|
|
|
|
<p>
|
|
To revert, change back to the branch you were working in.
|
|
</p>
|
|
|
|
|
|
<h3 id="git-config">Set up git aliases</h2>
|
|
|
|
<p>
|
|
The <code>git-codereview</code> command can be run directly from the shell
|
|
by typing, for instance,
|
|
</p>
|
|
|
|
<pre>
|
|
$ git codereview sync
|
|
</pre>
|
|
|
|
<p>
|
|
but it is more convenient to set up aliases for <code>git-codereview</code>'s own
|
|
subcommands, so that the above becomes,
|
|
</p>
|
|
|
|
<pre>
|
|
$ git sync
|
|
</pre>
|
|
|
|
<p>
|
|
The <code>git-codereview</code> subcommands have been chosen to be distinct from
|
|
Git's own, so it's safe to do so. To install them, copy this text into your
|
|
Git configuration file (usually <code>.gitconfig</code> in your home directory):
|
|
</p>
|
|
|
|
<pre>
|
|
[alias]
|
|
change = codereview change
|
|
gofmt = codereview gofmt
|
|
mail = codereview mail
|
|
pending = codereview pending
|
|
submit = codereview submit
|
|
sync = codereview sync
|
|
</pre>
|
|
|
|
|
|
<h3 id="multiple_changes">Sending multiple dependent changes</h3>
|
|
|
|
<p>Gerrit allows for changes to be dependent on each other, forming a dependency chain.
|
|
This is an indication for maintainers to better review your code, even though each
|
|
change will technically need to be approved and submitted separately.</p>
|
|
|
|
<p>To submit a group of dependent changes, keep each change as a different commit under
|
|
the same branch, and then run:
|
|
|
|
<pre>
|
|
$ git codereview mail HEAD
|
|
</pre>
|
|
|
|
Make sure to explicitly specify <code>HEAD</code>, which is usually not required when sending
|
|
single changes.</p>
|