mirror of
				https://github.com/golang/go.git
				synced 2025-11-04 02:30:57 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			530 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			530 lines
		
	
	
	
		
			16 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!-- Contributing to the Go project -->
 | 
						|
 | 
						|
<h2 id="Introduction">Introduction</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
This document explains how to contribute changes to the Go project.
 | 
						|
It assumes you have installed Go using the
 | 
						|
<a href="install.html">installation instructions</a> and
 | 
						|
have <a href="code.html">written and tested your code</a>.
 | 
						|
(Note that the <code>gccgo</code> frontend lives elsewhere;
 | 
						|
see <a href="gccgo_contribute.html">Contributing to gccgo</a>.)
 | 
						|
</p>
 | 
						|
 | 
						|
<h2 id="Design">Discuss your design</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
The project welcomes submissions but please let everyone know what
 | 
						|
you're working on if you want it to become part of the main repository.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Before undertaking to write something new for the Go project, send
 | 
						|
mail to the <a href="http://groups.google.com/group/golang-nuts">mailing
 | 
						|
list</a> to discuss what you plan to do.  This 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 guarantees that the design is sound before code
 | 
						|
is written; the code review tool is not the place for high-level
 | 
						|
discussions.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
In short, send mail before you code.
 | 
						|
And don't start the discussion by mailing a change list!
 | 
						|
</p>
 | 
						|
 | 
						|
<h2 id="Testing">Testing redux</h2>
 | 
						|
 | 
						|
<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 $GOROOT/src
 | 
						|
./all.bash
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
The final line printed by <code>make all</code> should be of the form:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
<i>N</i> known bugs; 0 unexpected bugs
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
The value of <i>N</i> varies over time, but the line must
 | 
						|
say “<code>0 unexpected bugs</code>” and must not
 | 
						|
add “<code>test output differs</code>.”
 | 
						|
</p>
 | 
						|
 | 
						|
 | 
						|
<h2 id="Code_review">Code review</h2>
 | 
						|
 | 
						|
<p>
 | 
						|
Changes to Go must be reviewed before they are submitted,
 | 
						|
no matter who makes the change.
 | 
						|
(In exceptional cases, such as fixing a build, the review can
 | 
						|
follow shortly after submitting.)
 | 
						|
A Mercurial extension helps manage the code review process.
 | 
						|
The extension is included in the Go source tree but needs
 | 
						|
to be added to your Mercurial configuration.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Caveat for Mercurial aficionados</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
<i>Using Mercurial with the code review extension is not the same
 | 
						|
as using standard Mercurial.</i>
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The Go repository is maintained as a single line of reviewed changes;
 | 
						|
we prefer to avoid the complexity of Mercurial's arbitrary change graph.
 | 
						|
The code review extension helps here: its <code>hg submit</code> command
 | 
						|
automatically checks for and warns about the local repository
 | 
						|
being out of date compared to the remote one.
 | 
						|
The <code>hg submit</code> command also verifies other
 | 
						|
properties about the Go repository.
 | 
						|
For example,
 | 
						|
it checks that Go code being checked in is formatted in the standard style,
 | 
						|
as defined by <a href="/cmd/gofmt">gofmt</a>,
 | 
						|
and it checks that the author of the code is properly recorded for
 | 
						|
<a href="#copyright">copyright purposes</a>.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
To help ensure changes are only created by <code>hg submit</code>,
 | 
						|
the code review extension disables the standard <code>hg commit</code>
 | 
						|
command.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Mercurial power users: To allow Go contributors to take advantage of
 | 
						|
Mercurial's functionality for local revision control, it might be interesting
 | 
						|
to explore how the code review extension can be made to work alongside
 | 
						|
the Mercurial Queues extension.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Configure the extension</h3>
 | 
						|
 | 
						|
<p>Edit <code>$GOROOT/.hg/hgrc</code> to add:</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
[extensions]
 | 
						|
codereview = YOUR_GO_ROOT/lib/codereview/codereview.py
 | 
						|
 | 
						|
[ui]
 | 
						|
username = Your Name <you@server.dom>
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>Replace YOUR_GO_ROOT with the value of <code>$GOROOT</code>.
 | 
						|
The Mercurial configuration file format does not allow environment variable substitution.
 | 
						|
The <code>username</code> information will not be used unless
 | 
						|
you are a committer (see below), but Mercurial complains if it is missing.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Log in to the code review site.</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
The code review server uses a Google Account to authenticate.
 | 
						|
(If you can use the account to
 | 
						|
<a href="https://www.google.com/accounts/Login?hl=en&continue=http://www.google.com/">sign in at google.com</a>,
 | 
						|
you can use it to sign in to the code review server.
 | 
						|
The email address you use on the Code Review site
 | 
						|
will be recorded in the <a href="http://code.google.com/p/go/source/list">Mercurial change log</a>
 | 
						|
and in the <a href="/CONTRIBUTORS"><code>CONTRIBUTORS</code></a> file.
 | 
						|
You can <a href="https://www.google.com/accounts/NewAccount">create a Google Account</a>
 | 
						|
associated with any address where you receive email.
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ cd $GOROOT
 | 
						|
$ hg code-login
 | 
						|
Email (login for uploading to codereview.appspot.com): rsc@golang.org
 | 
						|
Password for rsc@golang.org:
 | 
						|
 | 
						|
Saving authentication cookies to /Users/rsc/.codereview_upload_cookies_codereview.appspot.com
 | 
						|
</pre>
 | 
						|
 | 
						|
<h3>Configure your account settings.</h3>
 | 
						|
 | 
						|
<p>Edit your <a href="http://codereview.appspot.com/settings">code review settings</a>.
 | 
						|
Grab a nickname.
 | 
						|
Many people prefer to set the Context option to
 | 
						|
“Whole file” to see more context when reviewing changes.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>Once you have chosen a nickname in the settings page, others
 | 
						|
can use that nickname as a shorthand for naming reviewers and the CC list.
 | 
						|
For example, <code>rsc</code> is an alias for <code>rsc@golang.org</code>.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Make a change</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
The entire checked-out tree is writable.
 | 
						|
If you need to edit files, just edit them: Mercurial will figure out which ones changed.
 | 
						|
You do need to inform Mercurial of added, removed, copied, or renamed files,
 | 
						|
by running
 | 
						|
<code>hg add</code>,
 | 
						|
<code>hg rm</code>,
 | 
						|
<code>hg cp</code>,
 | 
						|
or
 | 
						|
<code>hg mv</code>.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>When you are ready to send a change out for review, run</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg change
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>from any directory in your Go repository.
 | 
						|
Mercurial will open a change description file in your editor.
 | 
						|
(It uses the editor named by the <code>$EDITOR</code> environment variable, <code>vi</code> by default.)
 | 
						|
The file will look like:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
# Change list.
 | 
						|
# Lines beginning with # are ignored.
 | 
						|
# Multi-line values should be indented.
 | 
						|
 | 
						|
Reviewer:
 | 
						|
CC:
 | 
						|
 | 
						|
Description:
 | 
						|
	<enter description here>
 | 
						|
 | 
						|
Files:
 | 
						|
	src/pkg/math/sin.go
 | 
						|
	src/pkg/math/tan.go
 | 
						|
	src/pkg/regexp/regexp.go
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
The <code>Reviewer</code> line lists the reviewers assigned
 | 
						|
to this change, and the <code>CC</code> line lists people to
 | 
						|
notify about the change.
 | 
						|
These can be code review nicknames or arbitrary email addresses.
 | 
						|
If you don't know who is best to review the change, set the
 | 
						|
reviewer field to the
 | 
						|
<a href="http://groups.google.com/group/golang-dev">golang-dev@googlegroups.com</a>
 | 
						|
mailing list.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Replace “<code><enter description here></code>”
 | 
						|
with a description of your change.
 | 
						|
The first line of the change description is conventionally
 | 
						|
a one-line summary of the change and is used as the
 | 
						|
subject for code review mail; the rest of the
 | 
						|
description elaborates.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The <code>Files</code> section lists all the modified files
 | 
						|
in your client.
 | 
						|
It is best to keep unrelated changes in different change lists.
 | 
						|
In this example, we can include just the changes to package <code>math</code>
 | 
						|
by deleting the line mentioning <code>regexp.go</code>.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
After editing, the template might now read:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
# Change list.
 | 
						|
# Lines beginning with # are ignored.
 | 
						|
# Multi-line values should be indented.
 | 
						|
 | 
						|
Reviewer: golang-dev@googlegroups.com
 | 
						|
CC: math-nuts@swtch.com
 | 
						|
 | 
						|
Description:
 | 
						|
	Sin, Cos, Tan: improved precision for very large arguments
 | 
						|
 | 
						|
	See Bimmler and Shaney, ``Extreme sinusoids,'' J. Math 3(14).
 | 
						|
	Fixes issue 159.
 | 
						|
 | 
						|
Files:
 | 
						|
	src/pkg/math/sin.go
 | 
						|
	src/pkg/math/tan.go
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
The special sentence “Fixes issue 159.” associates
 | 
						|
the change with issue 159 in the <a href="http://code.google.com/p/go/issues/list">Go issue tracker</a>.
 | 
						|
When this change is eventually submitted, the issue
 | 
						|
tracker will automatically mark the issue as fixed.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
Save the file and exit the editor.</p>
 | 
						|
 | 
						|
<p>
 | 
						|
The code review server assigns your change an issue number and URL,
 | 
						|
which <code>hg change</code> will print, something like:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
CL created: http://codereview.appspot.com/99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
If you need to re-edit the change description,
 | 
						|
run <code>hg change 99999</code>.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
You can see a list of your pending changes by running <code>hg pending</code> (<code>hg p</code> for short).
 | 
						|
</p>
 | 
						|
 | 
						|
 | 
						|
<h3>Synchronize your client</h3>
 | 
						|
 | 
						|
<p>While you were working, others might have submitted changes
 | 
						|
to the repository.  To update your client, run</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg sync
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>(For Mercurial fans, <code>hg sync</code> runs <code>hg pull -u</code>
 | 
						|
but then also synchronizes the local change list state against the new data.)</p>
 | 
						|
 | 
						|
<p>
 | 
						|
If files you were editing have changed, Mercurial does its best to merge the
 | 
						|
remote changes into your local changes.  It may leave some files to merge by hand.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
For example, suppose you have edited <code>flag_test.go</code> but
 | 
						|
someone else has committed an independent change.
 | 
						|
When you run <code>hg sync</code>, you will get the (scary-looking) output
 | 
						|
(emphasis added):
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg sync
 | 
						|
adding changesets
 | 
						|
adding manifests
 | 
						|
adding file changes
 | 
						|
added 1 changeset with 2 changes to 2 files
 | 
						|
getting src/pkg/flag/flag.go
 | 
						|
couldn't find merge tool hgmerge
 | 
						|
merging src/pkg/flag/flag_test.go
 | 
						|
warning: conflicts during merge.
 | 
						|
<i>merging src/pkg/flag/flag_test.go failed!</i>
 | 
						|
1 file updated, 0 files merged, 0 files removed, 1 file unresolved
 | 
						|
use 'hg resolve' to retry unresolved file merges
 | 
						|
$
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
The only important part in that transcript is the italicized line:
 | 
						|
Mercurial failed to merge your changes with the independent change.
 | 
						|
When this happens, Mercurial leaves both edits in the file,
 | 
						|
marked by <code><<<<<<<</code> and
 | 
						|
<code>>>>>>>></code>.
 | 
						|
it is now your job to edit the file to combine them.
 | 
						|
Continuing the example, searching for those strings in <code>flag_test.go</code>
 | 
						|
might turn up:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
	VisitAll(visitor);
 | 
						|
<<<<<<< local
 | 
						|
	if len(m) != 7 {
 | 
						|
=======
 | 
						|
	if len(m) != 8 {
 | 
						|
>>>>>>> other
 | 
						|
		t.Error("VisitAll misses some flags");
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
Mercurial doesn't show it, but suppose the original text that both edits
 | 
						|
started with was 6; you added 1 and the other change added 2,
 | 
						|
so the correct answer might now be 9.  First, edit the section
 | 
						|
to remove the markers and leave the correct code:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
	VisitAll(visitor);
 | 
						|
	if len(m) != 9 {
 | 
						|
		t.Error("VisitAll misses some flags");
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
Then ask Mercurial to mark the conflict as resolved:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg resolve -m flag_test.go
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
If you had been editing the file, say for debugging, but do not
 | 
						|
care to preserve your changes, you can run
 | 
						|
<code>hg revert flag_test.go</code> to abandon your
 | 
						|
changes, but you may still need to run
 | 
						|
<code>hg resolve -m</code> to mark the conflict resolved.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Mail the change for review</h3>
 | 
						|
 | 
						|
<p>To send out a change for review, run <code>hg mail</code> using the change list number
 | 
						|
assigned during <code>hg change</code>:</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg mail 99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>You can add to the <code>Reviewer:</code> and <code>CC:</code> lines
 | 
						|
using the <code>-r</code> or <code>--cc</code> options.
 | 
						|
In the above example, we could have left the <code>Reviewer</code> and <code>CC</code>
 | 
						|
lines blank and then run:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg mail -r golang-dev@googlegroups.com --cc math-nuts@swtch.com 99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>to achieve the same effect.</p>
 | 
						|
 | 
						|
<p>Note that <code>-r</code> and <code>--cc</code> cannot be spelled <code>--r</code> or <code>-cc</code>.</p>
 | 
						|
 | 
						|
 | 
						|
<h3>Reviewing code</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
Running <code>hg mail</code> will send an email to you and the reviewers
 | 
						|
asking them to visit the issue's URL and make coments on the change.
 | 
						|
When done, the reviewer clicks “Publish and Mail comments”
 | 
						|
to send comments back.
 | 
						|
</p>
 | 
						|
 | 
						|
 | 
						|
<h3>Revise and upload</h3>
 | 
						|
 | 
						|
<p>You will probably revise your code in response to the reviewer comments.
 | 
						|
When you have revised the code and are ready for another round of review, run
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg mail 99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>again to upload the latest copy and send mail asking the reviewers to please take another look
 | 
						|
(<code>PTAL</code>).
 | 
						|
You might also visit the code review web page and reply to the comments,
 | 
						|
letting the reviewer know that you've addressed them or explain why you
 | 
						|
haven't.  When you're done replying, click “Publish and Mail comments”
 | 
						|
to send the line-by-line replies and any other comments.
 | 
						|
</p>
 | 
						|
<p>
 | 
						|
The reviewer can comment on the new copy, and the process repeats.
 | 
						|
The reviewer approves the change by replying with a mail that says
 | 
						|
<code>LGTM</code>: looks good to me.
 | 
						|
</p>
 | 
						|
 | 
						|
<h3>Submit the change after the review</h3>
 | 
						|
 | 
						|
<p>
 | 
						|
After the code has been <code>LGTM</code>'ed, it is time to submit
 | 
						|
it to the Mercurial repository.
 | 
						|
If you are a committer, you can run:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg submit 99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
This 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.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>
 | 
						|
If your local copy of the repository is out of date,
 | 
						|
<code>hg submit</code>
 | 
						|
will refuse the change:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg submit 99999
 | 
						|
local repository out of date; must sync before submit
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>
 | 
						|
If you are not a committer, you cannot submit the change directly.
 | 
						|
Instead, a committer, usually the reviewer who said <code>LGTM</code>,
 | 
						|
will run:
 | 
						|
</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
$ hg clpatch 99999
 | 
						|
$ hg submit 99999
 | 
						|
</pre>
 | 
						|
 | 
						|
<p>The <code>clpatch</code> command imports your change 99999 into
 | 
						|
the committer's local Mercurial client, at which point the committer
 | 
						|
can check or test the code more.
 | 
						|
(Anyone can run <code>clpatch</code> to try a change that
 | 
						|
has been uploaded to the code review server.)
 | 
						|
The <code>submit</code> command submits the code.  You will be listed as the
 | 
						|
author, but the change message will also indicate who the committer was.
 | 
						|
Your local client will notice that the change has been submitted
 | 
						|
when you next run <code>hg sync</code>.
 | 
						|
</p>
 | 
						|
 | 
						|
 | 
						|
<h3 id="copyright">Copyright</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="http://code.google.com/p/go/source/list">Mercurial 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.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>The <a href="/CONTRIBUTORS"><code>CONTRIBUTORS</code></a> file
 | 
						|
defines who the Go contributors—the people—are;
 | 
						|
the <a href="/AUTHORS"><code>AUTHORS</code></a> file, which defines
 | 
						|
who “The Go Authors”—the copyright holders—are.
 | 
						|
The Go developers at Google will update these files when submitting
 | 
						|
your first change.
 | 
						|
In order for them to do that, you need to have completed one of the
 | 
						|
contributor license agreements:
 | 
						|
<ul>
 | 
						|
<li>
 | 
						|
If you are the copyright holder, you will need to agree to
 | 
						|
the <a href="http://code.google.com/legal/individual-cla-v1.0.html">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="http://code.google.com/legal/corporate-cla-v1.0.html">corporate contributor license agreement</a>.
 | 
						|
(If the copyright holder for your code has already completed the
 | 
						|
agreement in connection with another Google open source project,
 | 
						|
it does not need to be completed again.)
 | 
						|
</li>
 | 
						|
</ul>
 | 
						|
 | 
						|
<p>
 | 
						|
This rigmarole needs to be done only for your first submission.
 | 
						|
</p>
 | 
						|
 | 
						|
<p>Code that you contribute should use the standard copyright header:</p>
 | 
						|
 | 
						|
<pre>
 | 
						|
// Copyright 2010 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>
 |