Gerrit2 - Importing From Gerrit1
================================

To switch from Google App Engine running Gerrit1 to a Gerrit2 based
system, you need to export all of the data from the GAE data store
and load it into PostgreSQL, converting the schema in the process.

[NOTE]
You must be using a source build of both Gerrit1 and Gerrit2.
The Gerrit2 binary packages do not include the conversion tools
necessary to upgrade from Gerrit1.

[NOTE]
To get a source build of Gerrit1, use the version immediately before
it merged into Gerrit2: `git checkout v2.0-rc0^2`


GAE Backup
----------

Create a PostgreSQL database to house the backup:

====
  createdb -E UTF-8 gaeback
====

From the Gerrit1 sources, load the schema:

====
  psql -f backup/create.sql gaeback
====

Ensure you have a copy of the Google App Engine SDK in
`../../google_appengine`.  This path is hardcoded into the backup
script.  (Or edit the backup script to import the SDK directory.)

Execute the backup task, supplying the credentials of
an application developer:

====
  webapp/backup_gae.py \
-d gaeback \
-s yourapp.appspot.com \
-e you@example.com
====

Backups are not incremental, they dump the entire data store.
The backup does not clear the database.  If you are doing
repeated conversions, it is recommended that you use `dropdb`
to drop the database and recreate it before each backup.

Backups are not consistent.  You may want to consider uploading the
application in administrator-only mode, so end-users cannot modify
the data store while the backup is taking place:

====
  make update APPID=yourapp ADMIN_ONLY=1
====

To restore normal access:

====
  make update APPID=yourapp
====

Export Dump File
----------------

Rename the schema to `gerrit1`, and then dump it into a
backup file:

====
  psql -c 'ALTER SCHEMA public RENAME TO gerrit1' gaeback
  pg_dump -O -Fc gaeback >yourapp.dump
====

Gerrit2 Database Setup
----------------------

Tell Gerrit about your database connection information.  Note that
the username you use here *must* be the default of `gerrit2` and
the database name *must* be the default of `reviewdb`, unless you
modify `gerrit1_import/1-to-2.sh`.

====
  ./gerrit.war --cat extra/GerritServer.properties_example >GerritServer.properties
====

Make sure the user exists in PostgreSQL:

====
  createuser -A -D -P -E gerrit2
====

Gerrit2 Import
--------------

Create a short SQL script to set the `system_config` table correctly
for the import process.  This might look like:

====
  $ cat config.sql
  UPDATE system_config
  SET git_base_path='/srv/git';
====

where `git_base_path` is pointing to the same directory that
`codereview.basedir` was set to in your Gerrit1 mgrapp config file.
The import task requires read access to these repositories.

In the Gerrit2 source tree use `1-to-2.sh` to finish the conversion
process:

====
  sh gerrit1_import/1-to-2.sh yourapp.dump config.sql
====


Fixup Groups
------------

During the Gerrit1 to Gerrit2 schema conversion process some
additional groups may have been created.  This was necessary
to enforce the same permissions within a project while moving
to a system that assigns permissions only to groups, and not
to individual users.

You may want to browse #admin,groups once logged in through
the web UI and cleanup any group names that were generated
automatically by the import process.


User Account Migration
----------------------

After import `system_config.allow_google_account_upgrade` will be
set to `Y` to permit users to upgrade their account from a Google
Account in Google App Engine to an OpenID based Google Account.

Its strongly encouraged for administrators to set this flag to 'N'
once the following query drops to 0, or close to 0:

====
  SELECT COUNT(*) FROM account_external_ids e
  WHERE e.external_id LIKE 'Google Account %'
  AND NOT EXISTS (SELECT 1
    FROM account_external_ids o
    WHERE o.account_id = e.account_id
	AND o.external_id LIKE '%.google.com%/id?id=%');
====

the above query lists all users who have not yet converted their
accounts to the OpenID authentication scheme.  Unfortunately the
conversion must be done by each individual user logging in, as the
OpenID token is per-user, and per-site.
