blob: 2a857b2cb70d70cb188b0efa4b1d110979633e8e [file] [log] [blame]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -08001= Making a Gerrit Release
Martin Fick21e278e2012-02-23 13:45:54 -07002
3[NOTE]
Martin Fick21e278e2012-02-23 13:45:54 -07004This document is meant primarily for Gerrit maintainers
5who have been given approval and submit status to the Gerrit
6projects. Additionally, maintainers should be given owner
7status to the Gerrit web site.
Martin Fick21e278e2012-02-23 13:45:54 -07008
9To make a Gerrit release involves a great deal of complex
10tasks and it is easy to miss a step so this document should
Edwin Kempinbb8e6252012-07-31 14:30:35 +020011hopefully serve as both a how to for those new to the process
Martin Fick21e278e2012-02-23 13:45:54 -070012and as a checklist for those already familiar with these
13tasks.
14
15
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080016== Gerrit Release Type
Martin Fick21e278e2012-02-23 13:45:54 -070017
18Here are some guidelines on release approaches depending on the
Edwin Kempinbb8e6252012-07-31 14:30:35 +020019type of release you want to make (`stable-fix`, `stable`, `RC0`,
20`RC1`...).
Martin Fick21e278e2012-02-23 13:45:54 -070021
Edwin Kempin60ab8532013-03-27 14:33:46 +010022[[stable]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080023=== Stable
Martin Fick21e278e2012-02-23 13:45:54 -070024
Edwin Kempinbb8e6252012-07-31 14:30:35 +020025A `stable` release is generally built from the `master` branch and may
26need to undergo some stabilization before releasing the final release.
Martin Fick21e278e2012-02-23 13:45:54 -070027
28* Propose the release with any plans/objectives to the mailing list
29
Edwin Kempinbb8e6252012-07-31 14:30:35 +020030* Create a Gerrit `RC0`
Martin Fick21e278e2012-02-23 13:45:54 -070031
Edwin Kempinbb8e6252012-07-31 14:30:35 +020032* If needed create a Gerrit `RC1`
Martin Fick21e278e2012-02-23 13:45:54 -070033
34[NOTE]
Martin Fick21e278e2012-02-23 13:45:54 -070035You may let in a few features to this release
Martin Fick21e278e2012-02-23 13:45:54 -070036
Edwin Kempinbb8e6252012-07-31 14:30:35 +020037* If needed create a Gerrit `RC2`
Martin Fick21e278e2012-02-23 13:45:54 -070038
39[NOTE]
Martin Fick21e278e2012-02-23 13:45:54 -070040There should be no new features in this release, only bug fixes
Martin Fick21e278e2012-02-23 13:45:54 -070041
Edwin Kempinbb8e6252012-07-31 14:30:35 +020042* Finally create the `stable` release (no `RC`)
Martin Fick21e278e2012-02-23 13:45:54 -070043
44
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080045=== Stable-Fix
Martin Fick21e278e2012-02-23 13:45:54 -070046
Edwin Kempinbb8e6252012-07-31 14:30:35 +020047`stable-fix` releases should likely only contain bug fixes and doc
48updates.
Martin Fick21e278e2012-02-23 13:45:54 -070049
Edwin Kempina0272a52012-12-28 10:25:57 +010050* Propose the release with any plans/objectives to the mailing list
51
Edwin Kempinbb8e6252012-07-31 14:30:35 +020052* This type of release does not need any RCs, release when the
53objectives are met
Martin Fick21e278e2012-02-23 13:45:54 -070054
55
Edwin Kempin60ab8532013-03-27 14:33:46 +010056[[security]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080057=== Security-Fix
Edwin Kempind71591e2012-12-28 10:50:38 +010058
59`security-fix` releases should only contain bug fixes for security
60issues.
61
62For security issues it is important that they are only announced
63*after* fixed versions for all relevant releases have been published.
David Pursehouse452ea4c2013-01-07 17:30:47 +090064Because of this, `security-fix` releases can't be prepared in the public
Edwin Kempind71591e2012-12-28 10:50:38 +010065`gerrit` project.
66
67`security-fix` releases are prepared in the `gerrit-security-fixes`
68project which is only readable by the Gerrit Maintainers. Only after
David Pursehouse452ea4c2013-01-07 17:30:47 +090069a `security-fix` release has been published will the commits/tags made in
70the `gerrit-security-fixes` project be taken over into the public
Edwin Kempind71591e2012-12-28 10:50:38 +010071`gerrit` project.
72
73
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080074== Create the Actual Release
Martin Fick21e278e2012-02-23 13:45:54 -070075
Edwin Kempinbb8e6252012-07-31 14:30:35 +020076To create a Gerrit release the following steps have to be done:
Sasa Zivkov619f9ed2012-05-25 14:49:29 +020077
Edwin Kempinbb8e6252012-07-31 14:30:35 +020078. link:#subproject[Release Subprojects]
David Pursehouse383a3182013-12-06 13:06:57 +090079. link:#build-gerrit[Build the Gerrit Release]
Edwin Kempinbb8e6252012-07-31 14:30:35 +020080. link:#publish-gerrit[Publish the Gerrit Release]
David Pursehousedd066e42015-04-17 17:53:57 +090081.. link:#publish-to-maven-central[Publish the Gerrit artifacts to Maven Central]
82.. link:#publish-to-google-storage[Publish the Gerrit WAR to Google Storage]
Edwin Kempinbb8e6252012-07-31 14:30:35 +020083.. link:#push-stable[Push the Stable Branch]
84.. link:#push-tag[Push the Release Tag]
85.. link:#upload-documentation[Upload the Documentation]
David Pursehoused228d6d2016-10-19 19:25:35 +090086.. link:#finalize-release-notes[Finalize Release Notes]
Edwin Kempinbb8e6252012-07-31 14:30:35 +020087.. link:#update-issues[Update the Issues]
88.. link:#announce[Announce on Mailing List]
89. link:#increase-version[Increase Gerrit Version for Current Development]
90. link:#merge-stable[Merge `stable` into `master`]
Martin Fick21e278e2012-02-23 13:45:54 -070091
92
Edwin Kempinbb8e6252012-07-31 14:30:35 +020093[[subproject]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -080094=== Release Subprojects
Edwin Kempinbb8e6252012-07-31 14:30:35 +020095
96The subprojects to be released are:
97
Edwin Kempinbb8e6252012-07-31 14:30:35 +020098* `gwtjsonrpc`
99* `gwtorm`
100* `prolog-cafe`
101
102For each subproject do:
103
104* Check the dependency to the Subproject in the Gerrit parent `pom.xml`:
105+
106If a `SNAPSHOT` version of the subproject is referenced the subproject
107needs to be released so that Gerrit can reference a released version of
108the subproject.
109
110* link:dev-release-subproject.html#make-snapshot[Make a snapshot and test it]
111* link:dev-release-subproject.html#prepare-release[Prepare the Release]
112* link:dev-release-subproject.html#publish-release[Publish the Release]
113
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800114* Update the `artifact`, `sha1`, and `src_sha1` values in the `maven_jar`
115for the Subproject in `WORKSPACE` to the released version.
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200116
Edwin Kempin6ba21942014-06-03 09:16:20 +0200117[[update-versions]]
118=== Update Versions and Create Release Tag
119
David Pursehouse5b425932015-01-22 16:46:00 +0900120Before doing the release build, the `GERRIT_VERSION` in the `VERSION`
121file must be updated, e.g. change it from `2.5-SNAPSHOT` to `2.5`.
Edwin Kempin6ba21942014-06-03 09:16:20 +0200122
123In addition the version must be updated in a number of pom.xml files.
David Pursehouse5b425932015-01-22 16:46:00 +0900124
125To do this run the `./tools/version.py` script and provide the new
Edwin Kempin6ba21942014-06-03 09:16:20 +0200126version as parameter, e.g.:
127
128----
David Pursehouse5b425932015-01-22 16:46:00 +0900129 ./tools/version.py 2.5
Edwin Kempin6ba21942014-06-03 09:16:20 +0200130----
131
Saša Živkov5f3d3972015-01-28 10:30:49 +0100132Commit the changes and create the release tag on the new commit:
Edwin Kempin6ba21942014-06-03 09:16:20 +0200133
134----
135 git tag -a v2.5
136----
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200137
David Pursehousea1ab3e72015-01-30 14:57:11 +0900138Tag the plugins:
139
140----
141 git submodule foreach git tag -a v2.5
142----
143
Shawn Pearcebf8ebbe2013-05-06 14:23:26 -0700144[[build-gerrit]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800145=== Build Gerrit
Martin Fick21e278e2012-02-23 13:45:54 -0700146
Yuxuan 'fishy' Wang6714b0d2016-05-03 12:58:04 -0700147* Build the Gerrit WAR, API JARs and documentation
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200148+
David Pursehouse383a3182013-12-06 13:06:57 +0900149----
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800150 bazel build release Documentation:searchfree
151 ./tools/maven/api.sh install
David Pursehouse383a3182013-12-06 13:06:57 +0900152----
Martin Fick21e278e2012-02-23 13:45:54 -0700153
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200154* Sanity check WAR
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200155* Test the new Gerrit version
Martin Fick21e278e2012-02-23 13:45:54 -0700156
David Pursehouse7eb16eb2016-03-11 12:01:56 +0900157* Verify plugin versions
158+
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800159Verify the versions:
David Pursehouse7eb16eb2016-03-11 12:01:56 +0900160+
161----
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800162 java -jar bazel-bin/release.war init --list-plugins
David Pursehouse7eb16eb2016-03-11 12:01:56 +0900163----
164
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200165[[publish-gerrit]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800166=== Publish the Gerrit Release
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200167
Edwin Kempin210b6362014-06-03 13:33:16 +0200168[[publish-to-maven-central]]
169==== Publish the Gerrit artifacts to Maven Central
170
171* Make sure you have done the
172link:dev-release-deploy-config.html#deploy-configuration-setting-maven-central[
173configuration] for deploying to Maven Central
174
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800175* Make sure that the version is updated in the `version.bzl` file and in
Edwin Kempin210b6362014-06-03 13:33:16 +0200176the `pom.xml` files as described in the link:#update-versions[Update
177Versions and Create Release Tag] section.
178
Edwin Kempine5b49432014-06-03 09:25:39 +0200179* Push the WAR to Maven Central:
180+
181----
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800182 ./tools/maven/api.sh war_deploy
Edwin Kempine5b49432014-06-03 09:25:39 +0200183----
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200184
Edwin Kempin210b6362014-06-03 13:33:16 +0200185* Push the plugin artifacts to Maven Central:
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200186+
187----
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800188 ./tools/maven/api.sh deploy
Edwin Kempin210b6362014-06-03 13:33:16 +0200189----
190
Edwin Kempin210b6362014-06-03 13:33:16 +0200191* To where the artifacts are uploaded depends on the `GERRIT_VERSION` in
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800192the `version.bzl` file:
Edwin Kempin210b6362014-06-03 13:33:16 +0200193
194** SNAPSHOT versions are directly uploaded into the Sonatype snapshots
195repository and no further action is needed:
196+
197https://oss.sonatype.org/content/repositories/snapshots/com/google/gerrit/
198
199** Release versions are uploaded into a staging repository in the
200link:https://oss.sonatype.org/[Sonatype Nexus Server].
201
202* Verify the staging repository
Edwin Kempin210b6362014-06-03 13:33:16 +0200203
204** Go to the link:https://oss.sonatype.org/[Sonatype Nexus Server] and
205sign in with your Sonatype credentials.
206
Edwin Kempin58bc3132014-06-05 14:56:58 +0200207** Click on 'Build Promotion' in the left navigation bar under
208'Staging Repositories' and find the `comgooglegerrit-XXXX` staging
Edwin Kempin210b6362014-06-03 13:33:16 +0200209repository.
210
211** Verify its content
212+
213While the staging repository is open you can upload further content and
214also replace uploaded artifacts. If something is wrong with the staging
215repository you can drop it by selecting it and clicking on `Drop`.
216
217** Run Sonatype validations on the staging repository
218+
219Select the staging repository and click on `Close`. This runs the
220Sonatype validations on the staging repository. The repository will
221only be closed if everything is OK. A closed repository cannot be
222modified anymore, but you may still drop it if you find any issues.
223
224** Test closed staging repository
225+
226Once a repository is closed you can find the URL to it in the `Summary`
227section, e.g. https://oss.sonatype.org/content/repositories/comgooglegerrit-1029
228+
229Use this URL for further testing of the artifacts in this repository,
230e.g. to try building a plugin against the plugin API in this repository
231update the version in the `pom.xml` and configure the repository:
232+
233----
234 <repositories>
235 <repository>
236 <id>gerrit-staging-repository</id>
237 <url>https://oss.sonatype.org/content/repositories/comgooglegerrit-1029</url>
238 </repository>
239 </repositories>
240----
241
242* Release the staging repository
243+
244How to release a staging repository is described in the
245link:https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-8.a.2.ReleasingaStagingRepository[
246Sonatype OSS Maven Repository Usage Guide].
247+
248[WARNING]
249Releasing artifacts to Maven Central cannot be undone!
250
251** Find the closed staging repository in the
252link:https://oss.sonatype.org/[Sonatype Nexus Server], select it and
253click on `Release`.
254
Edwin Kempin8e63cf42014-06-04 14:24:20 +0200255** The released artifacts are available in
256https://oss.sonatype.org/content/repositories/releases/com/google/gerrit/
257
Edwin Kempin210b6362014-06-03 13:33:16 +0200258** It may take up to 2 hours until the artifacts appear on Maven
259Central:
260+
Edwin Kempin8e63cf42014-06-04 14:24:20 +0200261http://central.maven.org/maven2/com/google/gerrit/
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200262
Edwin Kempin58bc3132014-06-05 14:56:58 +0200263* [optional]: View download statistics
264
265** Sign in to the
266link:https://oss.sonatype.org/[Sonatype Nexus Server].
267
268** Click on 'Views/Repositories' in the left navigation bar under
269'Central Statistics'.
270
271** Select `com.google.gerrit` as `Project`.
272
Martin Fick21e278e2012-02-23 13:45:54 -0700273
David Pursehousedd066e42015-04-17 17:53:57 +0900274[[publish-to-google-storage]]
275==== Publish the Gerrit WAR to the Google Cloud Storage
276
David Pursehouseaf652ab2016-08-29 16:37:22 +0900277* go to the link:https://console.cloud.google.com/storage/browser/gerrit-releases/?project=api-project-164060093628[
278gerrit-releases bucket in the Google cloud storage console]
David Pursehousedd066e42015-04-17 17:53:57 +0900279* make sure you are signed in with your Gmail account
280* manually upload the Gerrit WAR file by using the `Upload` button
281
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200282[[push-stable]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800283==== Push the Stable Branch
Martin Fick21e278e2012-02-23 13:45:54 -0700284
David Pursehouse0c104022014-06-02 09:57:14 +0900285* Create the stable branch `stable-2.5` in the `gerrit` project via the
286link:https://gerrit-review.googlesource.com/#/admin/projects/gerrit,branches[
David Pursehousea1d633b2014-05-02 17:21:02 +0900287Gerrit Web UI] or by push.
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200288
289* Push the commits done on `stable-2.5` to `refs/for/stable-2.5` and
290get them merged
291
292
293[[push-tag]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800294==== Push the Release Tag
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200295
David Pursehousea1ab3e72015-01-30 14:57:11 +0900296Push the new Release Tag:
297
David Pursehouse383a3182013-12-06 13:06:57 +0900298----
Saša Živkovffd288e2015-01-28 12:22:37 +0100299 git push gerrit-review tag v2.5
David Pursehouse383a3182013-12-06 13:06:57 +0900300----
Martin Fick21e278e2012-02-23 13:45:54 -0700301
David Pursehousea1ab3e72015-01-30 14:57:11 +0900302Push the new Release Tag on the plugins:
303
304----
305 git submodule foreach git push gerrit-review tag v2.5
306----
307
Martin Fick21e278e2012-02-23 13:45:54 -0700308
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200309[[upload-documentation]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800310==== Upload the Documentation
Martin Fick21e278e2012-02-23 13:45:54 -0700311
Yuxuan 'fishy' Wang6714b0d2016-05-03 12:58:04 -0700312* Extract the documentation files from the zip file generated from
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800313`bazel build searchfree`: `bazel-bin/Documentation/searchfree.zip`.
David Pursehousedb628162014-12-09 19:33:01 +0900314
David Pursehouse62106ac2016-03-11 14:19:48 +0900315* Upload the files manually via web browser to the appropriate folder
316in the
David Pursehouseaf652ab2016-08-29 16:37:22 +0900317link:https://console.cloud.google.com/storage/browser/gerrit-documentation/?project=api-project-164060093628[
David Pursehousea8dca2f2015-04-17 13:59:29 +0900318gerrit-documentation] storage bucket.
Yuxuan 'fishy' Wangf7803972014-09-03 12:23:21 -0700319
David Pursehoused228d6d2016-10-19 19:25:35 +0900320[[finalize-release-notes]]
321=== Finalize the Release Notes
322
323Upload a change on the homepage project to:
324
325* Remove 'In Development' caveat from the relevant section.
326
327* Add links to the released documentation and the .war file, and make the
328latest version bold.
329
David Pursehousedb628162014-12-09 19:33:01 +0900330[[update-links]]
David Pursehouse08726a82015-07-14 11:46:20 +0900331==== Update homepage links
Yuxuan 'fishy' Wangf7803972014-09-03 12:23:21 -0700332
David Pursehouse08726a82015-07-14 11:46:20 +0900333Upload a change on the link:https://gerrit-review.googlesource.com/#/admin/projects/homepage[
334homepage project] to change the version numbers to the new version.
Martin Fick21e278e2012-02-23 13:45:54 -0700335
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200336[[update-issues]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800337==== Update the Issues
Martin Fick21e278e2012-02-23 13:45:54 -0700338
Michael Ochmannb99feab2016-07-06 14:10:22 +0200339Update the issues by hand. There is no script for this.
Martin Fick21e278e2012-02-23 13:45:54 -0700340
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200341Our current process is an issue should be updated to say `Status =
342Submitted, FixedIn-2.5` once the change is submitted, but before the
Martin Fick21e278e2012-02-23 13:45:54 -0700343release.
344
345After the release is actually made, you can search in Google Code for
Michael Ochmannb99feab2016-07-06 14:10:22 +0200346`Status=Submitted FixedIn=2.5` and then batch update these changes
347to say `Status=Released`. Make sure the pulldown says `All Issues`
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200348because `Status=Submitted` is considered a closed issue.
Martin Fick21e278e2012-02-23 13:45:54 -0700349
350
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200351[[announce]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800352==== Announce on Mailing List
Martin Fick21e278e2012-02-23 13:45:54 -0700353
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200354* Send an email to the mailing list to announce the release, consider
355including some or all of the following in the email:
David Pursehoused228d6d2016-10-19 19:25:35 +0900356** A link to the release and the release notes
Martin Fick21e278e2012-02-23 13:45:54 -0700357** A link to the docs
358** Describe the type of release (stable, bug fix, RC)
David Pursehouseaee79e12016-03-11 13:02:26 +0900359** Hash values (SHA1, SHA256, MD5) for the release WAR file.
360+
361The SHA1 and MD5 can be taken from the artifact page on Sonatype. The
362SHA256 can be generated with
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800363`openssl sha -sha256 bazel-bin/release.war` or an equivalent
David Pursehouseaee79e12016-03-11 13:02:26 +0900364command.
Martin Fick21e278e2012-02-23 13:45:54 -0700365
Martin Fickd377ebf2012-06-23 12:10:43 -0600366* Update the new discussion group announcement to be sticky
367** Go to: http://groups.google.com/group/repo-discuss/topics
368** Click on the announcement thread
Saša Živkovc03196d2015-01-28 12:26:11 +0100369** Near the top right, click on actions
370** Under actions, click the "Display this top first" checkbox
Martin Fickd377ebf2012-06-23 12:10:43 -0600371
372* Update the previous discussion group announcement to no longer be sticky
373** See above (unclick checkbox)
374
Martin Fick21e278e2012-02-23 13:45:54 -0700375
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200376[[increase-version]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800377=== Increase Gerrit Version for Current Development
Martin Fick21e278e2012-02-23 13:45:54 -0700378
David Pursehousef7c9f2c2014-12-09 19:36:04 +0900379All new development that is done in the `master` branch will be included in the
380next Gerrit release. The Gerrit version should be set to the snapshot version
381for the next release.
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200382
David Ostrovskyfdbfcad2016-11-15 06:35:29 -0800383Use the `version` tool to set the version in the `version.bzl` file:
David Pursehousef7c9f2c2014-12-09 19:36:04 +0900384
385----
386 ./tools/version.py 2.11-SNAPSHOT
387----
388
389Verify that the changes made by the tool are sane, then commit them, push
390the change for review on the master branch, and get it merged.
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200391
392[[merge-stable]]
Yuxuan 'fishy' Wang61698b12013-12-20 12:55:51 -0800393=== Merge `stable` into `master`
Edwin Kempinbb8e6252012-07-31 14:30:35 +0200394
395After every release, stable should be merged to master to ensure that
396none of the changes/fixes ever get lost.
Martin Fick21e278e2012-02-23 13:45:54 -0700397
David Pursehouse383a3182013-12-06 13:06:57 +0900398----
399 git config merge.summary true
400 git checkout master
401 git reset --hard origin/master
402 git branch -f stable origin/stable
403 git merge stable
404----
Martin Fickec31ff42012-06-23 11:35:39 -0600405
406
407GERRIT
408------
409Part of link:index.html[Gerrit Code Review]
Yuxuan 'fishy' Wang99cb68d2013-10-31 17:26:00 -0700410
411SEARCHBOX
412---------