86caf9ec23
We cannot guarantee that secondary index implementations (particularly the one used by googlesource.com) can efficiently paginate based on the sortkey, and in particular can both sort and reverse sort on the same field. This particular performance issue notwithstanding, searching is now generally fast enough that it is feasible just to skip the first N results when doing pagination. Add an option S= to QueryChanges to support starting at a nonzero offset. Note that we still have to fetch n+S results from the index in order to do visibility filtering, since if we skipped at the index layer we wouldn't know how many of the skipped elements would have matched later filtering. Drop the sortkey token suffix from the legacy anchor parser; there is no reliable way to convert it to an offset, and it's unlikely that users have permalinks to specific sortkey values. On the server side, remove the sortkey field from the current index version, and use pagination by offset instead of sortkey in the new version only. Continue to support sortkey queries against old index versions, to support online reindexing while clients have an older JS version. Change-Id: I6a82965db02c4d534e2107ca6ec91217085124d6
291 lines
12 KiB
Plaintext
291 lines
12 KiB
Plaintext
= Gerrit Code Review - Contributing
|
|
|
|
Gerrit is developed as a self-hosting open source project and
|
|
very much welcomes contributions from anyone with a contributor's
|
|
agreement on file with the project.
|
|
|
|
* https://gerrit-review.googlesource.com/
|
|
|
|
A Contributor License Agreement must be completed before contributions
|
|
are accepted. To view and accept the agreements do the following:
|
|
|
|
* Click "Sign In" at the top right corner of https://gerrit-review.googlesource.com/
|
|
* Sign In with your Google account
|
|
* After signing in, go to https://gerrit-review.googlesource.com/#/settings/agreements
|
|
* Click "New Contributor Agreement" and follow the instructions
|
|
|
|
For reference, the actual agreements are linked below
|
|
|
|
* https://gerrit-review.googlesource.com/static/cla_individual.html
|
|
* https://gerrit-review.googlesource.com/static/cla_corporate.html
|
|
|
|
As Gerrit is a code review tool, naturally contributions will
|
|
be reviewed before they will get submitted to the code base. To
|
|
start your contribution, please make a git commit and upload it
|
|
for review to the main Gerrit review server. To help speed up the
|
|
review of your change, review these guidelines before submitting
|
|
your change. You can view the pending Gerrit contributions and
|
|
their statuses here:
|
|
|
|
* https://gerrit-review.googlesource.com/#/q/status:open+project:gerrit
|
|
|
|
Depending on the size of that list it might take a while for
|
|
your change to get reviewed. Naturally there are fewer
|
|
approvers than contributors; so anything that you can do to
|
|
ensure that your contribution will undergo fewer revisions
|
|
will speed up the contribution process. This includes helping
|
|
out reviewing other people's changes to relieve the load from
|
|
the approvers. Even if you are not familiar with Gerrit's
|
|
internals, it would be of great help if you can download, try
|
|
out, and comment on new features. If it works as advertised,
|
|
say so, and if you have the privileges to do so, go ahead
|
|
and give it a +1 Verified. If you would find the feature
|
|
useful, say so and give it a +1 code review.
|
|
|
|
And finally, the quicker you respond to the comments of your
|
|
reviewers, the quicker your change might get merged! Try to
|
|
reply to every comment after submitting your new patch,
|
|
particularly if you decided against making the suggested change.
|
|
Reviewers don't want to seem like nags and pester you if you
|
|
haven't replied or made a fix, so it helps them know if you
|
|
missed it or decided against it.
|
|
|
|
|
|
== Review Criteria
|
|
|
|
Here are some hints as to what approvers may be looking for
|
|
before approving or submitting changes to the Gerrit project.
|
|
Let's start with the simple nit picky stuff. You are likely
|
|
excited that your code works; help us share your excitement
|
|
by not distracting us with the simple stuff. Thanks to Gerrit,
|
|
problems are often highlighted and we find it hard to look
|
|
beyond simple spacing issues. Blame it on our short attention
|
|
spans, we really do want your code.
|
|
|
|
|
|
[[commit-message]]
|
|
== Commit Message
|
|
|
|
It is essential to have a good commit message if you want your
|
|
change to be reviewed.
|
|
|
|
* Keep lines no longer than 72 chars
|
|
* Start with a short one line summary
|
|
* Followed by a blank line
|
|
* Followed by one or more explanatory paragraphs
|
|
* Use the present tense (fix instead of fixed)
|
|
* Use the past tense when describing the status before this commit
|
|
* Include a Bug: Issue <#> line if fixing a Gerrit issue
|
|
* Include a Change-Id line
|
|
|
|
|
|
=== A sample good Gerrit commit message:
|
|
====
|
|
Add sample commit message to guidelines doc
|
|
|
|
The original patch set for the contributing guidelines doc did not
|
|
include a sample commit message, this new patchset does. Hopefully this
|
|
makes things a bit clearer since examples can sometimes help when
|
|
explanations don't.
|
|
|
|
Note that the body of this commit message can be several paragraphs, and
|
|
that I word wrap it at 72 characters. Also note that I keep the summary
|
|
line under 50 characters since it is often truncated by tools which
|
|
display just the git summary.
|
|
|
|
Bug: Issue 98765605
|
|
Change-Id: Ic4a7c07eeb98cdeaf44e9d231a65a51f3fceae52
|
|
====
|
|
|
|
The Change-Id is, as usual, created by a local git hook. To install it, simply
|
|
copy it from the checkout and make it executable:
|
|
|
|
====
|
|
cp ./gerrit-server/src/main/resources/com/google/gerrit/server/tools/root/hooks/commit-msg .git/hooks/
|
|
chmod +x .git/hooks/commit-msg
|
|
====
|
|
|
|
If you are working on core plugins, you will also need to install the
|
|
same hook in the submodules:
|
|
|
|
====
|
|
export hook=$(pwd)/.git/hooks/commit-msg
|
|
git submodule foreach 'cp -p "$hook" "$(git rev-parse --git-dir)/hooks/"'
|
|
====
|
|
|
|
|
|
To set up git's remote for easy pushing, run the following:
|
|
|
|
====
|
|
git remote add gerrit https://gerrit.googlesource.com/gerrit
|
|
====
|
|
|
|
The HTTPS access requires proper username and password; this can be obtained
|
|
by clicking the "Obtain Password" link on the
|
|
link:https://gerrit-review.googlesource.com/#/settings/http-password[HTTP
|
|
Password tab of the user settings page].
|
|
|
|
|
|
== Style
|
|
|
|
The basic coding style is covered by the tools/GoogleFormat.xml
|
|
doc, see the link:dev-eclipse.html#Formatting[Eclipse Setup]
|
|
for that.
|
|
|
|
Highlighted/additional styling notes:
|
|
|
|
* It is generally more important to match the style of the nearby
|
|
code which you are modifying than it is to match the style
|
|
in the formatting guidelines. This is especially true within the
|
|
same file.
|
|
* Review your change in Gerrit to see if it highlights
|
|
mistakenly deleted/added spaces on lines, trailing spaces.
|
|
* Line length should be 80 or less, unless the code reads
|
|
better with something slightly longer. Shorter lines not only
|
|
help reviewers who may use a tablet to review the code, but future
|
|
contributors may also like to open several editors side by
|
|
side while editing new changes.
|
|
* Use 2 spaces for indent (no tabs)
|
|
* Use brackets in all ifs, spaces before/after if parens.
|
|
* Use /** */ style Javadocs for variables.
|
|
|
|
Additionally, you will notice that most of the newline spacing
|
|
is fairly consistent throughout the code in Gerrit, it helps to
|
|
stick to the blank line conventions. Here are some specific
|
|
examples:
|
|
|
|
* Keep a blank line between all class and method declarations.
|
|
* Do not add blank lines at the beginning or end of class/methods.
|
|
* Put a blank line between external import sources, but not
|
|
between internal ones.
|
|
|
|
|
|
== Code Organization
|
|
|
|
Do your best to organize classes and methods in a logical way.
|
|
Here are some guidelines that Gerrit uses:
|
|
|
|
* Ensure a standard copyright header is included at the top
|
|
of any new files (copy it from another file, update the year).
|
|
* Always place loggers first in your class!
|
|
* Define any static interfaces next in your class.
|
|
* Define non static interfaces after static interfaces in your
|
|
class.
|
|
* Next you should define static types and members.
|
|
* Finally instance members, then constructors, and then instance
|
|
methods.
|
|
* Some common exceptions are private helper static methods which
|
|
might appear near the instance methods which they help.
|
|
* Getters and setters for the same instance field should usually
|
|
be near each other baring a good reason not to.
|
|
* If you are using assisted injection, the factory for your class
|
|
should be before the instance members.
|
|
* Annotations should go before language keywords (final, private...) +
|
|
Example: @Assisted @Nullable final type varName
|
|
* Imports should be mostly alphabetical (uppercase sorts before
|
|
all lowercase, which means classes come before packages at the
|
|
same level).
|
|
|
|
Wow that's a lot! But don't worry, you'll get the habit and most
|
|
of the code is organized this way already; so if you pay attention
|
|
to the class you are editing you will likely pick up on it.
|
|
Naturally new classes are a little harder; you may want to come
|
|
back and consult this section when creating them.
|
|
|
|
|
|
== Design
|
|
|
|
Here are some design level objectives that you should keep in mind
|
|
when coding:
|
|
|
|
* ORM entity objects should match exactly one row in the database.
|
|
* Most client pages should perform only one RPC to load so as to
|
|
keep latencies down. Exceptions would apply to RPCs which need
|
|
to load large data sets if splitting them out will help the
|
|
page load faster. Generally page loads are expected to complete
|
|
in under 100ms. This will be the case for most operations,
|
|
unless the data being fetched is not using Gerrit's caching
|
|
infrastructure. In these slower cases, it is worth considering
|
|
mitigating this longer load by using a second RPC to fill in
|
|
this data after the page is displayed (or alternatively it might
|
|
be worth proposing caching this data).
|
|
* @Inject should be used on constructors, not on fields. The
|
|
current exceptions are the ssh commands, these were implemented
|
|
earlier in Gerrit's development. To stay consistent, new ssh
|
|
commands should follow this older pattern; but eventually these
|
|
should get converted to eliminate this exception.
|
|
* Don't leave repository objects (git or schema) open. A .close()
|
|
after every open should be placed in a finally{} block.
|
|
* Don't leave UI components, which can cause new actions to occur,
|
|
enabled during RPCs which update the DB. This is to prevent
|
|
people from submitting actions more than once when operating
|
|
on slow links. If the action buttons are disabled, they cannot
|
|
be resubmitted and the user can see that Gerrit is still busy.
|
|
* GWT EventBus is the new way forward.
|
|
* ...and so is Guava (previously known as Google Collections).
|
|
|
|
|
|
== Tests
|
|
|
|
* Tests for new code will greatly help your change get approved.
|
|
|
|
|
|
== Change Size/Number of Files Touched
|
|
|
|
And finally, I probably cannot say enough about change sizes.
|
|
Generally, smaller is better, hopefully within reason. Do try to
|
|
keep things which will be confusing on their own together,
|
|
especially if changing one without the other will break something!
|
|
|
|
* If a new feature is implemented and it is a larger one, try to
|
|
identify if it can be split into smaller logical features; when
|
|
in doubt, err on the smaller side.
|
|
* Separate bug fixes from feature improvements. The bug fix may
|
|
be an easy candidate for approval and should not need to wait
|
|
for new features to be approved. Also, combining the two makes
|
|
reviewing harder since then there is no clear line between the
|
|
fix and the feature.
|
|
* Separate supporting refactoring from feature changes. If your
|
|
new feature requires some refactoring, it helps to make the
|
|
refactoring a separate change which your feature change
|
|
depends on. This way, reviewers can easily review the refactor
|
|
change as a something that should not alter the current
|
|
functionality, and feel more confident they can more easily
|
|
spot errors this way. Of course, it also makes it easier to
|
|
test and locate later on if an unfortunate error does slip in.
|
|
Lastly, by not having to see refactoring changes at the same
|
|
time, it helps reviewers understand how your feature changes
|
|
the current functionality.
|
|
* Separate logical features into separate changes. This
|
|
is often the hardest part. Here is an example: when adding a
|
|
new ability, make separate changes for the UI and the ssh
|
|
commands if possible.
|
|
* Do only what the commit message describes. In other words, things which
|
|
are not strictly related to the commit message shouldn't be part of
|
|
a change, even trivial things like externalizing a string somewhere
|
|
or fixing a typo. This help keep "git blame" more useful in the future
|
|
and it also makes "git revert" more useful.
|
|
* Use topic branches to link your separate changes together.
|
|
|
|
[[process]]
|
|
== Process
|
|
|
|
=== Backporting to stable branches
|
|
|
|
From time to time bug fix releases are made for existing stable branches.
|
|
|
|
Developers concerned with stable branches are encouraged to backport or push
|
|
patchsets to these branches, even if no new release is planned.
|
|
|
|
Fixes that are known to be needed for a particular release should be pushed
|
|
for review on that release's stable branch. It will then be included in
|
|
the master branch when the stable branch is merged back.
|
|
|
|
|
|
GERRIT
|
|
------
|
|
Part of link:index.html[Gerrit Code Review]
|
|
|
|
SEARCHBOX
|
|
---------
|