Example usage for org.eclipse.jgit.lib CommitBuilder addParentId

List of usage examples for org.eclipse.jgit.lib CommitBuilder addParentId

Introduction

In this page you can find the example usage for org.eclipse.jgit.lib CommitBuilder addParentId.

Prototype

public void addParentId(AnyObjectId additionalParent) 

Source Link

Document

Add a parent onto the end of the parent list.

Usage

From source file:com.google.gerrit.pgm.init.AllProjectsConfig.java

License:Apache License

private void save(PersonIdent ident, String msg) throws IOException {
    File path = getPath();/*from w w w. j a  v  a2s. c  o  m*/
    if (path == null) {
        throw new IOException("All-Projects does not exist.");
    }

    Repository repo = new FileRepository(path);
    try {
        inserter = repo.newObjectInserter();
        reader = repo.newObjectReader();
        try {
            RevWalk rw = new RevWalk(reader);
            try {
                RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
                newTree = readTree(srcTree);
                saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
                ObjectId res = newTree.writeTree(inserter);
                if (res.equals(srcTree)) {
                    // If there are no changes to the content, don't create the commit.
                    return;
                }

                CommitBuilder commit = new CommitBuilder();
                commit.setAuthor(ident);
                commit.setCommitter(ident);
                commit.setMessage(msg);
                commit.setTreeId(res);
                if (revision != null) {
                    commit.addParentId(revision);
                }
                ObjectId newRevision = inserter.insert(commit);
                updateRef(repo, ident, newRevision, "commit: " + msg);
                revision = newRevision;
            } finally {
                rw.release();
            }
        } finally {
            if (inserter != null) {
                inserter.release();
                inserter = null;
            }
            if (reader != null) {
                reader.release();
                reader = null;
            }
        }
    } finally {
        repo.close();
    }
}

From source file:com.google.gerrit.pgm.init.api.AllProjectsConfig.java

License:Apache License

private void save(PersonIdent ident, String msg) throws IOException {
    File path = getPath();/*from www  .  ja  va 2s .  c o  m*/
    if (path == null) {
        throw new IOException("All-Projects does not exist.");
    }

    try (Repository repo = new FileRepository(path)) {
        inserter = repo.newObjectInserter();
        reader = repo.newObjectReader();
        try (RevWalk rw = new RevWalk(reader)) {
            RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
            newTree = readTree(srcTree);
            saveConfig(ProjectConfig.PROJECT_CONFIG, cfg);
            saveGroupList();
            ObjectId res = newTree.writeTree(inserter);
            if (res.equals(srcTree)) {
                // If there are no changes to the content, don't create the commit.
                return;
            }

            CommitBuilder commit = new CommitBuilder();
            commit.setAuthor(ident);
            commit.setCommitter(ident);
            commit.setMessage(msg);
            commit.setTreeId(res);
            if (revision != null) {
                commit.addParentId(revision);
            }
            ObjectId newRevision = inserter.insert(commit);
            updateRef(repo, ident, newRevision, "commit: " + msg);
            revision = newRevision;
        } finally {
            if (inserter != null) {
                inserter.close();
                inserter = null;
            }
            if (reader != null) {
                reader.close();
                reader = null;
            }
        }
    }

    // we need to invalidate the JGit cache if the group list is invalidated in
    // an unattended init step
    RepositoryCache.clear();
}

From source file:com.google.gerrit.pgm.init.api.VersionedMetaDataOnInit.java

License:Apache License

protected void save(PersonIdent ident, String msg) throws IOException, ConfigInvalidException {
    File path = getPath();//from  w  w w.ja  va  2  s  . c o m
    if (path == null) {
        throw new IOException(project + " does not exist.");
    }

    try (Repository repo = new FileRepository(path);
            ObjectInserter i = repo.newObjectInserter();
            ObjectReader r = repo.newObjectReader();
            RevWalk rw = new RevWalk(r)) {
        inserter = i;
        reader = r;

        RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
        newTree = readTree(srcTree);

        CommitBuilder commit = new CommitBuilder();
        commit.setAuthor(ident);
        commit.setCommitter(ident);
        commit.setMessage(msg);

        onSave(commit);

        ObjectId res = newTree.writeTree(inserter);
        if (res.equals(srcTree)) {
            return;
        }
        commit.setTreeId(res);

        if (revision != null) {
            commit.addParentId(revision);
        }
        ObjectId newRevision = inserter.insert(commit);
        updateRef(repo, ident, newRevision, "commit: " + msg);
        revision = rw.parseCommit(newRevision);
    } finally {
        inserter = null;
        reader = null;
    }
}

From source file:com.google.gerrit.pgm.init.VersionedAuthorizedKeysOnInit.java

License:Apache License

private void save(PersonIdent ident, String msg) throws IOException {
    File path = getPath();/*from   w  w  w .j  a va  2 s .  c  om*/
    if (path == null) {
        throw new IOException(project + " does not exist.");
    }

    try (Repository repo = new FileRepository(path);
            ObjectInserter i = repo.newObjectInserter();
            ObjectReader r = repo.newObjectReader();
            RevWalk rw = new RevWalk(reader)) {
        inserter = i;
        reader = r;

        RevTree srcTree = revision != null ? rw.parseTree(revision) : null;
        newTree = readTree(srcTree);

        CommitBuilder commit = new CommitBuilder();
        commit.setAuthor(ident);
        commit.setCommitter(ident);
        commit.setMessage(msg);

        onSave(commit);
        ObjectId res = newTree.writeTree(inserter);
        if (res.equals(srcTree)) {
            return;
        }

        commit.setTreeId(res);
        if (revision != null) {
            commit.addParentId(revision);
        }
        ObjectId newRevision = inserter.insert(commit);
        updateRef(repo, ident, newRevision, "commit: " + msg);
        revision = newRevision;
    } finally {
        inserter = null;
        reader = null;
    }
}

From source file:com.google.gerrit.server.ChangeUtil.java

License:Apache License

public Change.Id revert(ChangeControl ctl, PatchSet.Id patchSetId, String message, PersonIdent myIdent,
        SshInfo sshInfo) throws NoSuchChangeException, OrmException, MissingObjectException,
        IncorrectObjectTypeException, IOException, InvalidChangeOperationException {
    Change.Id changeId = patchSetId.getParentKey();
    PatchSet patch = db.get().patchSets().get(patchSetId);
    if (patch == null) {
        throw new NoSuchChangeException(changeId);
    }//from  www .j a va  2  s  . com
    Change changeToRevert = db.get().changes().get(changeId);

    Project.NameKey project = ctl.getChange().getProject();
    try (Repository git = gitManager.openRepository(project); RevWalk revWalk = new RevWalk(git)) {
        RevCommit commitToRevert = revWalk.parseCommit(ObjectId.fromString(patch.getRevision().get()));

        PersonIdent authorIdent = user().newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone());

        RevCommit parentToCommitToRevert = commitToRevert.getParent(0);
        revWalk.parseHeaders(parentToCommitToRevert);

        CommitBuilder revertCommitBuilder = new CommitBuilder();
        revertCommitBuilder.addParentId(commitToRevert);
        revertCommitBuilder.setTreeId(parentToCommitToRevert.getTree());
        revertCommitBuilder.setAuthor(authorIdent);
        revertCommitBuilder.setCommitter(authorIdent);

        if (message == null) {
            message = MessageFormat.format(ChangeMessages.get().revertChangeDefaultMessage,
                    changeToRevert.getSubject(), patch.getRevision().get());
        }

        ObjectId computedChangeId = ChangeIdUtil.computeChangeId(parentToCommitToRevert.getTree(),
                commitToRevert, authorIdent, myIdent, message);
        revertCommitBuilder.setMessage(ChangeIdUtil.insertId(message, computedChangeId, true));

        RevCommit revertCommit;
        try (ObjectInserter oi = git.newObjectInserter()) {
            ObjectId id = oi.insert(revertCommitBuilder);
            oi.flush();
            revertCommit = revWalk.parseCommit(id);
        }

        RefControl refControl = ctl.getRefControl();
        Change change = new Change(new Change.Key("I" + computedChangeId.name()),
                new Change.Id(db.get().nextChangeId()), user().getAccountId(), changeToRevert.getDest(),
                TimeUtil.nowTs());
        change.setTopic(changeToRevert.getTopic());
        ChangeInserter ins = changeInserterFactory.create(refControl.getProjectControl(), change, revertCommit);
        PatchSet ps = ins.getPatchSet();

        String ref = refControl.getRefName();
        String cmdRef = MagicBranch.NEW_PUBLISH_CHANGE + ref.substring(ref.lastIndexOf('/') + 1);
        CommitReceivedEvent commitReceivedEvent = new CommitReceivedEvent(
                new ReceiveCommand(ObjectId.zeroId(), revertCommit.getId(), cmdRef),
                refControl.getProjectControl().getProject(), refControl.getRefName(), revertCommit, user());

        try {
            commitValidatorsFactory.create(refControl, sshInfo, git)
                    .validateForGerritCommits(commitReceivedEvent);
        } catch (CommitValidationException e) {
            throw new InvalidChangeOperationException(e.getMessage());
        }

        RefUpdate ru = git.updateRef(ps.getRefName());
        ru.setExpectedOldObjectId(ObjectId.zeroId());
        ru.setNewObjectId(revertCommit);
        ru.disableRefLog();
        if (ru.update(revWalk) != RefUpdate.Result.NEW) {
            throw new IOException(String.format("Failed to create ref %s in %s: %s", ps.getRefName(),
                    change.getDest().getParentKey().get(), ru.getResult()));
        }

        ChangeMessage cmsg = new ChangeMessage(new ChangeMessage.Key(changeId, messageUUID(db.get())),
                user().getAccountId(), TimeUtil.nowTs(), patchSetId);
        StringBuilder msgBuf = new StringBuilder();
        msgBuf.append("Patch Set ").append(patchSetId.get()).append(": Reverted");
        msgBuf.append("\n\n");
        msgBuf.append("This patchset was reverted in change: ").append(change.getKey().get());
        cmsg.setMessage(msgBuf.toString());

        ins.setMessage(cmsg).insert();

        try {
            RevertedSender cm = revertedSenderFactory.create(change.getId());
            cm.setFrom(user().getAccountId());
            cm.setChangeMessage(cmsg);
            cm.send();
        } catch (Exception err) {
            log.error("Cannot send email for revert change " + change.getId(), err);
        }

        return change.getId();
    } catch (RepositoryNotFoundException e) {
        throw new NoSuchChangeException(changeId, e);
    }
}

From source file:com.google.gerrit.server.edit.ChangeEditModifier.java

License:Apache License

/**
 * Rebase change edit on latest patch set
 *
 * @param edit change edit that contains edit to rebase
 * @param current patch set to rebase the edit on
 * @throws AuthException/* w w  w . jav a2s  .c om*/
 * @throws ResourceConflictException thrown if rebase fails due to merge conflicts
 * @throws InvalidChangeOperationException
 * @throws IOException
 */
public void rebaseEdit(ChangeEdit edit, PatchSet current)
        throws AuthException, ResourceConflictException, InvalidChangeOperationException, IOException {
    if (!currentUser.get().isIdentifiedUser()) {
        throw new AuthException("Authentication required");
    }

    Change change = edit.getChange();
    IdentifiedUser me = (IdentifiedUser) currentUser.get();
    String refName = RefNames.refsEdit(me.getAccountId(), change.getId(), current.getId());
    try (Repository repo = gitManager.openRepository(change.getProject());
            RevWalk rw = new RevWalk(repo);
            ObjectInserter inserter = repo.newObjectInserter()) {
        BatchRefUpdate ru = repo.getRefDatabase().newBatchUpdate();
        RevCommit editCommit = edit.getEditCommit();
        if (editCommit.getParentCount() == 0) {
            throw new InvalidChangeOperationException("Rebase edit against root commit not supported");
        }
        RevCommit tip = rw.parseCommit(ObjectId.fromString(current.getRevision().get()));
        ThreeWayMerger m = MergeStrategy.RESOLVE.newMerger(repo, true);
        m.setObjectInserter(inserter);
        m.setBase(ObjectId.fromString(edit.getBasePatchSet().getRevision().get()));

        if (m.merge(tip, editCommit)) {
            ObjectId tree = m.getResultTreeId();

            CommitBuilder commit = new CommitBuilder();
            commit.setTreeId(tree);
            for (int i = 0; i < tip.getParentCount(); i++) {
                commit.addParentId(tip.getParent(i));
            }
            commit.setAuthor(editCommit.getAuthorIdent());
            commit.setCommitter(new PersonIdent(editCommit.getCommitterIdent(), TimeUtil.nowTs()));
            commit.setMessage(editCommit.getFullMessage());
            ObjectId newEdit = inserter.insert(commit);
            inserter.flush();

            ru.addCommand(new ReceiveCommand(ObjectId.zeroId(), newEdit, refName));
            ru.addCommand(
                    new ReceiveCommand(edit.getRef().getObjectId(), ObjectId.zeroId(), edit.getRefName()));
            ru.execute(rw, NullProgressMonitor.INSTANCE);
            for (ReceiveCommand cmd : ru.getCommands()) {
                if (cmd.getResult() != ReceiveCommand.Result.OK) {
                    throw new IOException("failed: " + cmd);
                }
            }
        } else {
            // TODO(davido): Allow to resolve conflicts inline
            throw new ResourceConflictException("merge conflict");
        }
    }
}

From source file:com.google.gerrit.server.edit.ChangeEditUtil.java

License:Apache License

private static RevCommit writeSquashedCommit(RevWalk rw, ObjectInserter inserter, RevCommit parent,
        RevCommit edit) throws IOException {
    CommitBuilder mergeCommit = new CommitBuilder();
    for (int i = 0; i < parent.getParentCount(); i++) {
        mergeCommit.addParentId(parent.getParent(i));
    }/*from   w  w w . j a  v  a  2  s.c o m*/
    mergeCommit.setAuthor(parent.getAuthorIdent());
    mergeCommit.setMessage(edit.getFullMessage());
    mergeCommit.setCommitter(edit.getCommitterIdent());
    mergeCommit.setTreeId(edit.getTree());

    return rw.parseCommit(commit(inserter, mergeCommit));
}

From source file:com.google.gerrit.server.git.VersionedMetaData.java

License:Apache License

/**
 * Open a batch of updates to the same metadata ref.
 * <p>/*from ww w . j a  v  a  2  s  .  c om*/
 * This allows making multiple commits to a single metadata ref, at the end of
 * which is a single ref update. For batching together updates to multiple
 * refs (each consisting of one or more commits against their respective
 * refs), create the {@link MetaDataUpdate} with a {@link BatchRefUpdate}.
 * <p>
 * A ref update produced by this {@link BatchMetaDataUpdate} is only committed
 * if there is no associated {@link BatchRefUpdate}. As a result, the
 * configured ref updated event is not fired if there is an associated batch.
 *
 * @param update helper info about the update.
 * @throws IOException if the update failed.
 */
public BatchMetaDataUpdate openUpdate(final MetaDataUpdate update) throws IOException {
    final Repository db = update.getRepository();

    reader = db.newObjectReader();
    inserter = db.newObjectInserter();
    final RevWalk rw = new RevWalk(reader);
    final RevTree tree = revision != null ? rw.parseTree(revision) : null;
    newTree = readTree(tree);
    return new BatchMetaDataUpdate() {
        AnyObjectId src = revision;
        AnyObjectId srcTree = tree;

        @Override
        public void write(CommitBuilder commit) throws IOException {
            write(VersionedMetaData.this, commit);
        }

        private boolean doSave(VersionedMetaData config, CommitBuilder commit) throws IOException {
            DirCache nt = config.newTree;
            ObjectReader r = config.reader;
            ObjectInserter i = config.inserter;
            try {
                config.newTree = newTree;
                config.reader = reader;
                config.inserter = inserter;
                return config.onSave(commit);
            } catch (ConfigInvalidException e) {
                throw new IOException(
                        "Cannot update " + getRefName() + " in " + db.getDirectory() + ": " + e.getMessage(),
                        e);
            } finally {
                config.newTree = nt;
                config.reader = r;
                config.inserter = i;
            }
        }

        @Override
        public void write(VersionedMetaData config, CommitBuilder commit) throws IOException {
            if (!doSave(config, commit)) {
                return;
            }

            // Reuse tree from parent commit unless there are contents in newTree or
            // there is no tree for a parent commit.
            ObjectId res = newTree.getEntryCount() != 0 || srcTree == null ? newTree.writeTree(inserter)
                    : srcTree.copy();
            if (res.equals(srcTree) && !update.allowEmpty() && (commit.getTreeId() == null)) {
                // If there are no changes to the content, don't create the commit.
                return;
            }

            // If changes are made to the DirCache and those changes are written as
            // a commit and then the tree ID is set for the CommitBuilder, then
            // those previous DirCache changes will be ignored and the commit's
            // tree will be replaced with the ID in the CommitBuilder. The same is
            // true if you explicitly set tree ID in a commit and then make changes
            // to the DirCache; that tree ID will be ignored and replaced by that of
            // the tree for the updated DirCache.
            if (commit.getTreeId() == null) {
                commit.setTreeId(res);
            } else {
                // In this case, the caller populated the tree without using DirCache.
                res = commit.getTreeId();
            }

            if (src != null) {
                commit.addParentId(src);
            }

            if (update.insertChangeId()) {
                ObjectId id = ChangeIdUtil.computeChangeId(res, getRevision(), commit.getAuthor(),
                        commit.getCommitter(), commit.getMessage());
                commit.setMessage(ChangeIdUtil.insertId(commit.getMessage(), id));
            }

            src = inserter.insert(commit);
            srcTree = res;
        }

        @Override
        public RevCommit createRef(String refName) throws IOException {
            if (Objects.equals(src, revision)) {
                return revision;
            }
            return updateRef(ObjectId.zeroId(), src, refName);
        }

        @Override
        public void removeRef(String refName) throws IOException {
            RefUpdate ru = db.updateRef(refName);
            ru.setForceUpdate(true);
            if (revision != null) {
                ru.setExpectedOldObjectId(revision);
            }
            RefUpdate.Result result = ru.delete();
            switch (result) {
            case FORCED:
                update.fireGitRefUpdatedEvent(ru);
                return;
            default:
                throw new IOException(
                        "Cannot delete " + ru.getName() + " in " + db.getDirectory() + ": " + ru.getResult());
            }
        }

        @Override
        public RevCommit commit() throws IOException {
            return commitAt(revision);
        }

        @Override
        public RevCommit commitAt(ObjectId expected) throws IOException {
            if (Objects.equals(src, expected)) {
                return revision;
            }
            return updateRef(MoreObjects.firstNonNull(expected, ObjectId.zeroId()), src, getRefName());
        }

        @Override
        public void close() {
            newTree = null;

            rw.close();
            if (inserter != null) {
                inserter.close();
                inserter = null;
            }

            if (reader != null) {
                reader.close();
                reader = null;
            }
        }

        private RevCommit updateRef(AnyObjectId oldId, AnyObjectId newId, String refName) throws IOException {
            BatchRefUpdate bru = update.getBatch();
            if (bru != null) {
                bru.addCommand(new ReceiveCommand(oldId.toObjectId(), newId.toObjectId(), refName));
                inserter.flush();
                revision = rw.parseCommit(newId);
                return revision;
            }

            RefUpdate ru = db.updateRef(refName);
            ru.setExpectedOldObjectId(oldId);
            ru.setNewObjectId(src);
            ru.setRefLogIdent(update.getCommitBuilder().getAuthor());
            String message = update.getCommitBuilder().getMessage();
            if (message == null) {
                message = "meta data update";
            }
            try (BufferedReader reader = new BufferedReader(new StringReader(message))) {
                // read the subject line and use it as reflog message
                ru.setRefLogMessage("commit: " + reader.readLine(), true);
            }
            inserter.flush();
            RefUpdate.Result result = ru.update();
            switch (result) {
            case NEW:
            case FAST_FORWARD:
                revision = rw.parseCommit(ru.getNewObjectId());
                update.fireGitRefUpdatedEvent(ru);
                return revision;
            default:
                throw new IOException(
                        "Cannot update " + ru.getName() + " in " + db.getDirectory() + ": " + ru.getResult());
            }
        }
    };
}

From source file:com.google.gerrit.server.patch.AutoMerger.java

License:Apache License

private RevCommit commit(Repository repo, RevWalk rw, ObjectInserter ins, String refName, ObjectId tree,
        RevCommit merge) throws IOException {
    rw.parseHeaders(merge);//  w w  w . j av  a  2  s.co m
    // For maximum stability, choose a single ident using the committer time of
    // the input commit, using the server name and timezone.
    PersonIdent ident = new PersonIdent(gerritIdent, merge.getCommitterIdent().getWhen(),
            gerritIdent.getTimeZone());
    CommitBuilder cb = new CommitBuilder();
    cb.setAuthor(ident);
    cb.setCommitter(ident);
    cb.setTreeId(tree);
    cb.setMessage("Auto-merge of " + merge.name() + '\n');
    for (RevCommit p : merge.getParents()) {
        cb.addParentId(p);
    }
    ObjectId commitId;
    commitId = ins.insert(cb);
    if (save) {
        ins.flush();

        RefUpdate ru = repo.updateRef(refName);
        ru.setNewObjectId(commitId);
        ru.disableRefLog();
        ru.forceUpdate();
    }
    return rw.parseCommit(commitId);
}

From source file:com.google.gerrit.server.schema.Schema_65.java

License:Apache License

@Override
protected void migrateData(ReviewDb db, UpdateUI ui) throws OrmException, SQLException {
    Repository git;//from  ww  w . j  a  v a2 s  .com
    try {
        git = mgr.openRepository(allProjects);
    } catch (IOException e) {
        throw new OrmException(e);
    }
    try {
        MetaDataUpdate md = new MetaDataUpdate(GitReferenceUpdated.DISABLED, allProjects, git);
        ProjectConfig config = ProjectConfig.read(md);
        Map<Integer, ContributorAgreement> agreements = getAgreementToAdd(db, config);
        if (agreements.isEmpty()) {
            return;
        }
        ui.message("Moved contributor agreements to project.config");

        // Create the auto verify groups.
        List<AccountGroup.UUID> adminGroupUUIDs = getAdministrateServerGroups(db, config);
        for (ContributorAgreement agreement : agreements.values()) {
            if (agreement.getAutoVerify() != null) {
                getOrCreateGroupForIndividuals(db, config, adminGroupUUIDs, agreement);
            }
        }

        // Scan AccountAgreement
        long minTime = addAccountAgreements(db, config, adminGroupUUIDs, agreements);

        ProjectConfig base = ProjectConfig.read(md, null);
        for (ContributorAgreement agreement : agreements.values()) {
            base.replace(agreement);
        }
        base.getAccountsSection().setSameGroupVisibility(config.getAccountsSection().getSameGroupVisibility());

        BatchMetaDataUpdate batch = base.openUpdate(md);
        try {
            // Scan AccountGroupAgreement
            List<AccountGroupAgreement> groupAgreements = getAccountGroupAgreements(db, agreements);

            // Find the earliest change
            for (AccountGroupAgreement aga : groupAgreements) {
                minTime = Math.min(minTime, aga.getTime());
            }
            minTime -= 60 * 1000; // 1 Minute

            CommitBuilder commit = new CommitBuilder();
            commit.setAuthor(new PersonIdent(serverUser, new Date(minTime)));
            commit.setCommitter(new PersonIdent(serverUser, new Date(minTime)));
            commit.setMessage("Add the ContributorAgreements for upgrade to Gerrit Code Review schema 65\n");
            batch.write(commit);

            for (AccountGroupAgreement aga : groupAgreements) {
                AccountGroup group = db.accountGroups().get(aga.groupId);
                if (group == null) {
                    continue;
                }

                ContributorAgreement agreement = agreements.get(aga.claId);
                agreement.getAccepted().add(new PermissionRule(config.resolve(group)));
                base.replace(agreement);

                PersonIdent ident = null;
                if (aga.reviewedBy != null) {
                    Account ua = db.accounts().get(aga.reviewedBy);
                    if (ua != null) {
                        String name = ua.getFullName();
                        String email = ua.getPreferredEmail();

                        if (email == null || email.isEmpty()) {
                            // No preferred email is configured. Use a generic identity so we
                            // don't leak an address the user may have given us, but doesn't
                            // necessarily want to publish through Git records.
                            //
                            String user = ua.getUserName();
                            if (user == null || user.isEmpty()) {
                                user = "account-" + ua.getId().toString();
                            }

                            String host = SystemReader.getInstance().getHostname();
                            email = user + "@" + host;
                        }

                        if (name == null || name.isEmpty()) {
                            final int at = email.indexOf('@');
                            if (0 < at) {
                                name = email.substring(0, at);
                            } else {
                                name = anonymousCowardName;
                            }
                        }

                        ident = new PersonIdent(name, email, new Date(aga.getTime()), TimeZone.getDefault());
                    }
                }
                if (ident == null) {
                    ident = new PersonIdent(serverUser, new Date(aga.getTime()));
                }

                // Build the commits such that it keeps track of the date added and
                // who added it.
                commit = new CommitBuilder();
                commit.setAuthor(ident);
                commit.setCommitter(new PersonIdent(serverUser, new Date(aga.getTime())));

                String msg = String.format("Accept %s contributor agreement for %s\n", agreement.getName(),
                        group.getName());
                if (!Strings.isNullOrEmpty(aga.reviewComments)) {
                    msg += "\n" + aga.reviewComments + "\n";
                }
                commit.setMessage(msg);
                batch.write(commit);
            }

            // Merge the agreements with the other data in project.config.
            commit = new CommitBuilder();
            commit.setAuthor(serverUser);
            commit.setCommitter(serverUser);
            commit.setMessage("Upgrade to Gerrit Code Review schema 65\n");
            commit.addParentId(config.getRevision());
            batch.write(config, commit);

            // Save the the final metadata.
            batch.commitAt(config.getRevision());
        } finally {
            batch.close();
        }
    } catch (IOException e) {
        throw new OrmException(e);
    } catch (ConfigInvalidException e) {
        throw new OrmException(e);
    } finally {
        git.close();
    }
}