Gerrit Code Review - Eclipse Setup
==================================

This document is about installing Gerrit into an Eclipse workspace
for development and debugging, especially with the GWT hosted
mode debugger.

You will need to have the GWT (Google Web Toolkit) 1.7 SDK installed
on your system.  A Java 6 or later SDK is also required to run
GWT's compiler and runtime.

GWT requires the Sun JDK (or OpenJDK).  The GWT "hosted mode"
environment (Eclipse debugger or "make web-shell") does not work
under libgcj.


User Library
------------

Create a user library called `GWT_17`:

* Window > Preferences
* Java > Build Path > User Libraries

* New
* Name: `GWT_17`
* Add JARs...

* Select `gwt-user.jar` from the $(GWT_SDK) directory.
* Select `gwt-dev-$(OS).jar` from the $(GWT_SDK) directory.

Maven Plugin
------------

Install the Maven Integration plugins:

http://m2eclipse.codehaus.org/[m2eclipse]


Code Formatter Settings
-----------------------

Import `tools/GoogleFormat.xml` using Window -> Preferences ->
Java -> Code Style -> Formatter -> Import...

This will define the 'Google Format' profile, which the project
settings prefer when formatting source code.


Import Projects
---------------

Import pom.xml using General -> Maven Projects

If you also want source projects for gwtorm, gwtjsonrpc or sshd,
import their top-level directories the same way.  Note that you
may need to edit the pom.xml under gerrit to ensure your snapshot
builds are used.

[NOTE]
Some of the source code is generated with ANTLR sources.  To
build these files, you need to right click on the imported projects,
Maven -> Update Project Configuration.  This should fix the compile
errors identified after import.

If you also want a source project for JGit, import the top level
jgit directory using General -> Existing Projects, selecting only
the `org.spearce.jgit` and `org.spearce.jgit.test` projects.


Configure Database
------------------

You may have already done this step earlier, based on the
instructions in link:dev-readme.html[Developer Setup].

* Navigate to gerrit-war/src/main/webapp/WEB-INF/extra/
* Copy `GerritServer.properties_example` to `gerrit-parent/GerritServer.properties`
* Configure your database for debugging in hosted mode.

Production Compile
------------------

*Always* use

----
  mvn clean package
----

to create a production build.

Launch Gerrit
-------------

Open Run->Debug Configurations...

Under Java Application find `gwtui_any` (not Mac OS X)
or `gwtui_mac` (Mac OS X only) to start the GWT hosted
mode browser and debug through Eclipse.

Final Setup
-----------

Since you are creating a Gerrit instance for testing, you need to
also follow the other steps outlined under "Initialize the Schema"
in the Installation Guide.  Note that the database has already been
created if you launched Gerrit at least once.

Note that Bouncy Castle Crypto is automatically installed in the
classpath when debugging with hosted mode, so you will need to
create SSH keys with `ssh-keygen`.

* link:install.html[Installation Guide]
* link:project-setup.html[Project Setup]

GERRIT
------
Part of link:index.html[Gerrit Code Review]
