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.

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 `devutil/1-to-2.sh`.

====
  cd devdb/src/main/config/
  cp 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 devutil/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.
