in src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java [77:149]
void replay(GerritApi api)
throws IOException, OrmException, NoSuchAccountException, RestApiException,
ConfigInvalidException {
List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
sortRevisionInfoByNumber(revisions);
List<PatchSet> patchSets = new ArrayList<>();
db.changes().beginTransaction(change.getId());
try {
PatchSetInfo info = null;
for (RevisionInfo r : revisions) {
PatchSet ps = new PatchSet(new PatchSet.Id(change.getId(), r._number));
String newRef = ps.getId().toRefName();
ObjectId newId = repo.resolve(newRef);
String origRef = imported(r.ref);
ObjectId id = repo.resolve(origRef);
if (id == null) {
continue;
}
RevCommit commit = rw.parseCommit(id);
if (newId != null) {
RevCommit newCommit = rw.parseCommit(newId);
if (newCommit.equals(commit)) {
// already replayed
continue;
}
// a patch set with the same number was created both in the source
// and in the target system
log.warn(
String.format(
"Project %s was modified in target system: "
+ "Skip replay revision for patch set %s.",
change.getProject().get(), ps.getId().toString()));
continue;
}
patchSets.add(ps);
ps.setUploader(accountUtil.resolveUser(api, r.uploader));
ps.setCreatedOn(r.created);
ps.setRevision(new RevId(commit.name()));
info = patchSetInfoFactory.get(rw, commit, ps.getId());
if (info.getRevId().equals(changeInfo.currentRevision)) {
change.setCurrentPatchSet(info);
}
updateRef(repo, ps);
}
if (change.currentPatchSetId() == null) {
if (changeInfo.currentRevision != null) {
log.warn(
String.format(
"Current revision %s of change %s not found."
+ " Setting lastest revision %s as current patch set.",
changeInfo.currentRevision, changeInfo.id, info.getRevId()));
} else {
log.warn(
String.format(
"Change %s has no current revision."
+ " Setting lastest revision %s as current patch set.",
changeInfo.id, info.getRevId()));
}
change.setCurrentPatchSet(info);
}
db.patchSets().insert(patchSets);
db.commit();
} finally {
db.rollback();
}
}