blob: 24ec75aa570b55c47dfda7c32e1963b0210fde2e [file] [log] [blame]
-- PostgreSQL conversion from Gerrit 1 -> Gerrit 2
--
-- If this is the first time the Gerrit1 schema has been used it
-- needs to be renamed:
-- psql -c 'ALTER SCHEMA public RENAME TO gerrit1' $srcdb
--
-- Make sure there is a current dump file:
-- pg_dump -O -Fc $src >gerrit1.dump
--
-- Write your "UPDATE system_config SET ..." and put it into
-- some config.sql script. At least git_base_path must be set.
--
-- Execute the conversion script:
-- gerrit1_import/1-to-2.sh gerrit1.dump config.sql
--
DELETE FROM accounts;
INSERT INTO accounts
(account_id,
registered_on,
full_name,
preferred_email,
ssh_user_name,
contact_address,
contact_country,
contact_phone_nbr,
contact_fax_nbr,
default_context
) SELECT
nextval('account_id'),
a.created,
a.real_name,
a.user_email,
CASE WHEN a.user_email LIKE '%@%'
THEN lower(substring(a.user_email from '^(.*)@.*$'))
ELSE NULL
END,
a.mailing_address,
a.mailing_address_country,
a.phone_number,
a.fax_number,
a.default_context
FROM gerrit1.accounts a;
UPDATE system_config
SET allow_google_account_upgrade = 'Y';
DELETE FROM account_external_ids;
INSERT INTO account_external_ids
(account_id,
external_id,
email_address) SELECT
l.account_id,
'Google Account ' || a.user_email,
a.user_email
FROM gerrit1.accounts a, accounts l
WHERE l.preferred_email = a.user_email;
DELETE FROM contributor_agreements;
INSERT INTO contributor_agreements
(active,
require_contact_information,
auto_verify,
short_name,
short_description,
agreement_url,
id) VALUES (
'Y',
'Y',
'Y',
'Individual',
'If you are going to be contributing code on your own, this is the one you want. You can sign this one online.',
'static/cla_individual.html',
nextval('contributor_agreement_id'));
INSERT INTO contributor_agreements
(active,
require_contact_information,
auto_verify,
short_name,
short_description,
agreement_url,
id) VALUES (
'Y',
'N',
'N',
'Corporate',
'If you are going to be contributing code on behalf of your company, this is the one you want. We\'ll give you a form that will need to printed, signed and sent back via post, email or fax.',
'static/cla_corporate.html',
nextval('contributor_agreement_id'));
DELETE FROM account_agreements;
INSERT INTO account_agreements
(accepted_on,
status,
account_id,
review_comments,
reviewed_by,
reviewed_on,
cla_id) SELECT
a.individual_cla_timestamp,
CASE WHEN a.cla_verified = 'Y' THEN 'V'
ELSE 'n'
END,
r.account_id,
a.cla_comments,
(SELECT m.account_id FROM accounts m
WHERE m.preferred_email = a.cla_verified_by),
a.cla_verified_timestamp,
i.id
FROM contributor_agreements i,
gerrit1.accounts a,
accounts r
WHERE i.short_name = 'Individual'
AND a.individual_cla_version = 1
AND r.preferred_email = a.user_email;
INSERT INTO account_agreements
(accepted_on,
status,
account_id,
review_comments,
reviewed_by,
reviewed_on,
cla_id) SELECT
CASE WHEN a.individual_cla_timestamp IS NOT NULL
THEN a.individual_cla_timestamp
ELSE a.created
END,
'V',
r.account_id,
a.cla_comments,
(SELECT m.account_id FROM accounts m
WHERE m.preferred_email = a.cla_verified_by),
a.cla_verified_timestamp,
i.id
FROM contributor_agreements i,
gerrit1.accounts a,
accounts r
WHERE i.short_name = 'Corporate'
AND a.individual_cla_version = 0
AND a.cla_verified = 'Y'
AND r.preferred_email = a.user_email;
DELETE FROM account_groups;
INSERT INTO account_groups
(group_id,
description,
name) SELECT
nextval('account_group_id'),
g.comment,
g.name
FROM gerrit1.account_groups g;
INSERT INTO account_groups
(group_id,
description,
name) VALUES
(nextval('account_group_id'),
'Any user, signed-in or not',
'Anonymous Users');
INSERT INTO account_groups
(group_id,
description,
name) VALUES
(nextval('account_group_id'),
'Any signed-in user',
'Registered Users');
DELETE FROM account_group_members;
INSERT INTO account_group_members
(account_id,
group_id) SELECT
a.account_id,
g.group_id
FROM accounts a,
account_groups g,
gerrit1.account_group_users o
WHERE
o.group_name = g.name
AND a.preferred_email = o.email;
UPDATE system_config
SET
use_contributor_agreements = 'Y'
,admin_group_id = (SELECT group_id
FROM account_groups
WHERE name = 'admin')
,anonymous_group_id = (SELECT group_id
FROM account_groups
WHERE name = 'Anonymous Users')
,registered_group_id = (SELECT group_id
FROM account_groups
WHERE name = 'Registered Users');
UPDATE account_groups
SET owner_group_id = (SELECT admin_group_id FROM system_config);
DELETE FROM projects WHERE project_id <> 0;
INSERT INTO projects
(project_id,
description,
name,
use_contributor_agreements,
owner_group_id) SELECT
p.project_id,
p.comment,
p.name,
'Y',
(SELECT admin_group_id FROM system_config)
FROM gerrit1.projects p;
DELETE FROM account_project_watches;
INSERT INTO account_project_watches
(account_id,
project_id) SELECT
a.account_id,
p.project_id
FROM gerrit1.projects p,
accounts a,
gerrit1.account_unclaimed_changes_projects q
WHERE a.preferred_email = q.email
AND p.gae_key = q.project_key;
DELETE FROM branches;
INSERT INTO branches
(branch_id,
project_name,
branch_name) SELECT
nextval('branch_id'),
p.name,
b.name
FROM gerrit1.branches b, gerrit1.projects p
WHERE p.gae_key = b.project_key;
CREATE TEMPORARY TABLE need_groups (project_id INT NOT NULL);
INSERT INTO need_groups
SELECT p.project_id
FROM projects p, gerrit1.project_owner_groups o
WHERE p.project_id = o.project_id
GROUP BY p.project_id
HAVING COUNT(*) > 1;
INSERT INTO need_groups
SELECT p.project_id
FROM projects p
WHERE EXISTS (SELECT 1 FROM gerrit1.project_owner_users u
WHERE u.project_id = p.project_id)
AND NOT EXISTS (SELECT 1 FROM need_groups n
WHERE n.project_id = p.project_id);
INSERT INTO account_groups
(group_id,
owner_group_id,
description,
name) SELECT
nextval('account_group_id'),
(SELECT admin_group_id FROM system_config),
p.name || ' maintainers',
substring(p.name from '^.*/([^/]*)$') || '_' || p.project_id || '-owners'
FROM projects p, need_groups g
WHERE p.project_id = g.project_id;
UPDATE account_groups
SET owner_group_id = group_id
WHERE name IN (SELECT
substring(p.name from '^.*/([^/]*)$') || '_' || p.project_id || '-owners'
FROM projects p, need_groups g
WHERE p.project_id = g.project_id);
UPDATE projects
SET owner_group_id = (SELECT group_id
FROM account_groups
WHERE name = substring(projects.name
from '^.*/([^/]*)$') || '_' || projects.project_id || '-owners')
WHERE project_id IN (SELECT project_id FROM need_groups);
INSERT INTO account_group_members
(account_id,
group_id) SELECT DISTINCT
q.account_id,
p.owner_group_id
FROM projects p,
need_groups n,
gerrit1.account_groups og,
gerrit1.project_owner_groups o,
account_groups g,
account_group_members q
WHERE
n.project_id = p.project_id
AND o.project_id = p.project_id
AND og.gae_key = o.group_key
AND g.name = og.name
AND q.group_id = g.group_id
UNION
SELECT
a.account_id,
p.owner_group_id
FROM accounts a,
projects p,
need_groups n,
gerrit1.project_owner_users o
WHERE
n.project_id = p.project_id
AND o.project_id = p.project_id
AND a.preferred_email = o.email;
UPDATE projects
SET owner_group_id = (
SELECT g.group_id
FROM account_groups g,
gerrit1.project_owner_groups o,
gerrit1.account_groups og
WHERE projects.project_id = o.project_id
AND og.gae_key = o.group_key
AND g.name = og.name)
WHERE project_id NOT IN (SELECT project_id FROM need_groups)
AND EXISTS (
SELECT g.group_id
FROM account_groups g,
gerrit1.project_owner_groups o,
gerrit1.account_groups og
WHERE projects.project_id = o.project_id
AND og.gae_key = o.group_key
AND g.name = og.name);
DROP TABLE need_groups;
DELETE FROM changes;
INSERT INTO changes
(created_on,
last_updated_on,
owner_account_id,
dest_project_name,
dest_branch_name,
status,
open,
nbr_patch_sets,
current_patch_set_id,
subject,
change_id) SELECT
c.created,
c.modified,
a.account_id,
p.name,
b.name,
CASE WHEN c.merged = 'Y' THEN 'M'
WHEN c.closed = 'Y' THEN 'A'
ELSE 'n'
END,
CASE WHEN c.merged = 'Y' THEN 'N'
WHEN c.closed = 'Y' THEN 'N'
ELSE 'Y'
END,
c.n_patchsets,
c.n_patchsets,
c.subject,
c.change_id
FROM gerrit1.changes c,
accounts a,
gerrit1.projects p,
gerrit1.branches b
WHERE
a.preferred_email = c.owner
AND p.gae_key = c.dest_project_key
AND b.gae_key = c.dest_branch_key
;
UPDATE gerrit1.messages
SET sender = substring(sender from '<(.*)>')
WHERE sender LIKE '%<%>';
UPDATE gerrit1.messages
SET sender = NULL
WHERE sender = 'code-review@android.com';
UPDATE gerrit1.messages
SET body = 'Change has been successfully merged into the git repository.'
WHERE body LIKE '
Hi.
Your change has been successfully merged into the git repository.
-Your friendly git merger%'
AND sender IS NULL;
UPDATE gerrit1.messages
SET body = 'Change could not be merged because of a missing dependency. As soon as its dependencies are submitted, the change will be submitted.'
WHERE (body LIKE '
Hi.
Your change could not be merged because of a missing dependency.%
-Your friendly git merger%'
OR body LIKE '
Your change could not be merged because of a missing dependency.
As soon as all dependencies are submitted, your change will be
resubmitted automatically.%'
) AND sender IS NULL;
UPDATE gerrit1.messages
SET body = 'Change cannot be merged because of a path conflict.'
WHERE body LIKE '
Hi.
Your change has not been successfully merged into the git repository
because of a path conflict.
-Your friendly git merger%'
AND sender is NULL;
UPDATE gerrit1.messages
SET body = TRIM(both '
' FROM body);
DELETE FROM change_messages;
INSERT INTO change_messages
(change_id,
uuid,
author_id,
written_on,
message) SELECT
c.change_id,
substr(m.gae_key, length(m.change_key) + length('wLEgdNZXNzYWdlG')),
a.account_id,
m.date_sent,
m.body
FROM gerrit1.messages m
LEFT OUTER JOIN accounts a ON a.preferred_email = m.sender,
gerrit1.changes c
WHERE
c.gae_key = m.change_key;
DELETE FROM patch_sets;
INSERT INTO patch_sets
(revision,
change_id,
patch_set_id,
created_on,
uploader_account_id) SELECT
r.revision_id,
c.change_id,
p.patchset_id,
p.created,
a.account_id
FROM gerrit1.patch_sets p
JOIN accounts a ON a.preferred_email = p.owner
JOIN gerrit1.changes c ON p.change_key = c.gae_key
LEFT OUTER JOIN gerrit1.revisions r ON r.gae_key = p.revision_key;
DELETE FROM patch_set_info;
INSERT INTO patch_set_info
(subject,
message,
author_name,
author_email,
author_when,
author_tz,
committer_name,
committer_email,
committer_when,
committer_tz,
change_id,
patch_set_id) SELECT DISTINCT
(SELECT c.subject FROM changes c
WHERE c.change_id = p.change_id
AND c.current_patch_set_id = p.patch_set_id),
r.message,
r.author_name,
r.author_email,
r.author_when,
r.author_tz,
r.committer_name,
r.committer_email,
r.committer_when,
r.committer_tz,
p.change_id,
p.patch_set_id
FROM gerrit1.revisions r, patch_sets p
WHERE r.revision_id = p.revision;
DELETE FROM patch_set_ancestors;
INSERT INTO patch_set_ancestors
(ancestor_revision,
change_id,
patch_set_id,
position
) SELECT DISTINCT
p.parent_id,
ps.change_id,
ps.patch_set_id,
p.position
FROM gerrit1.revision_ancestors p,
patch_sets ps
WHERE ps.revision = p.child_id;
DELETE FROM patches;
INSERT INTO patches
(change_type,
patch_type,
nbr_comments,
change_id,
patch_set_id,
file_name) SELECT
p.status,
CASE WHEN p.multi_way_diff = 'Y' THEN 'N'
ELSE 'U'
END,
p.n_comments,
c.change_id,
ps.patchset_id,
p.filename
FROM gerrit1.patches p,
gerrit1.patch_sets ps,
gerrit1.changes c
WHERE p.patchset_key = ps.gae_key
AND ps.change_key = c.gae_key;
DELETE FROM patch_comments;
INSERT INTO patch_comments
(line_nbr,
author_id,
written_on,
status,
side,
message,
change_id,
patch_set_id,
file_name,
uuid) SELECT
c.lineno,
a.account_id,
c.written,
CASE WHEN c.draft = 'Y' THEN 'd'
ELSE 'P'
END,
CASE WHEN c.is_left = 'Y' THEN 0
ELSE 1
END,
c.body,
o_c.change_id,
o_ps.patchset_id,
o_p.filename,
c.message_id
FROM gerrit1.comments c,
accounts a,
gerrit1.patches o_p,
gerrit1.patch_sets o_ps,
gerrit1.changes o_c
WHERE o_p.patchset_key = o_ps.gae_key
AND o_ps.change_key = o_c.gae_key
AND o_p.gae_key = c.patch_key
AND a.preferred_email = c.author;
DELETE FROM change_approvals;
INSERT INTO change_approvals
(value,
change_id,
account_id,
category_id) SELECT
1,
c.change_id,
a.account_id,
'VRIF'
FROM gerrit1.review_status s,
gerrit1.changes c,
accounts a
WHERE
s.verified = 'Y'
AND s.change_key = c.gae_key
AND a.preferred_email = s.email;
INSERT INTO change_approvals
(value,
change_id,
account_id,
category_id) SELECT
CASE WHEN s.lgtm = 'lgtm' THEN 2
WHEN s.lgtm = 'yes' THEN 1
WHEN s.lgtm = 'abstain' THEN 0
WHEN s.lgtm = 'no' THEN -1
WHEN s.lgtm = 'reject' THEN -2
ELSE NULL
END,
c.change_id,
a.account_id,
'CRVW'
FROM gerrit1.review_status s,
gerrit1.changes c,
accounts a
WHERE
s.lgtm IS NOT NULL
AND s.change_key = c.gae_key
AND a.preferred_email = s.email;
DELETE FROM starred_changes;
INSERT INTO starred_changes
(account_id,
change_id) SELECT
a.account_id,
c.change_id
FROM gerrit1.account_stars s,
accounts a,
changes c
WHERE a.preferred_email = s.email
AND c.change_id = s.change_id;
UPDATE account_groups
SET name = 'Administrators'
WHERE name = 'admin';
-- Fix change.nbr_patch_sets
--
UPDATE changes
SET nbr_patch_sets = (SELECT MAX(p.patch_set_id)
FROM patch_sets p
WHERE p.change_id = changes.change_id);
-- Fix change.last_updated_on
--
CREATE TEMPORARY TABLE temp_dates (
change_id INT NOT NULL,
dt TIMESTAMP NOT NULL);
INSERT INTO temp_dates
SELECT change_id,written_on
FROM patch_comments
WHERE status = 'P';
INSERT INTO temp_dates
SELECT change_id,written_on FROM change_messages;
INSERT INTO temp_dates
SELECT change_id,merge_submitted
FROM gerrit1.changes
WHERE merge_submitted IS NOT NULL
AND merged = 'Y';
UPDATE changes
SET last_updated_on = (SELECT MAX(m.dt)
FROM temp_dates m
WHERE m.change_id = changes.change_id)
WHERE EXISTS (SELECT 1 FROM temp_dates m
WHERE m.change_id = changes.change_id);
DROP TABLE temp_dates;
-- Fix patches.nbr_comments
--
UPDATE patches
SET nbr_comments = (SELECT COUNT(*)
FROM patch_comments c
WHERE c.status = 'P'
AND c.change_id = patches.change_id
AND c.patch_set_id = patches.patch_set_id
AND c.file_name = patches.file_name);
SELECT
(SELECT COUNT(*) FROM gerrit1.accounts) as accounts_g1,
(SELECT COUNT(*) FROM accounts) as accounts_g1
WHERE
(SELECT COUNT(*) FROM gerrit1.accounts)
!=(SELECT COUNT(*) FROM accounts);
SELECT
(SELECT COUNT(*) FROM gerrit1.changes) as changes_g1,
(SELECT COUNT(*) FROM changes) as changes_g2
WHERE
(SELECT COUNT(*) FROM gerrit1.changes)
!=(SELECT COUNT(*) FROM changes);
SELECT
(SELECT COUNT(*) FROM gerrit1.messages) as messages_g1,
(SELECT COUNT(*) FROM change_messages) as messages_g2
WHERE
(SELECT COUNT(*) FROM gerrit1.messages)
!=(SELECT COUNT(*) FROM change_messages);
SELECT
(SELECT COUNT(*) FROM gerrit1.patch_sets) as patch_sets_g1,
(SELECT COUNT(*) FROM patch_sets) as patch_sets_g2
WHERE
(SELECT COUNT(*) FROM gerrit1.patch_sets)
!=(SELECT COUNT(*) FROM patch_sets);
SELECT
(SELECT COUNT(*) FROM gerrit1.patches g, gerrit1.patch_sets p
WHERE g.patchset_key = p.gae_key) as patches_g1,
(SELECT COUNT(*) FROM patches) as patches_g2
WHERE
(SELECT COUNT(*) FROM gerrit1.patches g, gerrit1.patch_sets p
WHERE g.patchset_key = p.gae_key)
!=(SELECT COUNT(*) FROM patches);
SELECT
(SELECT COUNT(*) FROM gerrit1.comments) as comments_g1,
(SELECT COUNT(*) FROM patch_comments) as comments_g2
WHERE
(SELECT COUNT(*) FROM gerrit1.comments)
!=(SELECT COUNT(*) FROM patch_comments);
-- Reset sequences
--
-- account_group_id (above)
-- account_id (above)
-- branch_id (above)
SELECT setval('change_id',(SELECT MAX(change_id) FROM changes));
-- contributor_agreement_id (above)
SELECT setval('project_id',(SELECT MAX(project_id) FROM projects));
-- Grant access to read tables needed for import
--
GRANT SELECT ON gerrit1.project_code_reviews TO gerrit2;
GRANT SELECT ON gerrit1.approval_right_groups TO gerrit2;
GRANT SELECT ON gerrit1.approval_right_users TO gerrit2;
GRANT SELECT ON gerrit1.approval_rights TO gerrit2;
GRANT SELECT ON gerrit1.account_groups TO gerrit2;