diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java index eb9f4eaeac..66d8a75400 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/RevisionResource.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.change; +import com.google.common.base.Optional; import com.google.gerrit.extensions.restapi.RestResource; import com.google.gerrit.extensions.restapi.RestResource.HasETag; import com.google.gerrit.extensions.restapi.RestView; @@ -21,6 +22,7 @@ import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.client.Change; import com.google.gerrit.reviewdb.client.PatchSet; import com.google.gerrit.server.IdentifiedUser; +import com.google.gerrit.server.edit.ChangeEdit; import com.google.gerrit.server.notedb.ChangeNotes; import com.google.gerrit.server.project.ChangeControl; import com.google.inject.TypeLiteral; @@ -31,11 +33,18 @@ public class RevisionResource implements RestResource, HasETag { private final ChangeResource change; private final PatchSet ps; + private final Optional edit; private boolean cacheable = true; public RevisionResource(ChangeResource change, PatchSet ps) { + this(change, ps, Optional. absent()); + } + + public RevisionResource(ChangeResource change, PatchSet ps, + Optional edit) { this.change = change; this.ps = ps; + this.edit = edit; } public boolean isCacheable() { @@ -82,4 +91,8 @@ public class RevisionResource implements RestResource, HasETag { cacheable = false; return this; } + + Optional getEdit() { + return edit; + } } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java index 8f8de472e7..ed870c8c5f 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/Revisions.java @@ -14,7 +14,9 @@ package com.google.gerrit.server.change; +import com.google.common.base.Function; import com.google.common.base.Optional; +import com.google.common.collect.FluentIterable; import com.google.common.collect.Lists; import com.google.gerrit.extensions.registration.DynamicMap; import com.google.gerrit.extensions.restapi.AuthException; @@ -74,17 +76,18 @@ public class Revisions implements ChildCollection match = Lists.newArrayListWithExpectedSize(2); - for (PatchSet ps : find(change, id.get())) { - Change.Id changeId = ps.getId().getParentKey(); - if (changeId.equals(change.getChange().getId()) && visible(change, ps)) { - match.add(ps); + List match = Lists.newArrayListWithExpectedSize(2); + for (RevisionResource rsrc : find(change, id.get())) { + Change.Id changeId = rsrc.getChange().getId(); + if (changeId.equals(change.getChange().getId()) + && visible(change, rsrc.getPatchSet())) { + match.add(rsrc); } } if (match.size() != 1) { throw new ResourceNotFoundException(id); } - return new RevisionResource(change, match.get(0)); + return match.get(0); } private boolean visible(ChangeResource change, PatchSet ps) @@ -92,7 +95,7 @@ public class Revisions implements ChildCollection find(ChangeResource change, String id) + private List find(ChangeResource change, String id) throws OrmException { ReviewDb db = dbProvider.get(); @@ -104,7 +107,7 @@ public class Revisions implements ChildCollection RevId.LEN) { @@ -118,27 +121,29 @@ public class Revisions implements ChildCollection list = db.patchSets().byRevision(revid).toList(); + List list = + toResources(change, db.patchSets().byRevision(revid)); if (list.isEmpty()) { return loadEdit(change, revid); } return list; } else { - return db.patchSets().byRevisionRange(revid, revid.max()).toList(); + return toResources( + change, db.patchSets().byRevisionRange(revid, revid.max())); } } else { // Chance of collision rises; look at all patch sets on the change. - List out = Lists.newArrayList(); + List out = Lists.newArrayList(); for (PatchSet ps : db.patchSets().byChange(change.getChange().getId())) { if (ps.getRevision() != null && ps.getRevision().get().startsWith(id)) { - out.add(ps); + out.add(new RevisionResource(change, ps)); } } return out; } } - private List loadEdit(ChangeResource change, RevId revid) + private List loadEdit(ChangeResource change, RevId revid) throws OrmException { try { Optional edit = editUtil.byChange(change.getChange()); @@ -147,7 +152,8 @@ public class Revisions implements ChildCollection toResources(final ChangeResource change, + Iterable patchSets) { + return FluentIterable.from(patchSets) + .transform(new Function() { + @Override + public RevisionResource apply(PatchSet in) { + return new RevisionResource(change, in); + } + }).toList(); + } + + private static List toResources(ChangeResource change, + PatchSet ps) { + return Collections.singletonList(new RevisionResource(change, ps)); + } }