Fix broken build on Gerrit master (2.13-SNAPSHOT) Since the merge of I2d961f8d it is not possible to find patch-sets by SHA1 anymore. We need to leverage the Lucene index to check if a pull-request commit has been already imported or not. MenuItem is now imported from com.google.gerrit.extensions.client to be able to compile against the latest Gerrit master. Change-Id: I9868b3a0c1c58bb2ea027be58a561252773277fa
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubTopMenu.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubTopMenu.java index 12a9b30..d05b6d6 100644 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubTopMenu.java +++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/GitHubTopMenu.java
@@ -15,6 +15,7 @@ import com.google.gerrit.extensions.annotations.Listen; import com.google.gerrit.extensions.annotations.PluginName; +import com.google.gerrit.extensions.client.MenuItem; import com.google.gerrit.extensions.webui.TopMenu; import com.google.gerrit.reviewdb.client.AuthType; import com.google.gerrit.server.CurrentUser;
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestCreateChange.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestCreateChange.java index d72d450..eaa7169 100644 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestCreateChange.java +++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/git/PullRequestCreateChange.java
@@ -24,11 +24,11 @@ import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project; -import com.google.gerrit.reviewdb.client.RevId; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.ChangeUtil; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.IdentifiedUser.GenericFactory; +import com.google.gerrit.server.Sequences; import com.google.gerrit.server.change.ChangeInserter; import com.google.gerrit.server.change.PatchSetInserter; import com.google.gerrit.server.git.BatchUpdate; @@ -40,10 +40,13 @@ import com.google.gerrit.server.project.NoSuchProjectException; import com.google.gerrit.server.project.ProjectControl; import com.google.gerrit.server.project.RefControl; +import com.google.gerrit.server.query.QueryParseException; import com.google.gerrit.server.query.change.ChangeData; +import com.google.gerrit.server.query.change.ChangeQueryBuilder; import com.google.gerrit.server.query.change.InternalChangeQuery; +import com.google.gerrit.server.query.change.QueryProcessor; +import com.google.gerrit.server.query.change.QueryResult; import com.google.gwtorm.server.OrmException; -import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Provider; @@ -60,6 +63,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -74,6 +78,8 @@ private final GenericFactory userFactory; private final Provider<InternalChangeQuery> queryProvider; private final BatchUpdate.Factory updateFactory; + private final QueryProcessor qp; + private final ChangeQueryBuilder changeQuery; @Inject PullRequestCreateChange(ChangeInserter.Factory changeInserterFactory, @@ -81,13 +87,17 @@ ProjectControl.Factory projectControlFactory, IdentifiedUser.GenericFactory userFactory, Provider<InternalChangeQuery> queryProvider, - BatchUpdate.Factory batchUpdateFactory) { + BatchUpdate.Factory batchUpdateFactory, + QueryProcessor qp, + ChangeQueryBuilder changeQuery) { this.changeInserterFactory = changeInserterFactory; this.patchSetInserterFactory = patchSetInserterFactory; this.projectControlFactory = projectControlFactory; this.userFactory = userFactory; this.queryProvider = queryProvider; this.updateFactory = batchUpdateFactory; + this.qp = qp; + this.changeQuery = changeQuery; } public Change.Id addCommitToChange(ReviewDb db, final Project project, @@ -118,7 +128,7 @@ throw new InvalidChangeOperationException( "Destination branch cannot be null or empty"); } - Ref destRef = repo.getRef(destinationBranch); + Ref destRef = repo.findRef(destinationBranch); if (destRef == null) { throw new InvalidChangeOperationException("Branch " + destinationBranch + " does not exist."); @@ -129,14 +139,10 @@ destinationBranch); String pullRequestSha1 = pullRequestCommit.getId().getName(); - ResultSet<PatchSet> existingPatchSet = - db.patchSets().byRevision(new RevId(pullRequestSha1)); - Iterator<PatchSet> patchSetIterator = existingPatchSet.iterator(); - if (patchSetIterator.hasNext()) { - PatchSet patchSet = patchSetIterator.next(); + List<ChangeData> existingChanges = queryChangesForSha1(pullRequestSha1); + if (!existingChanges.isEmpty()) { LOG.debug("Pull request commit ID " + pullRequestSha1 - + " has been already uploaded as PatchSetID=" - + patchSet.getPatchSetId() + " in ChangeID=" + patchSet.getId()); + + " has been already uploaded as Change-Id=" + existingChanges.get(0).getId()); return null; } @@ -186,6 +192,18 @@ topic); } + private List<ChangeData> queryChangesForSha1(String pullRequestSha1) { + QueryResult results; + try { + results = qp.queryChanges(changeQuery.commit(pullRequestSha1)); + return results.changes(); + } catch (OrmException | QueryParseException e) { + LOG.error("Invalid SHA1 " + pullRequestSha1 + + ": cannot query changes for this pull request", e); + return Collections.emptyList(); + } + } + private void insertPatchSet(BatchUpdate bu, Repository git, Change change, RevCommit cherryPickCommit, RefControl refControl, String pullRequestMessage) throws IOException, UpdateException, @@ -217,7 +235,10 @@ change.setTopic(topic); } ChangeInserter ins = - changeInserterFactory.create(refControl, change, pullRequestCommit); + changeInserterFactory.create( + change.getId(), + pullRequestCommit, + refControl.getRefName()); ins.setMessage(pullRequestMessage); bu.insertChange(ins);
diff --git a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/PullRequestListController.java b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/PullRequestListController.java index ef90d04..4fd0d66 100644 --- a/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/PullRequestListController.java +++ b/github-plugin/src/main/java/com/googlesource/gerrit/plugins/github/wizard/PullRequestListController.java
@@ -17,18 +17,18 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.reviewdb.client.Project.NameKey; -import com.google.gerrit.reviewdb.client.RevId; import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.git.GitRepositoryManager; import com.google.gerrit.server.project.ProjectCache; +import com.google.gerrit.server.query.QueryParseException; +import com.google.gerrit.server.query.change.ChangeQueryBuilder; +import com.google.gerrit.server.query.change.QueryProcessor; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import com.google.gwtorm.server.OrmException; -import com.google.gwtorm.server.ResultSet; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -70,15 +70,22 @@ private final ProjectCache projectsCache; private final GitRepositoryManager repoMgr; private final Provider<ReviewDb> schema; + private final QueryProcessor qp; + private final ChangeQueryBuilder changeQuery; @Inject - public PullRequestListController(final ProjectCache projectsCache, - final GitRepositoryManager repoMgr, final Provider<ReviewDb> schema, - final GitHubConfig config) { + public PullRequestListController(ProjectCache projectsCache, + GitRepositoryManager repoMgr, + Provider<ReviewDb> schema, + GitHubConfig config, + QueryProcessor qp, + ChangeQueryBuilder changeQuery) { this.projectsCache = projectsCache; this.repoMgr = repoMgr; this.schema = schema; this.config = config; + this.qp = qp; + this.changeQuery = changeQuery; } @Override @@ -192,31 +199,18 @@ Repository gitRepo, GHPullRequest ghPullRequest) throws IncorrectObjectTypeException, IOException { boolean pullRequestToImport = false; - try (RevWalk gitWalk = new RevWalk(gitRepo)) { + try { for (GHPullRequestCommitDetail pullRequestCommit : ghPullRequest .listCommits()) { - ObjectId pullRequestHeadObjectId = - ObjectId.fromString(pullRequestCommit.getSha()); - - try { - gitWalk.parseCommit(pullRequestHeadObjectId); - - ResultSet<PatchSet> patchSets; - try { - patchSets = - db.patchSets().byRevision(new RevId(pullRequestCommit.getSha())); - } catch (OrmException e) { - LOG.error("Error whilst fetching patch-sets from DB associated to commit " - + pullRequestCommit.getSha()); - return false; - } - pullRequestToImport = !patchSets.iterator().hasNext(); - patchSets.close(); - } catch (MissingObjectException e) { - pullRequestToImport = true; - } + pullRequestToImport |= + qp.queryChanges(changeQuery.commit(pullRequestCommit.getSha())) + .changes().isEmpty(); } return pullRequestToImport; + } catch (OrmException | QueryParseException e) { + LOG.error("Unable to query Gerrit changes for pull-request " + + ghPullRequest.getNumber(), e); + return false; } } }