Extract RevisionNote.Comment and use it instead of PatchLineComment

There are 3 classes that represent an inline comment:
- CommentInfo represents an inline comment in the REST API
- PatchLineComment represents an inline comment in ReviewDb
- RevisionNote.Comment represents an inline comment in NoteDb

To support robot comments CommentInfo and RevisionNote.Comment must be
extended so that the additional fields that are specific for robot
comments can be supported. PatchLineComment should not be touched
since robot comments will only be supported with NoteDb, but not with
ReviewDb.

At the moment PatchLineComment is also used to represent inline
comments in all middle layers and in all utility classes that deal
with inline comments. This means if NoteDb is used, inline comments
come in over REST as CommentInfo, then they are converted into
PatchLineComment and for storing them in NoteDb they are converted to
RevisionNote.Comment. The intermediate transformation to
PatchLineComment is bad for implementing robot comments, since this
class should stay unchanged.

To fix this RevisionNote.Comment is extracted into an own Comment
class and then Comment is used instead of PatchLineComment in the
middle layer. This means when NoteDb is used, inline comments are only
converted once, from CommentInfo to Comment. Both types will have
extensions for robot comments (by subtypes).

For storing inline comments in ReviewDb inline comments are converted
from CommentInfo to Comment to PatchLineComment. This is better than
having the double-conversion for NoteDb, because ReviewDb will be
removed in favour of NoteDb. This means when ReviewDb is removed
PatchLineComment can then easily be deleted, as it's no longer used
all over the codebase, but only in the ReviewDb layer.

Change-Id: I53481e8231e04aeca5b924e409e97b0f1d53f516
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin 2016-09-19 16:30:24 +02:00
parent e24f8b44f9
commit 10ba6179cb
48 changed files with 1220 additions and 1055 deletions

View File

@ -33,7 +33,7 @@ import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.server.config.AllUsersName;
@ -152,8 +152,8 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest {
for (ChangeMessage m : cd.messages()) {
assertThat(m.getPatchSetId()).named(m.toString()).isNotEqualTo(delPsId);
}
for (PatchLineComment c : cd.publishedComments()) {
assertThat(c.getPatchSetId()).named(c.toString()).isNotEqualTo(delPsId);
for (Comment c : cd.publishedComments()) {
assertThat(c.key.patchSetId).named(c.toString()).isNotEqualTo(delPsId.get());
}
}
@ -187,8 +187,8 @@ public class DeleteDraftPatchSetIT extends AbstractDaemonTest {
for (ChangeMessage m : cd.messages()) {
assertThat(m.getPatchSetId()).named(m.toString()).isNotEqualTo(delPsId);
}
for (PatchLineComment c : cd.publishedComments()) {
assertThat(c.getPatchSetId()).named(c.toString()).isNotEqualTo(delPsId);
for (Comment c : cd.publishedComments()) {
assertThat(c.key.patchSetId).named(c.toString()).isNotEqualTo(delPsId.get());
}
}

View File

@ -46,7 +46,7 @@ import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.Sequences;
import com.google.gerrit.server.change.PostReview;
import com.google.gerrit.server.change.Rebuild;
@ -109,7 +109,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
private Provider<ReviewDb> dbProvider;
@Inject
private PatchLineCommentsUtil plcUtil;
private CommentsUtil commentsUtil;
@Inject
private Provider<PostReview> postReview;
@ -390,7 +390,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Check that the bundles are equal.
ChangeBundle actual = ChangeBundle.fromNotes(
plcUtil, notesFactory.create(dbProvider.get(), project, id));
commentsUtil, notesFactory.create(dbProvider.get(), project, id));
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
}
@ -441,7 +441,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Check that the bundles are equal.
ChangeNotes notes = notesFactory.create(dbProvider.get(), project, id);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
assertThat(
@ -475,7 +475,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Check that the bundles are equal.
ChangeBundle actual = ChangeBundle.fromNotes(
plcUtil, notesFactory.create(dbProvider.get(), project, id));
commentsUtil, notesFactory.create(dbProvider.get(), project, id));
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
}
@ -505,7 +505,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Not up to date, but the actual returned state matches anyway.
assertChangeUpToDate(false, id);
assertThat(getMetaRef(project, changeMetaRef(id))).isEqualTo(oldMetaId);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
assertChangeUpToDate(false, id);
@ -547,7 +547,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Not up to date, but the actual returned state matches anyway.
assertDraftsUpToDate(false, id, user);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();
@ -602,7 +602,7 @@ public class ChangeRebuilderIT extends AbstractDaemonTest {
// Not up to date, but the actual returned state matches anyway.
assertChangeUpToDate(true, id);
assertDraftsUpToDate(false, id, user);
ChangeBundle actual = ChangeBundle.fromNotes(plcUtil, notes);
ChangeBundle actual = ChangeBundle.fromNotes(commentsUtil, notes);
ChangeBundle expected = bundleReader.fromReviewDb(getUnwrappedDb(), id);
assertThat(actual.differencesFrom(expected)).isEmpty();

View File

@ -14,7 +14,8 @@
package com.google.gerrit.common.data;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import java.util.ArrayList;
@ -24,14 +25,14 @@ import java.util.List;
import java.util.Map;
public class CommentDetail {
protected List<PatchLineComment> a;
protected List<PatchLineComment> b;
protected List<Comment> a;
protected List<Comment> b;
protected AccountInfoCache accounts;
private transient PatchSet.Id idA;
private transient PatchSet.Id idB;
private transient Map<Integer, List<PatchLineComment>> forA;
private transient Map<Integer, List<PatchLineComment>> forB;
private transient Map<Integer, List<Comment>> forA;
private transient Map<Integer, List<Comment>> forB;
public CommentDetail(PatchSet.Id idA, PatchSet.Id idB) {
this.a = new ArrayList<>();
@ -43,9 +44,9 @@ public class CommentDetail {
protected CommentDetail() {
}
public boolean include(final PatchLineComment p) {
final PatchSet.Id psId = p.getKey().getParentKey().getParentKey();
switch (p.getSide()) {
public boolean include(Change.Id changeId, Comment p) {
PatchSet.Id psId = new PatchSet.Id(changeId, p.key.patchSetId);
switch (p.side) {
case 0:
if (idA == null && idB.equals(psId)) {
a.add(p);
@ -76,11 +77,11 @@ public class CommentDetail {
return accounts;
}
public List<PatchLineComment> getCommentsA() {
public List<Comment> getCommentsA() {
return a;
}
public List<PatchLineComment> getCommentsB() {
public List<Comment> getCommentsB() {
return b;
}
@ -88,24 +89,23 @@ public class CommentDetail {
return a.isEmpty() && b.isEmpty();
}
public List<PatchLineComment> getForA(final int lineNbr) {
public List<Comment> getForA(int lineNbr) {
if (forA == null) {
forA = index(a);
}
return get(forA, lineNbr);
}
public List<PatchLineComment> getForB(final int lineNbr) {
public List<Comment> getForB(int lineNbr) {
if (forB == null) {
forB = index(b);
}
return get(forB, lineNbr);
}
private static List<PatchLineComment> get(
final Map<Integer, List<PatchLineComment>> m, final int i) {
final List<PatchLineComment> r = m.get(i);
return r != null ? orderComments(r) : Collections.<PatchLineComment> emptyList();
private static List<Comment> get(Map<Integer, List<Comment>> m, int i) {
List<Comment> r = m.get(i);
return r != null ? orderComments(r) : Collections.<Comment> emptyList();
}
/**
@ -116,21 +116,21 @@ public class CommentDetail {
* @param comments The list of comments for a given line.
* @return The comments sorted as they should appear in the UI
*/
private static List<PatchLineComment> orderComments(List<PatchLineComment> comments) {
private static List<Comment> orderComments(List<Comment> comments) {
// Map of comments keyed by their parent. The values are lists of comments since it is
// possible for several comments to have the same parent (this can happen if two reviewers
// click Reply on the same comment at the same time). Such comments will be displayed under
// their correct parent in chronological order.
Map<String, List<PatchLineComment>> parentMap = new HashMap<>();
Map<String, List<Comment>> parentMap = new HashMap<>();
// It's possible to have more than one root comment if two reviewers create a comment on the
// same line at the same time
List<PatchLineComment> rootComments = new ArrayList<>();
List<Comment> rootComments = new ArrayList<>();
// Store all the comments in parentMap, keyed by their parent
for (PatchLineComment c : comments) {
String parentUuid = c.getParentUuid();
List<PatchLineComment> l = parentMap.get(parentUuid);
for (Comment c : comments) {
String parentUuid = c.parentUuid;
List<Comment> l = parentMap.get(parentUuid);
if (l == null) {
l = new ArrayList<>();
parentMap.put(parentUuid, l);
@ -143,7 +143,7 @@ public class CommentDetail {
// Add the comments in the list, starting with the head and then going through all the
// comments that have it as a parent, and so on
List<PatchLineComment> result = new ArrayList<>();
List<Comment> result = new ArrayList<>();
addChildren(parentMap, rootComments, result);
return result;
@ -152,24 +152,23 @@ public class CommentDetail {
/**
* Add the comments to {@code outResult}, depth first
*/
private static void addChildren(Map<String, List<PatchLineComment>> parentMap,
List<PatchLineComment> children, List<PatchLineComment> outResult) {
private static void addChildren(Map<String, List<Comment>> parentMap,
List<Comment> children, List<Comment> outResult) {
if (children != null) {
for (PatchLineComment c : children) {
for (Comment c : children) {
outResult.add(c);
addChildren(parentMap, parentMap.get(c.getKey().get()), outResult);
addChildren(parentMap, parentMap.get(c.key.uuid), outResult);
}
}
}
private Map<Integer, List<PatchLineComment>> index(
List<PatchLineComment> in) {
HashMap<Integer, List<PatchLineComment>> r = new HashMap<>();
for (final PatchLineComment p : in) {
List<PatchLineComment> l = r.get(p.getLine());
private Map<Integer, List<Comment>> index(List<Comment> in) {
HashMap<Integer, List<Comment>> r = new HashMap<>();
for (Comment p : in) {
List<Comment> l = r.get(p.lineNbr);
if (l == null) {
l = new ArrayList<>();
r.put(p.getLine(), l);
r.put(p.lineNbr, l);
}
l.add(p);
}

View File

@ -0,0 +1,263 @@
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.gerrit.reviewdb.client;
import java.sql.Timestamp;
import java.util.Objects;
/**
* This class represents inline comments in NoteDb. This means it determines the
* JSON format for inline comments in the revision notes that NoteDb uses to
* persist inline comments.
* <p>
* Changing fields in this class changes the storage format of inline comments
* in NoteDb and may require a corresponding data migration (adding new optional
* fields is generally okay).
* <p>
* {@link PatchLineComment} also represents inline comments, but in ReviewDb.
* There are a few notable differences:
* <ul>
* <li>PatchLineComment knows the comment status (published or draft). For
* comments in NoteDb the status is determined by the branch in which they are
* stored (published comments are stored in the change meta ref; draft comments
* are store in refs/draft-comments branches in All-Users). Hence Comment
* doesn't need to contain the status, but the status is implicitly known by
* where the comments are read from.
* <li>PatchLineComment knows the change ID. For comments in NoteDb, the change
* ID is determined by the branch in which they are stored (the ref name
* contains the change ID). Hence Comment doesn't need to contain the change ID,
* but the change ID is implicitly known by where the comments are read from.
* </ul>
* <p>
* For all utility classes and middle layer functionality using Comment over
* PatchLineComment is preferred, as PatchLineComment will go away together with
* ReviewDb. This means Comment should be used everywhere and only for storing
* inline comment in ReviewDb a conversion to PatchLineComment is done.
* Converting Comments to PatchLineComments and vice verse is done by
* CommentsUtil#toPatchLineComments(Change.Id, PatchLineComment.Status, Iterable)
* and CommentsUtil#toComments(String, Iterable).
*/
public class Comment {
public static class Key {
public String uuid;
public String filename;
public int patchSetId;
public Key(Key k) {
this(k.uuid, k.filename, k.patchSetId);
}
public Key(String uuid, String filename, int patchSetId) {
this.uuid = uuid;
this.filename = filename;
this.patchSetId = patchSetId;
}
@Override
public String toString() {
return new StringBuilder()
.append("Comment.Key{")
.append("uuid=").append(uuid).append(',')
.append("filename=").append(filename).append(',')
.append("patchSetId=").append(patchSetId)
.append('}')
.toString();
}
@Override
public boolean equals(Object o) {
if (o instanceof Key) {
Key k = (Key) o;
return Objects.equals(uuid, k.uuid)
&& Objects.equals(filename, k.filename)
&& Objects.equals(patchSetId, k.patchSetId);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(uuid, filename, patchSetId);
}
}
public static class Identity {
int id;
public Identity(Account.Id id) {
this.id = id.get();
}
public Account.Id getId() {
return new Account.Id(id);
}
@Override
public boolean equals(Object o) {
if (o instanceof Identity) {
return Objects.equals(id, ((Identity) o).id);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(id);
}
@Override
public String toString() {
return new StringBuilder()
.append("Comment.Identity{")
.append("id=").append(id)
.append('}')
.toString();
}
}
public static class Range {
public int startLine;
public int startChar;
public int endLine;
public int endChar;
public Range(Range r) {
this(r.startLine, r.startChar, r.endLine, r.endChar);
}
public Range(com.google.gerrit.extensions.client.Comment.Range r) {
this(r.startLine, r.startCharacter, r.endLine, r.endCharacter);
}
public Range(int startLine, int startChar, int endLine, int endChar) {
this.startLine = startLine;
this.startChar = startChar;
this.endLine = endLine;
this.endChar = endChar;
}
@Override
public boolean equals(Object o) {
if (o instanceof Range) {
Range r = (Range) o;
return Objects.equals(startLine, r.startLine)
&& Objects.equals(startChar, r.startChar)
&& Objects.equals(endLine, r.endLine)
&& Objects.equals(endChar, r.endChar);
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(startLine, startChar, endLine, endChar);
}
@Override
public String toString() {
return new StringBuilder()
.append("Comment.Range{")
.append("startLine=").append(startLine).append(',')
.append("startChar=").append(startChar).append(',')
.append("endLine=").append(endLine).append(',')
.append("endChar=").append(endChar)
.append('}')
.toString();
}
}
public Key key;
public int lineNbr;
public Identity author;
public Timestamp writtenOn;
public short side;
public String message;
public String parentUuid;
public Range range;
public String tag;
public String revId;
public String serverId;
public Comment(Comment c) {
this(new Key(c.key), c.author.getId(), new Timestamp(c.writtenOn.getTime()),
c.side, c.message, c.serverId);
this.lineNbr = c.lineNbr;
this.range = c.range != null ? new Range(c.range) : null;
this.tag = c.tag;
this.revId = c.revId;
}
public Comment(Key key, Account.Id author, Timestamp writtenOn,
short side, String message, String serverId) {
this.key = key;
this.author = new Comment.Identity(author);
this.writtenOn = writtenOn;
this.side = side;
this.message = message;
this.serverId = serverId;
}
public void setLineNbrAndRange(Integer lineNbr,
com.google.gerrit.extensions.client.Comment.Range range) {
this.lineNbr = lineNbr != null
? lineNbr
: range != null
? range.endLine
: 0;
if (range != null) {
this.range = new Comment.Range(range);
}
}
public void setRange(CommentRange range) {
this.range = range != null ? range.asCommentRange() : null;
}
public void setRevId(RevId revId) {
this.revId = revId != null ? revId.get() : null;
}
@Override
public boolean equals(Object o) {
if (o instanceof Comment) {
return Objects.equals(key, ((Comment) o).key);
}
return false;
}
@Override
public int hashCode() {
return key.hashCode();
}
@Override
public String toString() {
return new StringBuilder()
.append("Comment{")
.append("key=").append(key).append(',')
.append("lineNbr=").append(lineNbr).append(',')
.append("author=").append(author.getId().get()).append(',')
.append("writtenOn=").append(writtenOn.toString()).append(',')
.append("side=").append(side).append(',')
.append("message=").append(Objects.toString(message, "")).append(',')
.append("parentUuid=")
.append(Objects.toString(parentUuid, "")).append(',')
.append("range=").append(Objects.toString(range, "")).append(',')
.append("revId=").append(revId != null ? revId : "")
.append("tag=").append(Objects.toString(tag, ""))
.append('}')
.toString();
}
}

View File

@ -72,6 +72,10 @@ public class CommentRange {
endCharacter = ec;
}
public Comment.Range asCommentRange() {
return new Comment.Range(startLine, startCharacter, endLine, endCharacter);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof CommentRange) {

View File

@ -21,11 +21,24 @@ import com.google.gwtorm.client.StringKey;
import java.sql.Timestamp;
import java.util.Objects;
/** A comment left by a user on a specific line of a {@link Patch}. */
/**
* A comment left by a user on a specific line of a {@link Patch}.
*
* This class represents an inline comment in ReviewDb. It should only be used
* for writing/reading inline comments to/from ReviewDb. For all other purposes
* inline comments should be represented by {@link Comment}.
*
* @see Comment
*/
public final class PatchLineComment {
public static class Key extends StringKey<Patch.Key> {
private static final long serialVersionUID = 1L;
public static Key from(Change.Id changeId, Comment.Key key) {
return new Key(new Patch.Key(new PatchSet.Id(changeId, key.patchSetId),
key.filename), key.uuid);
}
@Column(id = 1, name = Column.NONE)
protected Patch.Key patchKey;
@ -55,6 +68,12 @@ public final class PatchLineComment {
public void set(String newValue) {
uuid = newValue;
}
public Comment.Key asCommentKey() {
return new Comment.Key(get(),
getParentKey().getFileName(),
getParentKey().getParentKey().get());
}
}
public static final char STATUS_DRAFT = 'd';
@ -85,6 +104,28 @@ public final class PatchLineComment {
}
}
public static PatchLineComment from(Change.Id changeId,
PatchLineComment.Status status, Comment c) {
PatchLineComment.Key key = new PatchLineComment.Key(
new Patch.Key(new PatchSet.Id(changeId, c.key.patchSetId),
c.key.filename),
c.key.uuid);
PatchLineComment plc = new PatchLineComment(key, c.lineNbr,
c.author.getId(), c.parentUuid, c.writtenOn);
plc.setSide(c.side);
plc.setMessage(c.message);
if (c.range != null) {
Comment.Range r = c.range;
plc.setRange(
new CommentRange(r.startLine, r.startChar, r.endLine, r.endChar));
}
plc.setTag(c.tag);
plc.setRevId(new RevId(c.revId));
plc.setStatus(status);
return plc;
}
@Column(id = 1, name = Column.NONE)
protected Key key;
@ -260,6 +301,17 @@ public final class PatchLineComment {
return tag;
}
public Comment asComment(String serverId) {
Comment c = new Comment(key.asCommentKey(), author, writtenOn, side,
message, serverId);
c.setRevId(revId);
c.setRange(range);
c.lineNbr = lineNbr;
c.parentUuid = parentUuid;
c.tag = tag;
return c;
}
@Override
public boolean equals(Object o) {
if (o instanceof PatchLineComment) {

View File

@ -28,14 +28,15 @@ import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.config.AllUsersName;
import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.ChangeUpdate;
@ -63,25 +64,23 @@ import java.util.List;
import java.util.stream.StreamSupport;
/**
* Utility functions to manipulate PatchLineComments.
* Utility functions to manipulate Comments.
* <p>
* These methods either query for and update PatchLineComments in the NoteDb or
* These methods either query for and update Comments in the NoteDb or
* ReviewDb, depending on the state of the NotesMigration.
*/
@Singleton
public class PatchLineCommentsUtil {
public static final Ordering<PatchLineComment> PLC_ORDER =
new Ordering<PatchLineComment>() {
public class CommentsUtil {
public static final Ordering<Comment> COMMENT_ORDER =
new Ordering<Comment>() {
@Override
public int compare(PatchLineComment c1, PatchLineComment c2) {
String filename1 = c1.getKey().getParentKey().get();
String filename2 = c2.getKey().getParentKey().get();
public int compare(Comment c1, Comment c2) {
return ComparisonChain.start()
.compare(filename1, filename2)
.compare(getCommentPsId(c1).get(), getCommentPsId(c2).get())
.compare(c1.getSide(), c2.getSide())
.compare(c1.getLine(), c2.getLine())
.compare(c1.getWrittenOn(), c2.getWrittenOn())
.compare(c1.key.filename, c2.key.filename)
.compare(c1.key.patchSetId, c2.key.patchSetId)
.compare(c1.side, c2.side)
.compare(c1.lineNbr, c2.lineNbr)
.compare(c1.writtenOn, c2.writtenOn)
.result();
}
};
@ -104,8 +103,9 @@ public class PatchLineCommentsUtil {
}
};
public static PatchSet.Id getCommentPsId(PatchLineComment plc) {
return plc.getKey().getParentKey().getParentKey();
public static PatchSet.Id getCommentPsId(Change.Id changeId,
Comment comment) {
return new PatchSet.Id(changeId, comment.key.patchSetId);
}
private static final Ordering<Comparable<?>> NULLS_FIRST =
@ -114,55 +114,61 @@ public class PatchLineCommentsUtil {
private final GitRepositoryManager repoManager;
private final AllUsersName allUsers;
private final NotesMigration migration;
private final String serverId;
@Inject
PatchLineCommentsUtil(GitRepositoryManager repoManager,
CommentsUtil(GitRepositoryManager repoManager,
AllUsersName allUsers,
NotesMigration migration) {
NotesMigration migration,
@GerritServerId String serverId) {
this.repoManager = repoManager;
this.allUsers = allUsers;
this.migration = migration;
this.serverId = serverId;
}
public Optional<PatchLineComment> get(ReviewDb db, ChangeNotes notes,
PatchLineComment.Key key) throws OrmException {
public Optional<Comment> get(ReviewDb db, ChangeNotes notes,
Comment.Key key) throws OrmException {
if (!migration.readChanges()) {
return Optional.fromNullable(db.patchComments().get(key));
PatchLineComment plc = db.patchComments()
.get(PatchLineComment.Key.from(notes.getChangeId(), key));
Comment c = plc != null ? plc.asComment(serverId) : null;
return Optional.fromNullable(c);
}
for (PatchLineComment c : publishedByChange(db, notes)) {
if (key.equals(c.getKey())) {
for (Comment c : publishedByChange(db, notes)) {
if (key.equals(c.key)) {
return Optional.of(c);
}
}
for (PatchLineComment c : draftByChange(db, notes)) {
if (key.equals(c.getKey())) {
for (Comment c : draftByChange(db, notes)) {
if (key.equals(c.key)) {
return Optional.of(c);
}
}
return Optional.absent();
}
public List<PatchLineComment> publishedByChange(ReviewDb db,
ChangeNotes notes) throws OrmException {
public List<Comment> publishedByChange(ReviewDb db, ChangeNotes notes)
throws OrmException {
if (!migration.readChanges()) {
return sort(byCommentStatus(
db.patchComments().byChange(notes.getChangeId()), Status.PUBLISHED));
}
notes.load();
List<PatchLineComment> comments = new ArrayList<>();
List<Comment> comments = new ArrayList<>();
comments.addAll(notes.getComments().values());
return sort(comments);
}
public List<PatchLineComment> draftByChange(ReviewDb db,
ChangeNotes notes) throws OrmException {
public List<Comment> draftByChange(ReviewDb db, ChangeNotes notes)
throws OrmException {
if (!migration.readChanges()) {
return sort(byCommentStatus(
db.patchComments().byChange(notes.getChangeId()), Status.DRAFT));
}
List<PatchLineComment> comments = new ArrayList<>();
List<Comment> comments = new ArrayList<>();
for (Ref ref : getDraftRefs(notes.getChangeId())) {
Account.Id account = Account.Id.fromRefSuffix(ref.getName());
if (account != null) {
@ -172,19 +178,19 @@ public class PatchLineCommentsUtil {
return sort(comments);
}
private static List<PatchLineComment> byCommentStatus(
ResultSet<PatchLineComment> comments,
private List<Comment> byCommentStatus(ResultSet<PatchLineComment> comments,
final PatchLineComment.Status status) {
return Lists.newArrayList(
Iterables.filter(comments, c -> c.getStatus() == status));
return toComments(serverId, Lists.newArrayList(
Iterables.filter(comments, c -> c.getStatus() == status)));
}
public List<PatchLineComment> byPatchSet(ReviewDb db,
public List<Comment> byPatchSet(ReviewDb db,
ChangeNotes notes, PatchSet.Id psId) throws OrmException {
if (!migration.readChanges()) {
return sort(db.patchComments().byPatchSet(psId).toList());
return sort(toComments(serverId,
db.patchComments().byPatchSet(psId).toList()));
}
List<PatchLineComment> comments = new ArrayList<>();
List<Comment> comments = new ArrayList<>();
comments.addAll(publishedByPatchSet(db, notes, psId));
for (Ref ref : getDraftRefs(notes.getChangeId())) {
@ -196,20 +202,20 @@ public class PatchLineCommentsUtil {
return sort(comments);
}
public List<PatchLineComment> publishedByChangeFile(ReviewDb db,
ChangeNotes notes, Change.Id changeId, String file) throws OrmException {
public List<Comment> publishedByChangeFile(ReviewDb db, ChangeNotes notes,
Change.Id changeId, String file) throws OrmException {
if (!migration.readChanges()) {
return sort(
db.patchComments().publishedByChangeFile(changeId, file).toList());
return sort(toComments(serverId,
db.patchComments().publishedByChangeFile(changeId, file).toList()));
}
return commentsOnFile(notes.load().getComments().values(), file);
}
public List<PatchLineComment> publishedByPatchSet(ReviewDb db,
public List<Comment> publishedByPatchSet(ReviewDb db,
ChangeNotes notes, PatchSet.Id psId) throws OrmException {
if (!migration.readChanges()) {
return removeCommentsOnAncestorOfCommitMessage(sort(
db.patchComments().publishedByPatchSet(psId).toList()));
return removeCommentsOnAncestorOfCommitMessage(sort(toComments(serverId,
db.patchComments().publishedByPatchSet(psId).toList())));
}
return removeCommentsOnAncestorOfCommitMessage(
commentsOnPatchSet(notes.load().getComments().values(), psId));
@ -223,50 +229,47 @@ public class PatchLineCommentsUtil {
* done. From that time there may still be comments on the auto-merge commit
* message and those we want to filter out.
*/
private List<PatchLineComment> removeCommentsOnAncestorOfCommitMessage(
List<PatchLineComment> list) {
private List<Comment> removeCommentsOnAncestorOfCommitMessage(
List<Comment> list) {
return list.stream()
.filter(c -> c.getSide() != 0
|| !Patch.COMMIT_MSG.equals(c.getKey().getParentKey().get()))
.filter(c -> c.side != 0 || !Patch.COMMIT_MSG.equals(c.key.filename))
.collect(toList());
}
public List<PatchLineComment> draftByPatchSetAuthor(ReviewDb db,
PatchSet.Id psId, Account.Id author, ChangeNotes notes)
throws OrmException {
public List<Comment> draftByPatchSetAuthor(ReviewDb db, PatchSet.Id psId,
Account.Id author, ChangeNotes notes) throws OrmException {
if (!migration.readChanges()) {
return sort(
db.patchComments().draftByPatchSetAuthor(psId, author).toList());
return sort(toComments(serverId,
db.patchComments().draftByPatchSetAuthor(psId, author).toList()));
}
return commentsOnPatchSet(
notes.load().getDraftComments(author).values(), psId);
return commentsOnPatchSet(notes.load().getDraftComments(author).values(), psId);
}
public List<PatchLineComment> draftByChangeFileAuthor(ReviewDb db,
public List<Comment> draftByChangeFileAuthor(ReviewDb db,
ChangeNotes notes, String file, Account.Id author)
throws OrmException {
if (!migration.readChanges()) {
return sort(
return sort(toComments(serverId,
db.patchComments()
.draftByChangeFileAuthor(notes.getChangeId(), file, author)
.toList());
.toList()));
}
return commentsOnFile(
notes.load().getDraftComments(author).values(), file);
return commentsOnFile(notes.load().getDraftComments(author).values(), file);
}
public List<PatchLineComment> draftByChangeAuthor(ReviewDb db,
public List<Comment> draftByChangeAuthor(ReviewDb db,
ChangeNotes notes, Account.Id author)
throws OrmException {
if (!migration.readChanges()) {
final Change.Id matchId = notes.getChangeId();
return StreamSupport.stream(
db.patchComments().draftByAuthor(author).spliterator(), false)
.filter(c -> c.getPatchSetId().getParentKey().equals(matchId))
.sorted(PLC_ORDER)
return StreamSupport
.stream(db.patchComments().draftByAuthor(author).spliterator(), false)
.filter(c -> c.getPatchSetId().getParentKey()
.equals(notes.getChangeId()))
.map(plc -> plc.asComment(serverId))
.sorted(COMMENT_ORDER)
.collect(toList());
}
List<PatchLineComment> comments = new ArrayList<>();
List<Comment> comments = new ArrayList<>();
comments.addAll(notes.getDraftComments(author).values());
return sort(comments);
}
@ -297,19 +300,22 @@ public class PatchLineCommentsUtil {
}
public void putComments(ReviewDb db, ChangeUpdate update,
Iterable<PatchLineComment> comments) throws OrmException {
for (PatchLineComment c : comments) {
update.putComment(c);
PatchLineComment.Status status, Iterable<Comment> comments)
throws OrmException {
for (Comment c : comments) {
update.putComment(status, c);
}
db.patchComments().upsert(comments);
db.patchComments()
.upsert(toPatchLineComments(update.getId(), status, comments));
}
public void deleteComments(ReviewDb db, ChangeUpdate update,
Iterable<PatchLineComment> comments) throws OrmException {
for (PatchLineComment c : comments) {
Iterable<Comment> comments) throws OrmException {
for (Comment c : comments) {
update.deleteComment(c);
}
db.patchComments().delete(comments);
db.patchComments().delete(toPatchLineComments(update.getId(),
PatchLineComment.Status.DRAFT, comments));
}
public void deleteAllDraftsFromAllUsers(Change.Id changeId)
@ -334,12 +340,11 @@ public class PatchLineCommentsUtil {
}
}
private static List<PatchLineComment> commentsOnFile(
Collection<PatchLineComment> allComments,
private static List<Comment> commentsOnFile(Collection<Comment> allComments,
String file) {
List<PatchLineComment> result = new ArrayList<>(allComments.size());
for (PatchLineComment c : allComments) {
String currentFilename = c.getKey().getParentKey().getFileName();
List<Comment> result = new ArrayList<>(allComments.size());
for (Comment c : allComments) {
String currentFilename = c.key.filename;
if (currentFilename.equals(file)) {
result.add(c);
}
@ -347,34 +352,32 @@ public class PatchLineCommentsUtil {
return sort(result);
}
private static List<PatchLineComment> commentsOnPatchSet(
Collection<PatchLineComment> allComments,
private static List<Comment> commentsOnPatchSet(
Collection<Comment> allComments,
PatchSet.Id psId) {
List<PatchLineComment> result = new ArrayList<>(allComments.size());
for (PatchLineComment c : allComments) {
if (getCommentPsId(c).equals(psId)) {
List<Comment> result = new ArrayList<>(allComments.size());
for (Comment c : allComments) {
if (c.key.patchSetId == psId.get()) {
result.add(c);
}
}
return sort(result);
}
public static void setCommentRevId(PatchLineComment c,
public static void setCommentRevId(Comment c,
PatchListCache cache, Change change, PatchSet ps) throws OrmException {
checkArgument(c.getPatchSetId().equals(ps.getId()),
checkArgument(c.key.patchSetId == ps.getId().get(),
"cannot set RevId for patch set %s on comment %s", ps.getId(), c);
if (c.getRevId() == null) {
if (c.revId == null) {
try {
if (Side.fromShort(c.getSide()) == Side.PARENT) {
if (c.getSide() < 0) {
c.setRevId(new RevId(ObjectId.toString(
cache.getOldId(change, ps, -c.getSide()))));
if (Side.fromShort(c.side) == Side.PARENT) {
if (c.side < 0) {
c.revId = ObjectId.toString(cache.getOldId(change, ps, -c.side));
} else {
c.setRevId(new RevId(ObjectId.toString(
cache.getOldId(change, ps, null))));
c.revId = ObjectId.toString(cache.getOldId(change, ps, null));
}
} else {
c.setRevId(ps.getRevision());
c.revId = ps.getRevision().get();
}
} catch (PatchListNotAvailableException e) {
throw new OrmException(e);
@ -397,8 +400,21 @@ public class PatchLineCommentsUtil {
RefNames.refsDraftCommentsPrefix(changeId)).values();
}
private static List<PatchLineComment> sort(List<PatchLineComment> comments) {
Collections.sort(comments, PLC_ORDER);
private static List<Comment> sort(List<Comment> comments) {
Collections.sort(comments, COMMENT_ORDER);
return comments;
}
public static Iterable<PatchLineComment> toPatchLineComments(
Change.Id changeId, PatchLineComment.Status status,
Iterable<Comment> comments) {
return FluentIterable.from(comments)
.transform(c -> PatchLineComment.from(changeId, status, c));
}
public static List<Comment> toComments(final String serverId,
Iterable<PatchLineComment> comments) {
return COMMENT_ORDER.sortedCopy(FluentIterable.from(comments)
.transform(plc -> plc.asComment(serverId)));
}
}

View File

@ -14,7 +14,7 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.COMMENT_INFO_ORDER;
import static com.google.gerrit.server.CommentsUtil.COMMENT_INFO_ORDER;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
@ -22,8 +22,7 @@ import com.google.gerrit.extensions.client.Comment.Range;
import com.google.gerrit.extensions.client.Side;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.server.account.AccountLoader;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@ -56,7 +55,7 @@ class CommentJson {
return this;
}
CommentInfo format(PatchLineComment c) throws OrmException {
CommentInfo format(Comment c) throws OrmException {
AccountLoader loader = null;
if (fillAccounts) {
loader = accountLoaderFactory.create(true);
@ -68,14 +67,14 @@ class CommentJson {
return commentInfo;
}
Map<String, List<CommentInfo>> format(Iterable<PatchLineComment> l)
Map<String, List<CommentInfo>> format(Iterable<Comment> l)
throws OrmException {
Map<String, List<CommentInfo>> out = new TreeMap<>();
AccountLoader accountLoader = fillAccounts
? accountLoaderFactory.create(true)
: null;
for (PatchLineComment c : l) {
for (Comment c : l) {
CommentInfo o = toCommentInfo(c, accountLoader);
List<CommentInfo> list = out.get(o.path);
if (list == null) {
@ -97,7 +96,7 @@ class CommentJson {
return out;
}
List<CommentInfo> formatAsList(Iterable<PatchLineComment> l)
List<CommentInfo> formatAsList(Iterable<Comment> l)
throws OrmException {
AccountLoader accountLoader = fillAccounts
? accountLoaderFactory.create(true)
@ -114,41 +113,41 @@ class CommentJson {
return out;
}
private CommentInfo toCommentInfo(PatchLineComment c, AccountLoader loader) {
private CommentInfo toCommentInfo(Comment c, AccountLoader loader) {
CommentInfo r = new CommentInfo();
if (fillPatchSet) {
r.patchSet = c.getKey().getParentKey().getParentKey().get();
r.patchSet = c.key.patchSetId;
}
r.id = Url.encode(c.getKey().get());
r.path = c.getKey().getParentKey().getFileName();
if (c.getSide() <= 0) {
r.id = Url.encode(c.key.uuid);
r.path = c.key.filename;
if (c.side <= 0) {
r.side = Side.PARENT;
if (c.getSide() < 0) {
r.parent = -c.getSide();
if (c.side < 0) {
r.parent = -c.side;
}
}
if (c.getLine() > 0) {
r.line = c.getLine();
if (c.lineNbr > 0) {
r.line = c.lineNbr;
}
r.inReplyTo = Url.encode(c.getParentUuid());
r.message = Strings.emptyToNull(c.getMessage());
r.updated = c.getWrittenOn();
r.range = toRange(c.getRange());
r.tag = c.getTag();
r.inReplyTo = Url.encode(c.parentUuid);
r.message = Strings.emptyToNull(c.message);
r.updated = c.writtenOn;
r.range = toRange(c.range);
r.tag = c.tag;
if (loader != null) {
r.author = loader.get(c.getAuthor());
r.author = loader.get(c.author.getId());
}
return r;
}
private Range toRange(CommentRange commentRange) {
private Range toRange(Comment.Range commentRange) {
Range range = null;
if (commentRange != null) {
range = new Range();
range.startLine = commentRange.getStartLine();
range.startCharacter = commentRange.getStartCharacter();
range.endLine = commentRange.getEndLine();
range.endCharacter = commentRange.getEndCharacter();
range.startLine = commentRange.startLine;
range.startCharacter = commentRange.startChar;
range.endLine = commentRange.endLine;
range.endCharacter = commentRange.endChar;
}
return range;
}

View File

@ -17,7 +17,7 @@ package com.google.gerrit.server.change;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.inject.TypeLiteral;
@ -26,9 +26,9 @@ public class CommentResource implements RestResource {
new TypeLiteral<RestView<CommentResource>>() {};
private final RevisionResource rev;
private final PatchLineComment comment;
private final Comment comment;
public CommentResource(RevisionResource rev, PatchLineComment c) {
public CommentResource(RevisionResource rev, Comment c) {
this.rev = rev;
this.comment = c;
}
@ -37,15 +37,15 @@ public class CommentResource implements RestResource {
return rev.getPatchSet();
}
PatchLineComment getComment() {
Comment getComment() {
return comment;
}
String getId() {
return comment.getKey().get();
return comment.key.uuid;
}
Account.Id getAuthorId() {
return comment.getAuthor();
return comment.author.getId();
}
}

View File

@ -19,9 +19,9 @@ import com.google.gerrit.extensions.restapi.ChildCollection;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@ -33,16 +33,16 @@ public class Comments implements ChildCollection<RevisionResource, CommentResour
private final DynamicMap<RestView<CommentResource>> views;
private final ListRevisionComments list;
private final Provider<ReviewDb> dbProvider;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
@Inject
Comments(DynamicMap<RestView<CommentResource>> views,
ListRevisionComments list, Provider<ReviewDb> dbProvider,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.views = views;
this.list = list;
this.dbProvider = dbProvider;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
@Override
@ -61,9 +61,9 @@ public class Comments implements ChildCollection<RevisionResource, CommentResour
String uuid = id.get();
ChangeNotes notes = rev.getNotes();
for (PatchLineComment c : plcUtil.publishedByPatchSet(dbProvider.get(),
for (Comment c : commentsUtil.publishedByPatchSet(dbProvider.get(),
notes, rev.getPatchSet().getId())) {
if (uuid.equals(c.getKey().get())) {
if (uuid.equals(c.key.uuid)) {
return new CommentResource(rev, c);
}
}

View File

@ -14,7 +14,7 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import com.google.common.base.Strings;
import com.google.gerrit.common.TimeUtil;
@ -26,13 +26,14 @@ import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.BatchUpdate.ChangeContext;
import com.google.gerrit.server.git.UpdateException;
@ -49,23 +50,26 @@ public class CreateDraftComment implements RestModifyView<RevisionResource, Draf
private final Provider<ReviewDb> db;
private final BatchUpdate.Factory updateFactory;
private final Provider<CommentJson> commentJson;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
private final PatchListCache patchListCache;
private final String serverId;
@Inject
CreateDraftComment(Provider<ReviewDb> db,
BatchUpdate.Factory updateFactory,
Provider<CommentJson> commentJson,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache) {
PatchListCache patchListCache,
@GerritServerId String serverId) {
this.db = db;
this.updateFactory = updateFactory;
this.commentJson = commentJson;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.serverId = serverId;
}
@Override
@ -95,7 +99,7 @@ public class CreateDraftComment implements RestModifyView<RevisionResource, Draf
private final PatchSet.Id psId;
private final DraftInput in;
private PatchLineComment comment;
private Comment comment;
private Op(PatchSet.Id psId, DraftInput in) {
this.psId = psId;
@ -109,23 +113,22 @@ public class CreateDraftComment implements RestModifyView<RevisionResource, Draf
if (ps == null) {
throw new ResourceNotFoundException("patch set not found: " + psId);
}
int line = in.line != null
? in.line
: in.range != null ? in.range.endLine : 0;
comment = new PatchLineComment(
new PatchLineComment.Key(
new Patch.Key(ps.getId(), in.path),
ChangeUtil.messageUUID(ctx.getDb())),
line, ctx.getAccountId(), Url.decode(in.inReplyTo),
ctx.getWhen());
comment.setSide(in.side());
comment.setMessage(in.message.trim());
comment.setRange(in.range);
comment.setTag(in.tag);
comment = new Comment(
new Comment.Key(ChangeUtil.messageUUID(ctx.getDb()), in.path,
ps.getPatchSetId()),
ctx.getAccountId(),
ctx.getWhen(),
in.side(),
in.message.trim(),
serverId);
comment.parentUuid = Url.decode(in.inReplyTo);
comment.setLineNbrAndRange(in.line, in.range);
comment.tag = in.tag;
setCommentRevId(
comment, patchListCache, ctx.getChange(), ps);
plcUtil.putComments(
ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(comment));
commentsUtil.putComments(ctx.getDb(), ctx.getUpdate(psId), Status.DRAFT,
Collections.singleton(comment));
ctx.bumpLastUpdatedOn(false);
return true;
}

View File

@ -14,7 +14,7 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import com.google.common.base.Optional;
import com.google.gerrit.common.TimeUtil;
@ -23,10 +23,10 @@ import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.change.DeleteDraftComment.Input;
import com.google.gerrit.server.git.BatchUpdate;
@ -47,19 +47,19 @@ public class DeleteDraftComment
}
private final Provider<ReviewDb> db;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
private final BatchUpdate.Factory updateFactory;
private final PatchListCache patchListCache;
@Inject
DeleteDraftComment(Provider<ReviewDb> db,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
BatchUpdate.Factory updateFactory,
PatchListCache patchListCache) {
this.db = db;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.updateFactory = updateFactory;
this.patchListCache = patchListCache;
@ -71,7 +71,7 @@ public class DeleteDraftComment
try (BatchUpdate bu = updateFactory.create(
db.get(), rsrc.getChange().getProject(), rsrc.getControl().getUser(),
TimeUtil.nowTs())) {
Op op = new Op(rsrc.getComment().getKey());
Op op = new Op(rsrc.getComment().key);
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
}
@ -79,28 +79,29 @@ public class DeleteDraftComment
}
private class Op extends BatchUpdate.Op {
private final PatchLineComment.Key key;
private final Comment.Key key;
private Op(PatchLineComment.Key key) {
private Op(Comment.Key key) {
this.key = key;
}
@Override
public boolean updateChange(ChangeContext ctx)
throws ResourceNotFoundException, OrmException {
Optional<PatchLineComment> maybeComment =
plcUtil.get(ctx.getDb(), ctx.getNotes(), key);
Optional<Comment> maybeComment =
commentsUtil.get(ctx.getDb(), ctx.getNotes(), key);
if (!maybeComment.isPresent()) {
return false; // Nothing to do.
}
PatchSet.Id psId = key.getParentKey().getParentKey();
PatchSet.Id psId =
new PatchSet.Id(ctx.getChange().getId(), key.patchSetId);
PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
if (ps == null) {
throw new ResourceNotFoundException("patch set not found: " + psId);
}
PatchLineComment c = maybeComment.get();
Comment c = maybeComment.get();
setCommentRevId(c, patchListCache, ctx.getChange(), ps);
plcUtil.deleteComments(
commentsUtil.deleteComments(
ctx.getDb(), ctx.getUpdate(psId), Collections.singleton(c));
ctx.bumpLastUpdatedOn(false);
return true;

View File

@ -18,7 +18,7 @@ import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.project.ChangeControl;
import com.google.inject.TypeLiteral;
@ -28,9 +28,9 @@ public class DraftCommentResource implements RestResource {
new TypeLiteral<RestView<DraftCommentResource>>() {};
private final RevisionResource rev;
private final PatchLineComment comment;
private final Comment comment;
public DraftCommentResource(RevisionResource rev, PatchLineComment c) {
public DraftCommentResource(RevisionResource rev, Comment c) {
this.rev = rev;
this.comment = c;
}
@ -47,12 +47,12 @@ public class DraftCommentResource implements RestResource {
return rev.getPatchSet();
}
PatchLineComment getComment() {
Comment getComment() {
return comment;
}
String getId() {
return comment.getKey().get();
return comment.key.uuid;
}
Account.Id getAuthorId() {

View File

@ -20,10 +20,10 @@ import com.google.gerrit.extensions.restapi.ChildCollection;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestView;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@ -35,19 +35,19 @@ public class DraftComments implements ChildCollection<RevisionResource, DraftCom
private final Provider<CurrentUser> user;
private final ListRevisionDrafts list;
private final Provider<ReviewDb> dbProvider;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
@Inject
DraftComments(DynamicMap<RestView<DraftCommentResource>> views,
Provider<CurrentUser> user,
ListRevisionDrafts list,
Provider<ReviewDb> dbProvider,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.views = views;
this.user = user;
this.list = list;
this.dbProvider = dbProvider;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
@Override
@ -66,9 +66,9 @@ public class DraftComments implements ChildCollection<RevisionResource, DraftCom
throws ResourceNotFoundException, OrmException, AuthException {
checkIdentifiedUser();
String uuid = id.get();
for (PatchLineComment c : plcUtil.draftByPatchSetAuthor(dbProvider.get(),
for (Comment c : commentsUtil.draftByPatchSetAuthor(dbProvider.get(),
rev.getPatchSet().getId(), rev.getAccountId(), rev.getNotes())) {
if (uuid.equals(c.getKey().get())) {
if (uuid.equals(c.key.uuid)) {
return new DraftCommentResource(rev, c);
}
}

View File

@ -14,11 +14,11 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.PLC_ORDER;
import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
@ -52,7 +52,7 @@ public class EmailReviewComments implements Runnable, RequestContext {
PatchSet patchSet,
IdentifiedUser user,
ChangeMessage message,
List<PatchLineComment> comments);
List<Comment> comments);
}
private final ExecutorService sendEmailsExecutor;
@ -66,7 +66,7 @@ public class EmailReviewComments implements Runnable, RequestContext {
private final PatchSet patchSet;
private final IdentifiedUser user;
private final ChangeMessage message;
private List<PatchLineComment> comments;
private final List<Comment> comments;
private ReviewDb db;
@Inject
@ -81,7 +81,7 @@ public class EmailReviewComments implements Runnable, RequestContext {
@Assisted PatchSet patchSet,
@Assisted IdentifiedUser user,
@Assisted ChangeMessage message,
@Assisted List<PatchLineComment> comments) {
@Assisted List<Comment> comments) {
this.sendEmailsExecutor = executor;
this.patchSetInfoFactory = patchSetInfoFactory;
this.commentSenderFactory = commentSenderFactory;
@ -92,7 +92,7 @@ public class EmailReviewComments implements Runnable, RequestContext {
this.patchSet = patchSet;
this.user = user;
this.message = message;
this.comments = PLC_ORDER.sortedCopy(comments);
this.comments = COMMENT_ORDER.sortedCopy(comments);
}
void sendAsync() {

View File

@ -18,7 +18,7 @@ import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@ -33,17 +33,17 @@ public class ListChangeComments implements RestReadView<ChangeResource> {
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final Provider<CommentJson> commentJson;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
@Inject
ListChangeComments(Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
Provider<CommentJson> commentJson,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.commentJson = commentJson;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
@Override
@ -53,6 +53,6 @@ public class ListChangeComments implements RestReadView<ChangeResource> {
return commentJson.get()
.setFillAccounts(true)
.setFillPatchSet(true)
.format(plcUtil.publishedByChange(db.get(), cd.notes()));
.format(commentsUtil.publishedByChange(db.get(), cd.notes()));
}
}

View File

@ -17,9 +17,9 @@ package com.google.gerrit.server.change;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.query.change.ChangeData;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@ -34,17 +34,17 @@ public class ListChangeDrafts implements RestReadView<ChangeResource> {
private final Provider<ReviewDb> db;
private final ChangeData.Factory changeDataFactory;
private final Provider<CommentJson> commentJson;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
@Inject
ListChangeDrafts(Provider<ReviewDb> db,
ChangeData.Factory changeDataFactory,
Provider<CommentJson> commentJson,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.db = db;
this.changeDataFactory = changeDataFactory;
this.commentJson = commentJson;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
@Override
@ -54,7 +54,7 @@ public class ListChangeDrafts implements RestReadView<ChangeResource> {
throw new AuthException("Authentication required");
}
ChangeData cd = changeDataFactory.create(db.get(), rsrc.getControl());
List<PatchLineComment> drafts = plcUtil.draftByChangeAuthor(
List<Comment> drafts = commentsUtil.draftByChangeAuthor(
db.get(), cd.notes(), rsrc.getControl().getUser().getAccountId());
return commentJson.get()
.setFillAccounts(false)

View File

@ -14,9 +14,9 @@
package com.google.gerrit.server.change;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
@ -28,8 +28,8 @@ public class ListRevisionComments extends ListRevisionDrafts {
@Inject
ListRevisionComments(Provider<ReviewDb> db,
Provider<CommentJson> commentJson,
PatchLineCommentsUtil plcUtil) {
super(db, commentJson, plcUtil);
CommentsUtil commentsUtil) {
super(db, commentJson, commentsUtil);
}
@Override
@ -38,9 +38,10 @@ public class ListRevisionComments extends ListRevisionDrafts {
}
@Override
protected Iterable<PatchLineComment> listComments(RevisionResource rsrc)
protected Iterable<Comment> listComments(RevisionResource rsrc)
throws OrmException {
ChangeNotes notes = rsrc.getNotes();
return plcUtil.publishedByPatchSet(db.get(), notes, rsrc.getPatchSet().getId());
return commentsUtil.publishedByPatchSet(db.get(), notes,
rsrc.getPatchSet().getId());
}
}

View File

@ -16,9 +16,9 @@ package com.google.gerrit.server.change;
import com.google.gerrit.extensions.common.CommentInfo;
import com.google.gerrit.extensions.restapi.RestReadView;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
@ -31,20 +31,20 @@ import java.util.Map;
public class ListRevisionDrafts implements RestReadView<RevisionResource> {
protected final Provider<ReviewDb> db;
protected final Provider<CommentJson> commentJson;
protected final PatchLineCommentsUtil plcUtil;
protected final CommentsUtil commentsUtil;
@Inject
ListRevisionDrafts(Provider<ReviewDb> db,
Provider<CommentJson> commentJson,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.db = db;
this.commentJson = commentJson;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
protected Iterable<PatchLineComment> listComments(RevisionResource rsrc)
protected Iterable<Comment> listComments(RevisionResource rsrc)
throws OrmException {
return plcUtil.draftByPatchSetAuthor(db.get(), rsrc.getPatchSet().getId(),
return commentsUtil.draftByPatchSetAuthor(db.get(), rsrc.getPatchSet().getId(),
rsrc.getAccountId(), rsrc.getNotes());
}

View File

@ -16,7 +16,7 @@ package com.google.gerrit.server.change;
import static com.google.common.base.MoreObjects.firstNonNull;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import static com.google.gerrit.server.notedb.ReviewerStateInternal.REVIEWER;
import static java.nio.charset.StandardCharsets.UTF_8;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
@ -54,20 +54,21 @@ import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.ChangeUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.account.AccountsCollection;
import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.extensions.events.CommentAdded;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.BatchUpdate.ChangeContext;
@ -109,13 +110,14 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
private final ChangeData.Factory changeDataFactory;
private final ApprovalsUtil approvalsUtil;
private final ChangeMessagesUtil cmUtil;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
private final PatchListCache patchListCache;
private final AccountsCollection accounts;
private final EmailReviewComments.Factory email;
private final CommentAdded commentAdded;
private final PostReviewers postReviewers;
private final String serverId;
@Inject
PostReview(Provider<ReviewDb> db,
@ -124,18 +126,19 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
ChangeData.Factory changeDataFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
AccountsCollection accounts,
EmailReviewComments.Factory email,
CommentAdded commentAdded,
PostReviewers postReviewers) {
PostReviewers postReviewers,
@GerritServerId String serverId) {
this.db = db;
this.batchUpdateFactory = batchUpdateFactory;
this.changes = changes;
this.changeDataFactory = changeDataFactory;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.approvalsUtil = approvalsUtil;
@ -144,6 +147,7 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
this.email = email;
this.commentAdded = commentAdded;
this.postReviewers = postReviewers;
this.serverId = serverId;
}
@Override
@ -371,25 +375,27 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
*/
@AutoValue
abstract static class CommentSetEntry {
private static CommentSetEntry create(Patch.Key key,
Integer line, Side side, HashCode message, CommentRange range) {
return new AutoValue_PostReview_CommentSetEntry(key, line, side, message,
range);
private static CommentSetEntry create(String filename, int patchSetId,
Integer line, Side side, HashCode message, Comment.Range range) {
return new AutoValue_PostReview_CommentSetEntry(filename, patchSetId,
line, side, message, range);
}
public static CommentSetEntry create(PatchLineComment comment) {
return create(comment.getKey().getParentKey(),
comment.getLine(),
Side.fromShort(comment.getSide()),
Hashing.sha1().hashString(comment.getMessage(), UTF_8),
comment.getRange());
public static CommentSetEntry create(Comment comment) {
return create(comment.key.filename,
comment.key.patchSetId,
comment.lineNbr,
Side.fromShort(comment.side),
Hashing.sha1().hashString(comment.message, UTF_8),
comment.range);
}
abstract Patch.Key key();
abstract String filename();
abstract int patchSetId();
@Nullable abstract Integer line();
abstract Side side();
abstract HashCode message();
@Nullable abstract CommentRange range();
@Nullable abstract Comment.Range range();
}
private class Op extends BatchUpdate.Op {
@ -401,7 +407,7 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
private ChangeNotes notes;
private PatchSet ps;
private ChangeMessage message;
private List<PatchLineComment> comments = new ArrayList<>();
private List<Comment> comments = new ArrayList<>();
private List<String> labelDelta = new ArrayList<>();
private Map<String, Short> approvals = new HashMap<>();
private Map<String, Short> oldApprovals = new HashMap<>();
@ -451,7 +457,7 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
map = Collections.emptyMap();
}
Map<String, PatchLineComment> drafts = Collections.emptyMap();
Map<String, Comment> drafts = Collections.emptyMap();
if (!map.isEmpty() || in.drafts != DraftHandling.KEEP) {
if (in.drafts == DraftHandling.PUBLISH_ALL_REVISIONS) {
drafts = changeDrafts(ctx);
@ -460,8 +466,8 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
}
}
List<PatchLineComment> del = new ArrayList<>();
List<PatchLineComment> ups = new ArrayList<>();
List<Comment> toDel = new ArrayList<>();
List<Comment> toPublish = new ArrayList<>();
Set<CommentSetEntry> existingIds = in.omitDuplicateComments
? readExistingComments(ctx)
@ -471,37 +477,33 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
String path = ent.getKey();
for (CommentInput c : ent.getValue()) {
String parent = Url.decode(c.inReplyTo);
PatchLineComment e = drafts.remove(Url.decode(c.id));
Comment e = drafts.remove(Url.decode(c.id));
if (e == null) {
e = new PatchLineComment(
new PatchLineComment.Key(new Patch.Key(psId, path), null),
c.line != null ? c.line : 0,
e = new Comment(
new Comment.Key(ChangeUtil.messageUUID(ctx.getDb()), path,
psId.get()),
user.getAccountId(),
parent, ctx.getWhen());
} else if (parent != null) {
e.setParentUuid(parent);
ctx.getWhen(),
c.side(),
c.message,
serverId);
} else {
e.writtenOn = ctx.getWhen();
e.side = c.side();
e.message = c.message;
}
if (parent != null) {
e.parentUuid = parent;
}
e.setStatus(PatchLineComment.Status.PUBLISHED);
e.setWrittenOn(ctx.getWhen());
e.setSide(c.side());
setCommentRevId(e, patchListCache, ctx.getChange(), ps);
e.setMessage(c.message);
e.setTag(in.tag);
if (c.range != null) {
e.setRange(new CommentRange(
c.range.startLine,
c.range.startCharacter,
c.range.endLine,
c.range.endCharacter));
e.setLine(c.range.endLine);
}
e.setLineNbrAndRange(c.line, c.range);
e.tag = in.tag;
if (existingIds.contains(CommentSetEntry.create(e))) {
continue;
}
if (e.getKey().get() == null) {
e.getKey().set(ChangeUtil.messageUUID(ctx.getDb()));
}
ups.add(e);
toPublish.add(e);
}
}
@ -510,51 +512,51 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
default:
break;
case DELETE:
del.addAll(drafts.values());
toDel.addAll(drafts.values());
break;
case PUBLISH:
for (PatchLineComment e : drafts.values()) {
ups.add(publishComment(ctx, e, ps));
for (Comment e : drafts.values()) {
toPublish.add(publishComment(ctx, e, ps));
}
break;
case PUBLISH_ALL_REVISIONS:
publishAllRevisions(ctx, drafts, ups);
publishAllRevisions(ctx, drafts, toPublish);
break;
}
ChangeUpdate u = ctx.getUpdate(psId);
plcUtil.deleteComments(ctx.getDb(), u, del);
plcUtil.putComments(ctx.getDb(), u, ups);
comments.addAll(ups);
return !del.isEmpty() || !ups.isEmpty();
commentsUtil.deleteComments(ctx.getDb(), u, toDel);
commentsUtil.putComments(ctx.getDb(), u, Status.PUBLISHED, toPublish);
comments.addAll(toPublish);
return !toDel.isEmpty() || !toPublish.isEmpty();
}
private Set<CommentSetEntry> readExistingComments(ChangeContext ctx)
throws OrmException {
Set<CommentSetEntry> r = new HashSet<>();
for (PatchLineComment c : plcUtil.publishedByChange(ctx.getDb(),
for (Comment c : commentsUtil.publishedByChange(ctx.getDb(),
ctx.getNotes())) {
r.add(CommentSetEntry.create(c));
}
return r;
}
private Map<String, PatchLineComment> changeDrafts(ChangeContext ctx)
private Map<String, Comment> changeDrafts(ChangeContext ctx)
throws OrmException {
Map<String, PatchLineComment> drafts = new HashMap<>();
for (PatchLineComment c : plcUtil.draftByChangeAuthor(
Map<String, Comment> drafts = new HashMap<>();
for (Comment c : commentsUtil.draftByChangeAuthor(
ctx.getDb(), ctx.getNotes(), user.getAccountId())) {
c.setTag(in.tag);
drafts.put(c.getKey().get(), c);
c.tag = in.tag;
drafts.put(c.key.uuid, c);
}
return drafts;
}
private Map<String, PatchLineComment> patchSetDrafts(ChangeContext ctx)
private Map<String, Comment> patchSetDrafts(ChangeContext ctx)
throws OrmException {
Map<String, PatchLineComment> drafts = new HashMap<>();
for (PatchLineComment c : plcUtil.draftByPatchSetAuthor(ctx.getDb(),
Map<String, Comment> drafts = new HashMap<>();
for (Comment c : commentsUtil.draftByPatchSetAuthor(ctx.getDb(),
psId, user.getAccountId(), ctx.getNotes())) {
drafts.put(c.getKey().get(), c);
drafts.put(c.key.uuid, c);
}
return drafts;
}
@ -568,21 +570,20 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
return labels;
}
private PatchLineComment publishComment(ChangeContext ctx,
PatchLineComment c, PatchSet ps) throws OrmException {
c.setStatus(PatchLineComment.Status.PUBLISHED);
c.setWrittenOn(ctx.getWhen());
c.setTag(in.tag);
private Comment publishComment(ChangeContext ctx,
Comment c, PatchSet ps) throws OrmException {
c.writtenOn = ctx.getWhen();
c.tag = in.tag;
setCommentRevId(c, patchListCache, ctx.getChange(), checkNotNull(ps));
return c;
}
private void publishAllRevisions(ChangeContext ctx,
Map<String, PatchLineComment> drafts, List<PatchLineComment> ups)
Map<String, Comment> drafts, List<Comment> ups)
throws OrmException {
boolean needOtherPatchSets = false;
for (PatchLineComment c : drafts.values()) {
if (!c.getPatchSetId().equals(psId)) {
for (Comment c : drafts.values()) {
if (c.key.patchSetId != psId.get()) {
needOtherPatchSets = true;
break;
}
@ -590,8 +591,9 @@ public class PostReview implements RestModifyView<RevisionResource, ReviewInput>
Map<PatchSet.Id, PatchSet> patchSets = needOtherPatchSets
? psUtil.byChangeAsMap(ctx.getDb(), ctx.getNotes())
: ImmutableMap.of(psId, ps);
for (PatchLineComment e : drafts.values()) {
ups.add(publishComment(ctx, e, patchSets.get(e.getPatchSetId())));
for (Comment e : drafts.values()) {
ups.add(publishComment(ctx, e, patchSets
.get(new PatchSet.Id(ctx.getChange().getId(), e.key.patchSetId))));
}
}

View File

@ -14,7 +14,7 @@
package com.google.gerrit.server.change;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import com.google.common.base.Optional;
import com.google.gerrit.common.TimeUtil;
@ -26,11 +26,11 @@ import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.Url;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.git.BatchUpdate;
import com.google.gerrit.server.git.BatchUpdate.ChangeContext;
@ -50,7 +50,7 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
private final Provider<ReviewDb> db;
private final DeleteDraftComment delete;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
private final BatchUpdate.Factory updateFactory;
private final Provider<CommentJson> commentJson;
@ -59,14 +59,14 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
@Inject
PutDraftComment(Provider<ReviewDb> db,
DeleteDraftComment delete,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
BatchUpdate.Factory updateFactory,
Provider<CommentJson> commentJson,
PatchListCache patchListCache) {
this.db = db;
this.delete = delete;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.updateFactory = updateFactory;
this.commentJson = commentJson;
@ -89,7 +89,7 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
try (BatchUpdate bu = updateFactory.create(
db.get(), rsrc.getChange().getProject(), rsrc.getControl().getUser(),
TimeUtil.nowTs())) {
Op op = new Op(rsrc.getComment().getKey(), in);
Op op = new Op(rsrc.getComment().key, in);
bu.addOp(rsrc.getChange().getId(), op);
bu.execute();
return Response.ok(
@ -98,12 +98,12 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
}
private class Op extends BatchUpdate.Op {
private final PatchLineComment.Key key;
private final Comment.Key key;
private final DraftInput in;
private PatchLineComment comment;
private Comment comment;
private Op(PatchLineComment.Key key, DraftInput in) {
private Op(Comment.Key key, DraftInput in) {
this.key = key;
this.in = in;
}
@ -111,17 +111,18 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
@Override
public boolean updateChange(ChangeContext ctx)
throws ResourceNotFoundException, OrmException {
Optional<PatchLineComment> maybeComment =
plcUtil.get(ctx.getDb(), ctx.getNotes(), key);
Optional<Comment> maybeComment =
commentsUtil.get(ctx.getDb(), ctx.getNotes(), key);
if (!maybeComment.isPresent()) {
// Disappeared out from under us. Can't easily fall back to insert,
// because the input might be missing required fields. Just give up.
throw new ResourceNotFoundException("comment not found: " + key);
}
PatchLineComment origComment = maybeComment.get();
comment = new PatchLineComment(origComment);
Comment origComment = maybeComment.get();
comment = new Comment(origComment);
PatchSet.Id psId = comment.getKey().getParentKey().getParentKey();
PatchSet.Id psId =
new PatchSet.Id(ctx.getChange().getId(), origComment.key.patchSetId);
ChangeUpdate update = ctx.getUpdate(psId);
PatchSet ps = psUtil.get(ctx.getDb(), ctx.getNotes(), psId);
@ -129,53 +130,35 @@ public class PutDraftComment implements RestModifyView<DraftCommentResource, Dra
throw new ResourceNotFoundException("patch set not found: " + psId);
}
if (in.path != null
&& !in.path.equals(comment.getKey().getParentKey().getFileName())) {
&& !in.path.equals(origComment.key.filename)) {
// Updating the path alters the primary key, which isn't possible.
// Delete then recreate the comment instead of an update.
plcUtil.deleteComments(
commentsUtil.deleteComments(
ctx.getDb(), update, Collections.singleton(origComment));
comment = new PatchLineComment(
new PatchLineComment.Key(
new Patch.Key(psId, in.path),
comment.getKey().get()),
comment.getLine(),
ctx.getAccountId(),
comment.getParentUuid(), ctx.getWhen());
comment.setTag(origComment.getTag());
setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
plcUtil.putComments(ctx.getDb(), update,
Collections.singleton(update(comment, in, ctx.getWhen())));
} else {
if (comment.getRevId() == null) {
setCommentRevId(
comment, patchListCache, ctx.getChange(), ps);
}
plcUtil.putComments(ctx.getDb(), update,
Collections.singleton(update(comment, in, ctx.getWhen())));
comment.key.filename = in.path;
}
setCommentRevId(comment, patchListCache, ctx.getChange(), ps);
commentsUtil.putComments(ctx.getDb(), update, Status.DRAFT,
Collections.singleton(update(comment, in, ctx.getWhen())));
ctx.bumpLastUpdatedOn(false);
return true;
}
}
private static PatchLineComment update(PatchLineComment e, DraftInput in,
Timestamp when) {
private static Comment update(Comment e, DraftInput in, Timestamp when) {
if (in.side != null) {
e.setSide(in.side());
e.side = in.side();
}
if (in.inReplyTo != null) {
e.setParentUuid(Url.decode(in.inReplyTo));
e.parentUuid = Url.decode(in.inReplyTo);
}
e.setMessage(in.message.trim());
if (in.range != null || in.line != null) {
e.setRange(in.range);
e.setLine(in.range != null ? in.range.endLine : in.line);
}
e.setWrittenOn(when);
e.setLineNbrAndRange(in.line, in.range);
e.message = in.message.trim();
e.writtenOn = when;
if (in.tag != null) {
// TODO(dborowitz): Can we support changing tags via PUT?
e.setTag(in.tag);
e.tag = in.tag;
}
return e;
}

View File

@ -27,8 +27,8 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.UserIdentity;
@ -398,10 +398,10 @@ public class EventFactory {
}
public void addPatchSetComments(PatchSetAttribute patchSetAttribute,
Collection<PatchLineComment> patchLineComments) {
for (PatchLineComment comment : patchLineComments) {
if (comment.getKey().getParentKey().getParentKey().get()
== Integer.parseInt(patchSetAttribute.number)) {
Collection<Comment> comments) {
for (Comment comment : comments) {
if (comment.key.patchSetId ==
Integer.parseInt(patchSetAttribute.number)) {
if (patchSetAttribute.comments == null) {
patchSetAttribute.comments = new ArrayList<>();
}
@ -637,12 +637,12 @@ public class EventFactory {
return a;
}
public PatchSetCommentAttribute asPatchSetLineAttribute(PatchLineComment c) {
public PatchSetCommentAttribute asPatchSetLineAttribute(Comment c) {
PatchSetCommentAttribute a = new PatchSetCommentAttribute();
a.reviewer = asAccountAttribute(c.getAuthor());
a.file = c.getKey().getParentKey().get();
a.line = c.getLine();
a.message = c.getMessage();
a.reviewer = asAccountAttribute(c.author.getId());
a.file = c.key.filename;
a.line = c.lineNbr;
a.message = c.message;
return a;
}

View File

@ -31,7 +31,7 @@ import com.google.common.collect.Table;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.server.ReviewerSet;
@ -569,8 +569,8 @@ public class ChangeField {
public Iterable<String> get(ChangeData input, FillArgs args)
throws OrmException {
Set<String> r = new HashSet<>();
for (PatchLineComment c : input.publishedComments()) {
r.add(c.getMessage());
for (Comment c : input.publishedComments()) {
r.add(c.message);
}
for (ChangeMessage m : input.messages()) {
r.add(m.getMessage());
@ -647,8 +647,8 @@ public class ChangeField {
r.add(m.getAuthor().get());
}
}
for (PatchLineComment c : input.publishedComments()) {
r.add(c.getAuthor().get());
for (Comment c : input.publishedComments()) {
r.add(c.author.getId().get());
}
return r;
}

View File

@ -14,8 +14,6 @@
package com.google.gerrit.server.mail;
import static com.google.gerrit.server.PatchLineCommentsUtil.getCommentPsId;
import com.google.common.base.Optional;
import com.google.common.base.Strings;
import com.google.common.collect.Ordering;
@ -23,12 +21,10 @@ import com.google.gerrit.common.errors.EmailException;
import com.google.gerrit.extensions.api.changes.NotifyHandling;
import com.google.gerrit.reviewdb.client.AccountProjectWatch.NotifyType;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.patch.PatchFile;
import com.google.gerrit.server.patch.PatchList;
import com.google.gerrit.server.patch.PatchListNotAvailableException;
@ -56,27 +52,26 @@ public class CommentSender extends ReplyToChangeSender {
CommentSender create(Project.NameKey project, Change.Id id);
}
private List<PatchLineComment> inlineComments = Collections.emptyList();
private final PatchLineCommentsUtil plcUtil;
private List<Comment> inlineComments = Collections.emptyList();
private final CommentsUtil commentsUtil;
@Inject
public CommentSender(EmailArguments ea,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
@Assisted Project.NameKey project,
@Assisted Change.Id id) throws OrmException {
super(ea, "comment", newChangeData(ea, project, id));
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
public void setPatchLineComments(final List<PatchLineComment> plc)
public void setPatchLineComments(List<Comment> plc)
throws OrmException {
inlineComments = plc;
Set<String> paths = new HashSet<>();
for (PatchLineComment c : plc) {
Patch.Key p = c.getKey().getParentKey();
if (!Patch.isMagic(p.getFileName())) {
paths.add(p.getFileName());
for (Comment c : plc) {
if (!Patch.isMagic(c.key.filename)) {
paths.add(c.key.filename);
}
}
changeData.setCurrentFilePaths(Ordering.natural().sortedCopy(paths));
@ -125,32 +120,34 @@ public class CommentSender extends ReplyToChangeSender {
}
}
Patch.Key currentFileKey = null;
String currentFileName = null;
int currentPatchSetId = -1;
PatchFile currentFileData = null;
for (final PatchLineComment c : inlineComments) {
final Patch.Key pk = c.getKey().getParentKey();
if (!pk.equals(currentFileKey)) {
String link = makeLink(pk);
for (Comment c : inlineComments) {
if (!c.key.filename.equals(currentFileName)
|| c.key.patchSetId != currentPatchSetId) {
String link = makeLink(change.getId(), c.key);
if (link != null) {
cmts.append(link).append('\n');
}
if (Patch.COMMIT_MSG.equals(pk.get())) {
if (Patch.COMMIT_MSG.equals(c.key.filename)) {
cmts.append("Commit Message:\n\n");
} else if (Patch.MERGE_LIST.equals(pk.get())) {
} else if (Patch.MERGE_LIST.equals(c.key.filename)) {
cmts.append("Merge List:\n\n");
} else {
cmts.append("File ").append(pk.get()).append(":\n\n");
cmts.append("File ").append(c.key.filename).append(":\n\n");
}
currentFileKey = pk;
currentFileName = c.key.filename;
currentPatchSetId = c.key.patchSetId;
if (patchList != null) {
try {
currentFileData = new PatchFile(repo, patchList, pk.get());
currentFileData =
new PatchFile(repo, patchList, c.key.filename);
} catch (IOException e) {
log.warn(String.format(
"Cannot load %s from %s in %s",
pk.getFileName(),
c.key.filename,
patchList.getNewId().name(),
projectState.getProject().getName()), e);
currentFileData = null;
@ -168,26 +165,26 @@ public class CommentSender extends ReplyToChangeSender {
}
private void appendComment(StringBuilder out, int contextLines,
PatchFile currentFileData, PatchLineComment comment) {
short side = comment.getSide();
CommentRange range = comment.getRange();
PatchFile currentFileData, Comment comment) {
short side = comment.side;
Comment.Range range = comment.range;
if (range != null) {
String prefix = "PS" + getCommentPsId(comment).get()
+ ", Line " + range.getStartLine() + ": ";
for (int n = range.getStartLine(); n <= range.getEndLine(); n++) {
out.append(n == range.getStartLine()
String prefix = "PS" + comment.key.patchSetId
+ ", Line " + range.startLine + ": ";
for (int n = range.startLine; n <= range.endLine; n++) {
out.append(n == range.startLine
? prefix
: Strings.padStart(": ", prefix.length(), ' '));
try {
String s = currentFileData.getLine(side, n);
if (n == range.getStartLine() && n == range.getEndLine()) {
if (n == range.startLine && n == range.endLine) {
s = s.substring(
Math.min(range.getStartCharacter(), s.length()),
Math.min(range.getEndCharacter(), s.length()));
} else if (n == range.getStartLine()) {
s = s.substring(Math.min(range.getStartCharacter(), s.length()));
} else if (n == range.getEndLine()) {
s = s.substring(0, Math.min(range.getEndCharacter(), s.length()));
Math.min(range.startChar, s.length()),
Math.min(range.endChar, s.length()));
} else if (n == range.startLine) {
s = s.substring(Math.min(range.startChar, s.length()));
} else if (n == range.endLine) {
s = s.substring(0, Math.min(range.endChar, s.length()));
}
out.append(s);
} catch (Throwable e) {
@ -196,9 +193,9 @@ public class CommentSender extends ReplyToChangeSender {
out.append('\n');
}
appendQuotedParent(out, comment);
out.append(comment.getMessage().trim()).append('\n');
out.append(comment.message.trim()).append('\n');
} else {
int lineNbr = comment.getLine();
int lineNbr = comment.lineNbr;
int maxLines;
try {
maxLines = currentFileData.getLineCount(side);
@ -213,7 +210,7 @@ public class CommentSender extends ReplyToChangeSender {
appendFileLine(out, currentFileData, side, line);
}
appendQuotedParent(out, comment);
out.append(comment.getMessage().trim()).append('\n');
out.append(comment.message.trim()).append('\n');
for (int line = lineNbr + 1; line < stopLine; ++line) {
appendFileLine(out, currentFileData, side, line);
@ -233,21 +230,20 @@ public class CommentSender extends ReplyToChangeSender {
cmts.append("\n");
}
private void appendQuotedParent(StringBuilder out, PatchLineComment child) {
if (child.getParentUuid() != null) {
Optional<PatchLineComment> parent;
PatchLineComment.Key key = new PatchLineComment.Key(
child.getKey().getParentKey(),
child.getParentUuid());
private void appendQuotedParent(StringBuilder out, Comment child) {
if (child.parentUuid != null) {
Optional<Comment> parent;
Comment.Key key = new Comment.Key(child.parentUuid, child.key.filename,
child.key.patchSetId);
try {
parent = plcUtil.get(args.db.get(), changeData.notes(), key);
parent = commentsUtil.get(args.db.get(), changeData.notes(), key);
} catch (OrmException e) {
log.warn("Could not find the parent of this comment: "
+ child.toString());
parent = Optional.absent();
}
if (parent.isPresent()) {
String msg = parent.get().getMessage().trim();
String msg = parent.get().message.trim();
if (msg.length() > 75) {
msg = msg.substring(0, 75);
}
@ -261,19 +257,17 @@ public class CommentSender extends ReplyToChangeSender {
}
// Makes a link back to the given patch set and file.
private String makeLink(Patch.Key patch) {
private String makeLink(Change.Id changeId, Comment.Key key) {
String url = getGerritUrl();
if (url == null) {
return null;
}
PatchSet.Id ps = patch.getParentKey();
Change.Id c = ps.getParentKey();
return new StringBuilder()
.append(url)
.append("#/c/").append(c)
.append('/').append(ps.get())
.append('/').append(KeyUtil.encode(patch.get()))
.append("#/c/").append(changeId)
.append('/').append(key.patchSetId)
.append('/').append(KeyUtil.encode(key.filename))
.toString();
}

View File

@ -50,7 +50,7 @@ import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilderImpl;
import com.google.gwtorm.client.Column;
@ -83,16 +83,18 @@ public class ChangeBundle {
REVIEW_DB, NOTE_DB;
}
public static ChangeBundle fromNotes(PatchLineCommentsUtil plcUtil,
public static ChangeBundle fromNotes(CommentsUtil commentsUtil,
ChangeNotes notes) throws OrmException {
return new ChangeBundle(
notes.getChange(),
notes.getChangeMessages(),
notes.getPatchSets().values(),
notes.getApprovals().values(),
Iterables.concat(
plcUtil.draftByChange(null, notes),
plcUtil.publishedByChange(null, notes)),
Iterables.concat(CommentsUtil.toPatchLineComments(notes.getChangeId(),
PatchLineComment.Status.DRAFT, commentsUtil.draftByChange(null, notes)),
CommentsUtil.toPatchLineComments(notes.getChangeId(),
PatchLineComment.Status.PUBLISHED,
commentsUtil.publishedByChange(null, notes))),
notes.getReviewers(),
Source.NOTE_DB);
}

View File

@ -22,6 +22,7 @@ import com.google.auto.value.AutoValue;
import com.google.common.collect.Sets;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@ -69,17 +70,17 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate {
@AutoValue
abstract static class Key {
abstract RevId revId();
abstract PatchLineComment.Key key();
abstract String revId();
abstract Comment.Key key();
}
private static Key key(PatchLineComment c) {
return new AutoValue_ChangeDraftUpdate_Key(c.getRevId(), c.getKey());
private static Key key(Comment c) {
return new AutoValue_ChangeDraftUpdate_Key(c.revId, c.key);
}
private final AllUsersName draftsProject;
private List<PatchLineComment> put = new ArrayList<>();
private List<Comment> put = new ArrayList<>();
private Set<Key> delete = new HashSet<>();
@AssistedInject
@ -114,24 +115,22 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate {
this.draftsProject = allUsers;
}
public void putComment(PatchLineComment c) {
public void putComment(Comment c) {
verifyComment(c);
checkArgument(c.getStatus() == PatchLineComment.Status.DRAFT,
"Cannot insert a published comment into a ChangeDraftUpdate");
put.add(c);
}
public void deleteComment(PatchLineComment c) {
public void deleteComment(Comment c) {
verifyComment(c);
delete.add(key(c));
}
public void deleteComment(RevId revId, PatchLineComment.Key key) {
public void deleteComment(String revId, Comment.Key key) {
delete.add(new AutoValue_ChangeDraftUpdate_Key(revId, key));
}
private void verifyComment(PatchLineComment comment) {
checkArgument(comment.getAuthor().equals(accountId),
private void verifyComment(Comment comment) {
checkArgument(comment.author.getId().equals(accountId),
"The author for the following comment does not match the author of"
+ " this ChangeDraftUpdate (%s): %s", accountId, comment);
}
@ -144,13 +143,13 @@ public class ChangeDraftUpdate extends AbstractChangeUpdate {
Sets.newHashSetWithExpectedSize(rnm.revisionNotes.size());
RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
for (PatchLineComment c : put) {
for (Comment c : put) {
if (!delete.contains(key(c))) {
cache.get(c.getRevId()).putComment(c);
cache.get(new RevId(c.revId)).putComment(c);
}
}
for (Key k : delete) {
cache.get(k.revId()).deleteComment(k.key());
cache.get(new RevId(k.revId())).deleteComment(k.key());
}
Map<RevId, RevisionNoteBuilder> builders = cache.getBuilders();

View File

@ -15,7 +15,7 @@
package com.google.gerrit.server.notedb;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.gerrit.server.PatchLineCommentsUtil.PLC_ORDER;
import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
import static com.google.gerrit.server.notedb.ChangeNotes.parseException;
import static java.nio.charset.StandardCharsets.UTF_8;
@ -25,13 +25,10 @@ import com.google.common.collect.Multimap;
import com.google.common.primitives.Ints;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RevId;
import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.config.AnonymousCowardName;
@ -58,6 +55,7 @@ import java.io.PrintWriter;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
@ -164,13 +162,13 @@ public class ChangeNoteUtil {
return m == p.value + expected.length;
}
public List<PatchLineComment> parseNote(byte[] note, MutableInteger p,
Change.Id changeId, Status status) throws ConfigInvalidException {
public List<Comment> parseNote(byte[] note, MutableInteger p,
Change.Id changeId) throws ConfigInvalidException {
if (p.value >= note.length) {
return ImmutableList.of();
}
Set<PatchLineComment.Key> seen = new HashSet<>();
List<PatchLineComment> result = new ArrayList<>();
Set<Comment.Key> seen = new HashSet<>();
List<Comment> result = new ArrayList<>();
int sizeOfNote = note.length;
byte[] psb = PATCH_SET.getBytes(UTF_8);
byte[] bpsb = BASE_PATCH_SET.getBytes(UTF_8);
@ -201,21 +199,21 @@ public class ChangeNoteUtil {
PATCH_SET, BASE_PATCH_SET);
}
PatchLineComment c = parseComment(
note, p, fileName, psId, revId, isForBase, parentNumber, status);
fileName = c.getKey().getParentKey().getFileName();
if (!seen.add(c.getKey())) {
Comment c = parseComment(
note, p, fileName, psId, revId, isForBase, parentNumber);
fileName = c.key.filename;
if (!seen.add(c.key)) {
throw parseException(
changeId, "multiple comments for %s in note", c.getKey());
changeId, "multiple comments for %s in note", c.key);
}
result.add(c);
}
return result;
}
private PatchLineComment parseComment(byte[] note, MutableInteger curr,
private Comment parseComment(byte[] note, MutableInteger curr,
String currentFileName, PatchSet.Id psId, RevId revId, boolean isForBase,
Integer parentNumber, Status status) throws ConfigInvalidException {
Integer parentNumber) throws ConfigInvalidException {
Change.Id changeId = psId.getParentKey();
// Check if there is a new file.
@ -258,27 +256,27 @@ public class ChangeNoteUtil {
UTF_8, note, curr.value, curr.value + commentLength);
checkResult(message, "message contents", changeId);
PatchLineComment plc = new PatchLineComment(
new PatchLineComment.Key(new Patch.Key(psId, currentFileName), uuid),
range.getEndLine(), aId, parentUUID, commentTime);
plc.setMessage(message);
plc.setTag(tag);
if (isForBase) {
plc.setSide((short) (parentNumber == null ? 0 : -parentNumber));
} else {
plc.setSide((short) 1);
}
Comment c = new Comment(
new Comment.Key(uuid, currentFileName, psId.get()),
aId,
commentTime,
isForBase
? (short) (parentNumber == null ? 0 : -parentNumber)
: (short) 1,
message,
serverId);
c.lineNbr = range.getEndLine();
c.parentUuid = parentUUID;
c.tag = tag;
c.setRevId(revId);
if (range.getStartCharacter() != -1) {
plc.setRange(range);
c.setRange(range);
}
plc.setRevId(revId);
plc.setStatus(status);
curr.value = RawParseUtils.nextLF(note, curr.value + commentLength);
curr.value = RawParseUtils.nextLF(note, curr.value);
return plc;
return c;
}
private static String parseStringField(byte[] note, MutableInteger curr,
@ -492,47 +490,45 @@ public class ChangeNoteUtil {
* side.
* @param out output stream to write to.
*/
void buildNote(Multimap<PatchSet.Id, PatchLineComment> comments,
void buildNote(Multimap<Integer, Comment> comments,
OutputStream out) {
if (comments.isEmpty()) {
return;
}
List<PatchSet.Id> psIds =
ReviewDbUtil.intKeyOrdering().sortedCopy(comments.keySet());
List<Integer> psIds = new ArrayList<>(comments.keySet());
Collections.sort(psIds);
OutputStreamWriter streamWriter = new OutputStreamWriter(out, UTF_8);
try (PrintWriter writer = new PrintWriter(streamWriter)) {
RevId revId = comments.values().iterator().next().getRevId();
appendHeaderField(writer, REVISION, revId.get());
String revId = comments.values().iterator().next().revId;
appendHeaderField(writer, REVISION, revId);
for (PatchSet.Id psId : psIds) {
List<PatchLineComment> psComments =
PLC_ORDER.sortedCopy(comments.get(psId));
PatchLineComment first = psComments.get(0);
for (int psId : psIds) {
List<Comment> psComments = COMMENT_ORDER.sortedCopy(comments.get(psId));
Comment first = psComments.get(0);
short side = first.getSide();
short side = first.side;
appendHeaderField(writer, side <= 0
? BASE_PATCH_SET
: PATCH_SET,
Integer.toString(psId.get()));
Integer.toString(psId));
if (side < 0) {
appendHeaderField(writer, PARENT_NUMBER, Integer.toString(-side));
}
String currentFilename = null;
for (PatchLineComment c : psComments) {
checkArgument(revId.equals(c.getRevId()),
for (Comment c : psComments) {
checkArgument(revId.equals(c.revId),
"All comments being added must have all the same RevId. The "
+ "comment below does not have the same RevId as the others "
+ "(%s).\n%s", revId, c);
checkArgument(side == c.getSide(),
checkArgument(side == c.side,
"All comments being added must all have the same side. The "
+ "comment below does not have the same side as the others "
+ "(%s).\n%s", side, c);
String commentFilename = QuotedString.GIT_PATH.quote(
c.getKey().getParentKey().getFileName());
String commentFilename = QuotedString.GIT_PATH.quote(c.key.filename);
if (!commentFilename.equals(currentFilename)) {
currentFilename = commentFilename;
@ -547,30 +543,30 @@ public class ChangeNoteUtil {
}
}
private void appendOneComment(PrintWriter writer, PatchLineComment c) {
private void appendOneComment(PrintWriter writer, Comment c) {
// The CommentRange field for a comment is allowed to be null. If it is
// null, then in the first line, we simply use the line number field for a
// comment instead. If it isn't null, we write the comment range itself.
CommentRange range = c.getRange();
Comment.Range range = c.range;
if (range != null) {
writer.print(range.getStartLine());
writer.print(range.startLine);
writer.print(':');
writer.print(range.getStartCharacter());
writer.print(range.startChar);
writer.print('-');
writer.print(range.getEndLine());
writer.print(range.endLine);
writer.print(':');
writer.print(range.getEndCharacter());
writer.print(range.endChar);
} else {
writer.print(c.getLine());
writer.print(c.lineNbr);
}
writer.print("\n");
writer.print(formatTime(serverIdent, c.getWrittenOn()));
writer.print(formatTime(serverIdent, c.writtenOn));
writer.print("\n");
PersonIdent ident = newIdent(
accountCache.get(c.getAuthor()).getAccount(),
c.getWrittenOn(), serverIdent, anonymousCowardName);
accountCache.get(c.author.getId()).getAccount(),
c.writtenOn, serverIdent, anonymousCowardName);
StringBuilder name = new StringBuilder();
PersonIdent.appendSanitized(name, ident.getName());
name.append(" <");
@ -578,22 +574,22 @@ public class ChangeNoteUtil {
name.append('>');
appendHeaderField(writer, AUTHOR, name.toString());
String parent = c.getParentUuid();
String parent = c.parentUuid;
if (parent != null) {
appendHeaderField(writer, PARENT, parent);
}
appendHeaderField(writer, UUID, c.getKey().get());
appendHeaderField(writer, UUID, c.key.uuid);
if (c.getTag() != null) {
appendHeaderField(writer, TAG, c.getTag());
if (c.tag != null) {
appendHeaderField(writer, TAG, c.tag);
}
byte[] messageBytes = c.getMessage().getBytes(UTF_8);
byte[] messageBytes = c.message.getBytes(UTF_8);
appendHeaderField(writer, LENGTH,
Integer.toString(messageBytes.length));
writer.print(c.getMessage());
writer.print(c.message);
writer.print("\n\n");
}
}

View File

@ -39,7 +39,7 @@ import com.google.gerrit.metrics.Timer1;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
@ -431,23 +431,23 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
}
/** @return inline comments on each revision. */
public ImmutableListMultimap<RevId, PatchLineComment> getComments() {
public ImmutableListMultimap<RevId, Comment> getComments() {
return state.publishedComments();
}
public ImmutableListMultimap<RevId, PatchLineComment> getDraftComments(
public ImmutableListMultimap<RevId, Comment> getDraftComments(
Account.Id author) throws OrmException {
loadDraftComments(author);
final Multimap<RevId, PatchLineComment> published =
final Multimap<RevId, Comment> published =
state.publishedComments();
// Filter out any draft comments that also exist in the published map, in
// case the update to All-Users to delete them during the publish operation
// failed.
Multimap<RevId, PatchLineComment> filtered = Multimaps.filterEntries(
Multimap<RevId, Comment> filtered = Multimaps.filterEntries(
draftCommentNotes.getComments(),
(Map.Entry<RevId, PatchLineComment> e) -> {
for (PatchLineComment c : published.get(e.getKey())) {
if (c.getKey().equals(e.getValue().getKey())) {
(Map.Entry<RevId, Comment> e) -> {
for (Comment c : published.get(e.getKey())) {
if (c.key.equals(e.getValue().key)) {
return false;
}
}
@ -478,17 +478,17 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
return draftCommentNotes;
}
public boolean containsComment(PatchLineComment c) throws OrmException {
public boolean containsComment(Comment c) throws OrmException {
if (containsCommentPublished(c)) {
return true;
}
loadDraftComments(c.getAuthor());
loadDraftComments(c.author.getId());
return draftCommentNotes.containsComment(c);
}
public boolean containsCommentPublished(PatchLineComment c) {
for (PatchLineComment l : getComments().values()) {
if (c.getKey().equals(l.getKey())) {
public boolean containsCommentPublished(Comment c) {
for (Comment l : getComments().values()) {
if (c.key.equals(l.key)) {
return true;
}
}

View File

@ -54,6 +54,7 @@ import com.google.gerrit.metrics.Timer1;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.LabelId;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
@ -124,7 +125,7 @@ class ChangeNotesParser {
private final List<Account.Id> allPastReviewers;
private final List<ReviewerStatusUpdate> reviewerUpdates;
private final List<SubmitRecord> submitRecords;
private final Multimap<RevId, PatchLineComment> comments;
private final Multimap<RevId, Comment> comments;
private final TreeMap<PatchSet.Id, PatchSet> patchSets;
private final Set<PatchSet.Id> deletedPatchSets;
private final Map<PatchSet.Id, PatchSetState> patchSetStates;
@ -617,8 +618,8 @@ class ChangeNotesParser {
Map<RevId, RevisionNote> rns = revisionNoteMap.revisionNotes;
for (Map.Entry<RevId, RevisionNote> e : rns.entrySet()) {
for (PatchLineComment plc : e.getValue().comments) {
comments.put(e.getKey(), plc);
for (Comment c : e.getValue().comments) {
comments.put(e.getKey(), c);
}
}
@ -861,9 +862,9 @@ class ChangeNotesParser {
it.remove();
}
}
for (Iterator<PatchLineComment> it = comments.values().iterator();
for (Iterator<Comment> it = comments.values().iterator();
it.hasNext();) {
PatchSet.Id psId = it.next().getKey().getParentKey().getParentKey();
PatchSet.Id psId = new PatchSet.Id(id, it.next().key.patchSetId);
if (!all.contains(psId)) {
it.remove();
}

View File

@ -30,7 +30,7 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.RevId;
@ -69,7 +69,7 @@ public abstract class ChangeNotesState {
ImmutableList.<SubmitRecord>of(),
ImmutableList.<ChangeMessage>of(),
ImmutableListMultimap.<PatchSet.Id, ChangeMessage>of(),
ImmutableListMultimap.<RevId, PatchLineComment>of());
ImmutableListMultimap.<RevId, Comment>of());
}
static ChangeNotesState create(
@ -95,7 +95,7 @@ public abstract class ChangeNotesState {
List<SubmitRecord> submitRecords,
List<ChangeMessage> allChangeMessages,
Multimap<PatchSet.Id, ChangeMessage> changeMessagesByPatchSet,
Multimap<RevId, PatchLineComment> publishedComments) {
Multimap<RevId, Comment> publishedComments) {
if (hashtags == null) {
hashtags = ImmutableSet.of();
}
@ -169,7 +169,7 @@ public abstract class ChangeNotesState {
abstract ImmutableList<ChangeMessage> allChangeMessages();
abstract ImmutableListMultimap<PatchSet.Id, ChangeMessage>
changeMessagesByPatchSet();
abstract ImmutableListMultimap<RevId, PatchLineComment> publishedComments();
abstract ImmutableListMultimap<RevId, Comment> publishedComments();
void copyColumnsTo(Change change) {
ChangeColumns c = checkNotNull(columns());

View File

@ -47,6 +47,7 @@ import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.data.SubmitRecord;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RevId;
@ -113,7 +114,7 @@ public class ChangeUpdate extends AbstractChangeUpdate {
private final Table<String, Account.Id, Optional<Short>> approvals;
private final Map<Account.Id, ReviewerStateInternal> reviewers = new LinkedHashMap<>();
private final List<PatchLineComment> comments = new ArrayList<>();
private final List<Comment> comments = new ArrayList<>();
private String commitSubject;
private String subject;
@ -304,10 +305,10 @@ public class ChangeUpdate extends AbstractChangeUpdate {
this.tag = tag;
}
public void putComment(PatchLineComment c) {
public void putComment(PatchLineComment.Status status, Comment c) {
verifyComment(c);
createDraftUpdateIfNull();
if (c.getStatus() == PatchLineComment.Status.DRAFT) {
if (status == PatchLineComment.Status.DRAFT) {
draftUpdate.putComment(c);
} else {
comments.add(c);
@ -319,14 +320,9 @@ public class ChangeUpdate extends AbstractChangeUpdate {
}
}
public void deleteComment(PatchLineComment c) {
public void deleteComment(Comment c) {
verifyComment(c);
if (c.getStatus() == PatchLineComment.Status.DRAFT) {
createDraftUpdateIfNull().deleteComment(c);
} else {
throw new IllegalArgumentException(
"Cannot delete published comment " + c);
}
createDraftUpdateIfNull().deleteComment(c);
}
@VisibleForTesting
@ -344,9 +340,9 @@ public class ChangeUpdate extends AbstractChangeUpdate {
return draftUpdate;
}
private void verifyComment(PatchLineComment c) {
checkArgument(c.getRevId() != null, "RevId required for comment: %s", c);
checkArgument(c.getAuthor().equals(getAccountId()),
private void verifyComment(Comment c) {
checkArgument(c.revId != null, "RevId required for comment: %s", c);
checkArgument(c.author.getId().equals(getAccountId()),
"The author for the following comment does not match the author of"
+ " this ChangeDraftUpdate (%s): %s", getAccountId(), c);
@ -417,9 +413,9 @@ public class ChangeUpdate extends AbstractChangeUpdate {
RevisionNoteMap rnm = getRevisionNoteMap(rw, curr);
RevisionNoteBuilder.Cache cache = new RevisionNoteBuilder.Cache(rnm);
for (PatchLineComment c : comments) {
c.setTag(tag);
cache.get(c.getRevId()).putComment(c);
for (Comment c : comments) {
c.tag = tag;
cache.get(new RevId(c.revId)).putComment(c);
}
if (pushCert != null) {
checkState(commit != null);
@ -469,10 +465,10 @@ public class ChangeUpdate extends AbstractChangeUpdate {
private void checkComments(Map<RevId, RevisionNote> existingNotes,
Map<RevId, RevisionNoteBuilder> toUpdate) throws OrmException {
// Prohibit various kinds of illegal operations on comments.
Set<PatchLineComment.Key> existing = new HashSet<>();
Set<Comment.Key> existing = new HashSet<>();
for (RevisionNote rn : existingNotes.values()) {
for (PatchLineComment c : rn.comments) {
existing.add(c.getKey());
for (Comment c : rn.comments) {
existing.add(c.key);
if (draftUpdate != null) {
// Take advantage of an existing update on All-Users to prune any
// published comments from drafts. NoteDbUpdateManager takes care of
@ -489,14 +485,14 @@ public class ChangeUpdate extends AbstractChangeUpdate {
// separate commit. But note that we don't care much about the commit
// graph of the draft ref, particularly because the ref is completely
// deleted when all drafts are gone.
draftUpdate.deleteComment(c.getRevId(), c.getKey());
draftUpdate.deleteComment(c.revId, c.key);
}
}
}
for (RevisionNoteBuilder b : toUpdate.values()) {
for (PatchLineComment c : b.put.values()) {
if (existing.contains(c.getKey())) {
for (Comment c : b.put.values()) {
if (existing.contains(c.key)) {
throw new OrmException(
"Cannot update existing published comment: " + c);
}

View File

@ -24,6 +24,7 @@ import com.google.common.collect.Multimap;
import com.google.gerrit.metrics.Timer1;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
@ -68,7 +69,7 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
private final Account.Id author;
private final NoteDbUpdateManager.Result rebuildResult;
private ImmutableListMultimap<RevId, PatchLineComment> comments;
private ImmutableListMultimap<RevId, Comment> comments;
private RevisionNoteMap revisionNoteMap;
@AssistedInject
@ -110,13 +111,13 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
return author;
}
public ImmutableListMultimap<RevId, PatchLineComment> getComments() {
public ImmutableListMultimap<RevId, Comment> getComments() {
return comments;
}
public boolean containsComment(PatchLineComment c) {
for (PatchLineComment existing : comments.values()) {
if (c.getKey().equals(existing.getKey())) {
public boolean containsComment(Comment c) {
for (Comment existing : comments.values()) {
if (c.key.equals(existing.key)) {
return true;
}
}
@ -142,10 +143,10 @@ public class DraftCommentNotes extends AbstractChangeNotes<DraftCommentNotes> {
revisionNoteMap = RevisionNoteMap.parse(
args.noteUtil, getChangeId(), reader, NoteMap.read(reader, tipCommit),
PatchLineComment.Status.DRAFT);
Multimap<RevId, PatchLineComment> cs = ArrayListMultimap.create();
Multimap<RevId, Comment> cs = ArrayListMultimap.create();
for (RevisionNote rn : revisionNoteMap.revisionNotes.values()) {
for (PatchLineComment c : rn.comments) {
cs.put(c.getRevId(), c);
for (Comment c : rn.comments) {
cs.put(new RevId(c.revId), c);
}
}
comments = ImmutableListMultimap.copyOf(cs);

View File

@ -20,6 +20,7 @@ import static org.eclipse.jgit.lib.Constants.OBJ_BLOB;
import com.google.common.collect.ImmutableList;
import com.google.common.primitives.Bytes;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import org.eclipse.jgit.errors.ConfigInvalidException;
@ -65,7 +66,7 @@ class RevisionNote {
}
final byte[] raw;
final ImmutableList<PatchLineComment> comments;
final ImmutableList<Comment> comments;
final String pushCert;
RevisionNote(ChangeNoteUtil noteUtil, Change.Id changeId,
@ -83,7 +84,7 @@ class RevisionNote {
if (isJson(raw, p.value)) {
RevisionNoteData data = parseJson(noteUtil, p.value);
comments = data.exportComments(changeId, status);
comments = ImmutableList.copyOf(data.comments);
if (status == PatchLineComment.Status.PUBLISHED) {
pushCert = data.pushCert;
} else {
@ -98,8 +99,7 @@ class RevisionNote {
} else {
pushCert = null;
}
comments = ImmutableList.copyOf(
noteUtil.parseNote(raw, p, changeId, status));
comments = ImmutableList.copyOf(noteUtil.parseNote(raw, p, changeId));
}
private static boolean isJson(byte[] raw, int offset) {

View File

@ -15,15 +15,13 @@
package com.google.gerrit.server.notedb;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.gerrit.server.PatchLineCommentsUtil.PLC_ORDER;
import static com.google.gerrit.server.CommentsUtil.COMMENT_ORDER;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.stream.Collectors.toList;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.RevId;
import java.io.ByteArrayOutputStream;
@ -63,9 +61,9 @@ class RevisionNoteBuilder {
}
final byte[] baseRaw;
final List<PatchLineComment> baseComments;
final Map<PatchLineComment.Key, PatchLineComment> put;
final Set<PatchLineComment.Key> delete;
final List<Comment> baseComments;
final Map<Comment.Key, Comment> put;
final Set<Comment.Key> delete;
private String pushCert;
@ -94,13 +92,13 @@ class RevisionNoteBuilder {
return out.toByteArray();
}
void putComment(PatchLineComment comment) {
checkArgument(!delete.contains(comment.getKey()),
"cannot both delete and put %s", comment.getKey());
put.put(comment.getKey(), comment);
void putComment(Comment comment) {
checkArgument(!delete.contains(comment.key),
"cannot both delete and put %s", comment.key);
put.put(comment.key, comment);
}
void deleteComment(PatchLineComment.Key key) {
void deleteComment(Comment.Key key) {
checkArgument(!put.containsKey(key), "cannot both delete and put %s", key);
delete.add(key);
}
@ -109,17 +107,17 @@ class RevisionNoteBuilder {
this.pushCert = pushCert;
}
private Multimap<PatchSet.Id, PatchLineComment> buildCommentMap() {
Multimap<PatchSet.Id, PatchLineComment> all = ArrayListMultimap.create();
private Multimap<Integer, Comment> buildCommentMap() {
Multimap<Integer, Comment> all = ArrayListMultimap.create();
for (PatchLineComment c : baseComments) {
if (!delete.contains(c.getKey()) && !put.containsKey(c.getKey())) {
all.put(c.getPatchSetId(), c);
for (Comment c : baseComments) {
if (!delete.contains(c.key) && !put.containsKey(c.key)) {
all.put(c.key.patchSetId, c);
}
}
for (PatchLineComment c : put.values()) {
if (!delete.contains(c.getKey())) {
all.put(c.getPatchSetId(), c);
for (Comment c : put.values()) {
if (!delete.contains(c.key)) {
all.put(c.key.patchSetId, c);
}
}
return all;
@ -127,16 +125,13 @@ class RevisionNoteBuilder {
private void buildNoteJson(final ChangeNoteUtil noteUtil, OutputStream out)
throws IOException {
Multimap<PatchSet.Id, PatchLineComment> comments = buildCommentMap();
Multimap<Integer, Comment> comments = buildCommentMap();
if (comments.isEmpty() && pushCert == null) {
return;
}
RevisionNoteData data = new RevisionNoteData();
data.comments = comments.values().stream()
.sorted(PLC_ORDER)
.map(plc -> new RevisionNoteData.Comment(plc, noteUtil.getServerId()))
.collect(toList());
data.comments = COMMENT_ORDER.sortedCopy(comments.values());
data.pushCert = pushCert;
try (OutputStreamWriter osw = new OutputStreamWriter(out)) {

View File

@ -14,17 +14,8 @@
package com.google.gerrit.server.notedb;
import static java.util.stream.Collectors.toList;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.common.collect.ImmutableList;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.RevId;
import java.sql.Timestamp;
import java.util.List;
/**
@ -32,110 +23,6 @@ import java.util.List;
* <p>It is intended for (de)serialization to JSON only.
*/
class RevisionNoteData {
static class Identity {
int id;
Identity(Account.Id id) {
this.id = id.get();
}
Account.Id export() {
return new Account.Id(id);
}
}
static class CommentKey {
String uuid;
String filename;
int patchSetId;
CommentKey(PatchLineComment.Key k) {
uuid = k.get();
filename = k.getParentKey().getFileName();
patchSetId = k.getParentKey().getParentKey().get();
}
PatchLineComment.Key export(Change.Id changeId) {
return new PatchLineComment.Key(
new Patch.Key(
new PatchSet.Id(changeId, patchSetId),
filename),
uuid);
}
}
static class CommentRange {
int startLine;
int startChar;
int endLine;
int endChar;
CommentRange(com.google.gerrit.reviewdb.client.CommentRange cr) {
startLine = cr.getStartLine();
startChar = cr.getStartCharacter();
endLine = cr.getEndLine();
endChar = cr.getEndCharacter();
}
com.google.gerrit.reviewdb.client.CommentRange export() {
return new com.google.gerrit.reviewdb.client.CommentRange(
startLine, startChar, endLine, endChar);
}
}
static class Comment {
CommentKey key;
int lineNbr;
Identity author;
Timestamp writtenOn;
short side;
String message;
String parentUuid;
CommentRange range;
String tag;
String revId;
String serverId;
Comment(PatchLineComment plc, String serverId) {
key = new CommentKey(plc.getKey());
lineNbr = plc.getLine();
author = new Identity(plc.getAuthor());
writtenOn = plc.getWrittenOn();
side = plc.getSide();
message = plc.getMessage();
parentUuid = plc.getParentUuid();
range = plc.getRange() != null ? new CommentRange(plc.getRange()) : null;
tag = plc.getTag();
revId = plc.getRevId().get();
this.serverId = serverId;
}
PatchLineComment export(Change.Id changeId,
PatchLineComment.Status status) {
PatchLineComment plc = new PatchLineComment(
key.export(changeId), lineNbr, author.export(), parentUuid, writtenOn);
plc.setSide(side);
plc.setMessage(message);
if (range != null) {
plc.setRange(range.export());
}
plc.setTag(tag);
plc.setRevId(new RevId(revId));
plc.setStatus(status);
return plc;
}
}
String pushCert;
List<Comment> comments;
ImmutableList<PatchLineComment> exportComments(Change.Id changeId,
PatchLineComment.Status status) {
return ImmutableList.copyOf(
comments.stream()
.map(c -> c.export(changeId, status))
.collect(toList()));
}
}

View File

@ -39,6 +39,7 @@ import com.google.gerrit.common.Nullable;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
@ -47,10 +48,11 @@ import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.GerritPersonIdent;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.config.AnonymousCowardName;
import com.google.gerrit.server.config.GerritServerId;
import com.google.gerrit.server.git.ChainedReceiveCommands;
import com.google.gerrit.server.notedb.ChangeBundle;
import com.google.gerrit.server.notedb.ChangeBundleReader;
@ -128,6 +130,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
private final PersonIdent serverIdent;
private final ProjectCache projectCache;
private final String anonymousCowardName;
private final String serverId;
@Inject
ChangeRebuilderImpl(SchemaFactory<ReviewDb> schemaFactory,
@ -141,7 +144,8 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
PatchListCache patchListCache,
@GerritPersonIdent PersonIdent serverIdent,
@Nullable ProjectCache projectCache,
@AnonymousCowardName String anonymousCowardName) {
@AnonymousCowardName String anonymousCowardName,
@GerritServerId String serverId) {
super(schemaFactory);
this.accountCache = accountCache;
this.bundleReader = bundleReader;
@ -154,6 +158,7 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
this.serverIdent = serverIdent;
this.projectCache = projectCache;
this.anonymousCowardName = anonymousCowardName;
this.serverId = serverId;
}
@Override
@ -324,16 +329,15 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
new PatchSetEvent(change, ps, manager.getChangeRepo().rw);
patchSetEvents.put(ps.getId(), pse);
events.add(pse);
for (PatchLineComment c : getPatchLineComments(bundle, ps)) {
if (c.getStatus() == Status.PUBLISHED) {
CommentEvent e =
new CommentEvent(c, change, ps, patchListCache);
events.add(e.addDep(pse));
} else {
DraftCommentEvent e =
new DraftCommentEvent(c, change, ps, patchListCache);
draftCommentEvents.put(c.getAuthor(), e);
}
for (Comment c : getComments(bundle, serverId, Status.PUBLISHED, ps)) {
CommentEvent e =
new CommentEvent(c, change, ps, patchListCache);
events.add(e.addDep(pse));
}
for (Comment c : getComments(bundle, serverId, Status.DRAFT, ps)) {
DraftCommentEvent e =
new DraftCommentEvent(c, change, ps, patchListCache);
draftCommentEvents.put(c.author.getId(), e);
}
}
@ -403,11 +407,12 @@ public class ChangeRebuilderImpl extends ChangeRebuilder {
return minPsNum;
}
private static List<PatchLineComment> getPatchLineComments(ChangeBundle bundle,
final PatchSet ps) {
private static List<Comment> getComments(ChangeBundle bundle, String serverId,
PatchLineComment.Status status, PatchSet ps) {
return bundle.getPatchLineComments().stream()
.filter(c -> c.getPatchSetId().equals(ps.getId()))
.sorted(PatchLineCommentsUtil.PLC_ORDER)
.filter(c -> c.getPatchSetId().equals(ps.getId())
&& c.getStatus() == status)
.map(plc -> plc.asComment(serverId)).sorted(CommentsUtil.COMMENT_ORDER)
.collect(toList());
}

View File

@ -14,26 +14,27 @@
package com.google.gerrit.server.notedb.rebuild;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gwtorm.server.OrmException;
class CommentEvent extends Event {
public final PatchLineComment c;
public final Comment c;
private final Change change;
private final PatchSet ps;
private final PatchListCache cache;
CommentEvent(PatchLineComment c, Change change, PatchSet ps,
CommentEvent(Comment c, Change change, PatchSet ps,
PatchListCache cache) {
super(PatchLineCommentsUtil.getCommentPsId(c), c.getAuthor(),
c.getWrittenOn(), change.getCreatedOn(), c.getTag());
super(CommentsUtil.getCommentPsId(change.getId(), c), c.author.getId(),
c.writtenOn, change.getCreatedOn(), c.tag);
this.c = c;
this.change = change;
this.ps = ps;
@ -48,9 +49,9 @@ class CommentEvent extends Event {
@Override
void apply(ChangeUpdate update) throws OrmException {
checkUpdate(update);
if (c.getRevId() == null) {
if (c.revId == null) {
setCommentRevId(c, cache, change, ps);
}
update.putComment(c);
update.putComment(PatchLineComment.Status.PUBLISHED, c);
}
}

View File

@ -14,27 +14,27 @@
package com.google.gerrit.server.notedb.rebuild;
import static com.google.gerrit.server.PatchLineCommentsUtil.setCommentRevId;
import static com.google.gerrit.server.CommentsUtil.setCommentRevId;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.notedb.ChangeDraftUpdate;
import com.google.gerrit.server.notedb.ChangeUpdate;
import com.google.gerrit.server.patch.PatchListCache;
import com.google.gwtorm.server.OrmException;
class DraftCommentEvent extends Event {
public final PatchLineComment c;
public final Comment c;
private final Change change;
private final PatchSet ps;
private final PatchListCache cache;
DraftCommentEvent(PatchLineComment c, Change change, PatchSet ps,
DraftCommentEvent(Comment c, Change change, PatchSet ps,
PatchListCache cache) {
super(PatchLineCommentsUtil.getCommentPsId(c), c.getAuthor(),
c.getWrittenOn(), change.getCreatedOn(), c.getTag());
super(CommentsUtil.getCommentPsId(change.getId(), c), c.author.getId(),
c.writtenOn, change.getCreatedOn(), c.tag);
this.c = c;
this.change = change;
this.ps = ps;
@ -52,7 +52,7 @@ class DraftCommentEvent extends Event {
}
void applyDraft(ChangeDraftUpdate draftUpdate) throws OrmException {
if (c.getRevId() == null) {
if (c.revId == null) {
setCommentRevId(c, cache, change, ps);
}
draftUpdate.putComment(c);

View File

@ -22,8 +22,8 @@ import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
import com.google.gerrit.prettify.common.EditList;
import com.google.gerrit.prettify.common.SparseFileContent;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.server.mime.FileTypeRegistry;
import com.google.inject.Inject;
@ -283,8 +283,8 @@ class PatchScriptBuilder {
int lastLine;
lastLine = -1;
for (PatchLineComment plc : comments.getCommentsA()) {
final int a = plc.getLine();
for (Comment c : comments.getCommentsA()) {
final int a = c.lineNbr;
if (lastLine != a) {
final int b = mapA2B(a - 1);
if (0 <= b) {
@ -295,8 +295,8 @@ class PatchScriptBuilder {
}
lastLine = -1;
for (PatchLineComment plc : comments.getCommentsB()) {
final int b = plc.getLine();
for (Comment c : comments.getCommentsB()) {
int b = c.lineNbr;
if (lastLine != b) {
final int a = mapB2A(b - 1);
if (0 <= a) {

View File

@ -25,14 +25,14 @@ import com.google.gerrit.extensions.client.DiffPreferencesInfo.Whitespace;
import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.Patch.ChangeType;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.account.AccountInfoCacheFactory;
import com.google.gerrit.server.edit.ChangeEdit;
@ -88,7 +88,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
private final PatchListCache patchListCache;
private final ReviewDb db;
private final AccountInfoCacheFactory.Factory aicFactory;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final String fileName;
@Nullable
@ -118,7 +118,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
PatchListCache patchListCache,
ReviewDb db,
AccountInfoCacheFactory.Factory aicFactory,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
ChangeEditUtil editReader,
@Assisted ChangeControl control,
@Assisted final String fileName,
@ -132,7 +132,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
this.db = db;
this.control = control;
this.aicFactory = aicFactory;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.editReader = editReader;
this.fileName = fileName;
@ -151,7 +151,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
PatchListCache patchListCache,
ReviewDb db,
AccountInfoCacheFactory.Factory aicFactory,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
ChangeEditUtil editReader,
@Assisted ChangeControl control,
@Assisted String fileName,
@ -165,7 +165,7 @@ public class PatchScriptFactory implements Callable<PatchScript> {
this.db = db;
this.control = control;
this.aicFactory = aicFactory;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.editReader = editReader;
this.fileName = fileName;
@ -402,13 +402,14 @@ public class PatchScriptFactory implements Callable<PatchScript> {
private void loadPublished(final Map<Patch.Key, Patch> byKey,
final AccountInfoCacheFactory aic, final String file) throws OrmException {
ChangeNotes notes = control.getNotes();
for (PatchLineComment c : plcUtil.publishedByChangeFile(db, notes, changeId, file)) {
if (comments.include(c)) {
aic.want(c.getAuthor());
for (Comment c : commentsUtil.publishedByChangeFile(db, notes, changeId, file)) {
if (comments.include(change.getId(), c)) {
aic.want(c.author.getId());
}
final Patch.Key pKey = c.getKey().getParentKey();
final Patch p = byKey.get(pKey);
PatchSet.Id psId = new PatchSet.Id(change.getId(), c.key.patchSetId);
Patch.Key pKey = new Patch.Key(psId, c.key.filename);
Patch p = byKey.get(pKey);
if (p != null) {
p.setCommentCount(p.getCommentCount() + 1);
}
@ -418,14 +419,15 @@ public class PatchScriptFactory implements Callable<PatchScript> {
private void loadDrafts(final Map<Patch.Key, Patch> byKey,
final AccountInfoCacheFactory aic, final Account.Id me, final String file)
throws OrmException {
for (PatchLineComment c :
plcUtil.draftByChangeFileAuthor(db, control.getNotes(), file, me)) {
if (comments.include(c)) {
for (Comment c :
commentsUtil.draftByChangeFileAuthor(db, control.getNotes(), file, me)) {
if (comments.include(change.getId(), c)) {
aic.want(me);
}
final Patch.Key pKey = c.getKey().getParentKey();
final Patch p = byKey.get(pKey);
PatchSet.Id psId = new PatchSet.Id(change.getId(), c.key.patchSetId);
Patch.Key pKey = new Patch.Key(psId, c.key.filename);
Patch p = byKey.get(pKey);
if (p != null) {
p.setDraftCount(p.getDraftCount() + 1);
}

View File

@ -37,8 +37,8 @@ import com.google.gerrit.common.data.SubmitTypeRecord;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
import com.google.gerrit.reviewdb.client.Project;
@ -49,7 +49,7 @@ import com.google.gerrit.server.ApprovalsUtil;
import com.google.gerrit.server.ChangeMessagesUtil;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.PatchSetUtil;
import com.google.gerrit.server.ReviewerSet;
import com.google.gerrit.server.ReviewerStatusUpdate;
@ -319,7 +319,7 @@ public class ChangeData {
private final ChangeNotes.Factory notesFactory;
private final ApprovalsUtil approvalsUtil;
private final ChangeMessagesUtil cmUtil;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
private final PatchSetUtil psUtil;
private final PatchListCache patchListCache;
private final NotesMigration notesMigration;
@ -337,7 +337,7 @@ public class ChangeData {
private List<PatchSetApproval> currentApprovals;
private Map<Integer, List<String>> files;
private Map<Integer, Optional<PatchList>> patchLists;
private Collection<PatchLineComment> publishedComments;
private Collection<Comment> publishedComments;
private CurrentUser visibleTo;
private ChangeControl changeControl;
private List<ChangeMessage> messages;
@ -368,7 +368,7 @@ public class ChangeData {
ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
NotesMigration notesMigration,
@ -386,7 +386,7 @@ public class ChangeData {
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.notesMigration = notesMigration;
@ -406,7 +406,7 @@ public class ChangeData {
ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
NotesMigration notesMigration,
@ -423,7 +423,7 @@ public class ChangeData {
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.notesMigration = notesMigration;
@ -444,7 +444,7 @@ public class ChangeData {
ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
NotesMigration notesMigration,
@ -461,7 +461,7 @@ public class ChangeData {
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.notesMigration = notesMigration;
@ -483,7 +483,7 @@ public class ChangeData {
ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
NotesMigration notesMigration,
@ -500,7 +500,7 @@ public class ChangeData {
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.notesMigration = notesMigration;
@ -523,7 +523,7 @@ public class ChangeData {
ChangeNotes.Factory notesFactory,
ApprovalsUtil approvalsUtil,
ChangeMessagesUtil cmUtil,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
PatchSetUtil psUtil,
PatchListCache patchListCache,
NotesMigration notesMigration,
@ -542,7 +542,7 @@ public class ChangeData {
this.notesFactory = notesFactory;
this.approvalsUtil = approvalsUtil;
this.cmUtil = cmUtil;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.psUtil = psUtil;
this.patchListCache = patchListCache;
this.notesMigration = notesMigration;
@ -1002,13 +1002,13 @@ public class ChangeData {
return reviewerUpdates;
}
public Collection<PatchLineComment> publishedComments()
public Collection<Comment> publishedComments()
throws OrmException {
if (publishedComments == null) {
if (!lazyLoad) {
return Collections.emptyList();
}
publishedComments = plcUtil.publishedByChange(db, notes());
publishedComments = commentsUtil.publishedByChange(db, notes());
}
return publishedComments;
}
@ -1124,8 +1124,8 @@ public class ChangeData {
return Collections.emptySet();
}
draftsByUser = new HashSet<>();
for (PatchLineComment sc : plcUtil.draftByChange(db, notes)) {
draftsByUser.add(sc.getAuthor());
for (Comment sc : commentsUtil.draftByChange(db, notes)) {
draftsByUser.add(sc.author.getId());
}
}
return draftsByUser;

View File

@ -35,7 +35,7 @@ import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.StarredChangesUtil;
import com.google.gerrit.server.account.AccountCache;
import com.google.gerrit.server.account.AccountResolver;
@ -169,7 +169,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
final ChangeNotes.Factory notesFactory;
final ChangeData.Factory changeDataFactory;
final FieldDef.FillArgs fillArgs;
final PatchLineCommentsUtil plcUtil;
final CommentsUtil commentsUtil;
final AccountResolver accountResolver;
final GroupBackend groupBackend;
final AllProjectsName allProjectsName;
@ -203,7 +203,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
ChangeNotes.Factory notesFactory,
ChangeData.Factory changeDataFactory,
FieldDef.FillArgs fillArgs,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
AccountResolver accountResolver,
GroupBackend groupBackend,
AllProjectsName allProjectsName,
@ -223,7 +223,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
@GerritServerConfig Config cfg) {
this(db, queryProvider, rewriter, opFactories, userFactory, self,
capabilityControlFactory, changeControlGenericFactory, notesFactory,
changeDataFactory, fillArgs, plcUtil, accountResolver, groupBackend,
changeDataFactory, fillArgs, commentsUtil, accountResolver, groupBackend,
allProjectsName, allUsersName, patchListCache, repoManager,
projectCache, listChildProjects, submitDryRun, conflictsCache,
trackingFooters, indexes != null ? indexes.getSearchIndex() : null,
@ -243,7 +243,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
ChangeNotes.Factory notesFactory,
ChangeData.Factory changeDataFactory,
FieldDef.FillArgs fillArgs,
PatchLineCommentsUtil plcUtil,
CommentsUtil commentsUtil,
AccountResolver accountResolver,
GroupBackend groupBackend,
AllProjectsName allProjectsName,
@ -272,7 +272,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
this.changeControlGenericFactory = changeControlGenericFactory;
this.changeDataFactory = changeDataFactory;
this.fillArgs = fillArgs;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
this.accountResolver = accountResolver;
this.groupBackend = groupBackend;
this.allProjectsName = allProjectsName;
@ -296,7 +296,7 @@ public class ChangeQueryBuilder extends QueryBuilder<ChangeData> {
return new Arguments(db, queryProvider, rewriter, opFactories, userFactory,
Providers.of(otherUser),
capabilityControlFactory, changeControlGenericFactory, notesFactory,
changeDataFactory, fillArgs, plcUtil, accountResolver, groupBackend,
changeDataFactory, fillArgs, commentsUtil, accountResolver, groupBackend,
allProjectsName, allUsersName, patchListCache, repoManager,
projectCache, listChildProjects, submitDryRun,
conflictsCache, trackingFooters, index, indexConfig, listMembers,

View File

@ -16,7 +16,7 @@ package com.google.gerrit.server.query.change;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.server.index.change.ChangeField;
import com.google.gwtorm.server.OrmException;
@ -41,8 +41,8 @@ class CommentByPredicate extends ChangeIndexPredicate {
return true;
}
}
for (PatchLineComment c : cd.publishedComments()) {
if (Objects.equals(c.getAuthor(), id)) {
for (Comment c : cd.publishedComments()) {
if (Objects.equals(c.author.getId(), id)) {
return true;
}
}

View File

@ -41,7 +41,7 @@ class HasDraftByLegacyPredicate extends ChangeOperatorPredicate
@Override
public boolean match(final ChangeData object) throws OrmException {
return !args.plcUtil
return !args.commentsUtil
.draftByChangeAuthor(args.db.get(), object.notes(), accountId)
.isEmpty();
}
@ -49,7 +49,7 @@ class HasDraftByLegacyPredicate extends ChangeOperatorPredicate
@Override
public ResultSet<ChangeData> read() throws OrmException {
Set<Change.Id> ids = new HashSet<>();
for (Change.Id changeId : args.plcUtil
for (Change.Id changeId : args.commentsUtil
.changesWithDraftsByAuthor(args.db.get(), accountId)) {
ids.add(changeId);
}

View File

@ -307,8 +307,7 @@ public class OutputStreamQuery {
includeApprovals ? d.approvals().asMap() : null,
includeFiles, d.change(), labelTypes);
for (PatchSetAttribute attribute : c.patchSets) {
eventFactory.addPatchSetComments(
attribute, d.publishedComments());
eventFactory.addPatchSetComments(attribute, d.publishedComments());
}
}
}

View File

@ -25,12 +25,10 @@ import com.google.gerrit.metrics.DisabledMetricMaker;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.Patch;
import com.google.gerrit.reviewdb.client.PatchLineComment;
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.CurrentUser;
import com.google.gerrit.server.GerritPersonIdent;
@ -132,6 +130,10 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests {
@Inject
protected AbstractChangeNotes.Args args;
@Inject
@GerritServerId
private String serverId;
protected Injector injector;
private String systemTimeZone;
@ -250,30 +252,22 @@ public abstract class AbstractChangeNotesTest extends GerritBaseTests {
return label;
}
protected PatchLineComment newPublishedComment(PatchSet.Id psId,
String filename, String UUID, CommentRange range, int line,
IdentifiedUser commenter, String parentUUID, Timestamp t,
String message, short side, String commitSHA1) {
return newComment(psId, filename, UUID, range, line, commenter,
parentUUID, t, message, side, commitSHA1,
PatchLineComment.Status.PUBLISHED);
}
protected Comment newComment(PatchSet.Id psId, String filename, String UUID,
CommentRange range, int line, IdentifiedUser commenter, String parentUUID,
Timestamp t, String message, short side, String commitSHA1) {
Comment c = new Comment(
new Comment.Key(UUID, filename, psId.get()),
commenter.getAccountId(),
t,
side,
message,
serverId);
c.lineNbr = line;
c.parentUuid = parentUUID;
c.revId = commitSHA1;
c.setRange(range);
return c;
protected PatchLineComment newComment(PatchSet.Id psId,
String filename, String UUID, CommentRange range, int line,
IdentifiedUser commenter, String parentUUID, Timestamp t,
String message, short side, String commitSHA1,
PatchLineComment.Status status) {
PatchLineComment comment = new PatchLineComment(
new PatchLineComment.Key(
new Patch.Key(psId, filename), UUID),
line, commenter.getAccountId(), parentUUID, t);
comment.setSide(side);
comment.setMessage(message);
comment.setRange(range);
comment.setRevId(new RevId(commitSHA1));
comment.setStatus(status);
return comment;
}
protected static Timestamp truncate(Timestamp ts) {

View File

@ -39,8 +39,8 @@ import com.google.gerrit.reviewdb.client.Account;
import com.google.gerrit.reviewdb.client.Branch;
import com.google.gerrit.reviewdb.client.Change;
import com.google.gerrit.reviewdb.client.ChangeMessage;
import com.google.gerrit.reviewdb.client.Comment;
import com.google.gerrit.reviewdb.client.CommentRange;
import com.google.gerrit.reviewdb.client.PatchLineComment;
import com.google.gerrit.reviewdb.client.PatchLineComment.Status;
import com.google.gerrit.reviewdb.client.PatchSet;
import com.google.gerrit.reviewdb.client.PatchSetApproval;
@ -103,18 +103,19 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Change c = newChange();
RevCommit commit = tr.commit().message("PS2").create();
ChangeUpdate update = newUpdate(c, changeOwner);
update.putComment(newPublishedComment(c.currentPatchSetId(), "a.txt",
"uuid1", new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.putComment(Status.PUBLISHED,
newComment(c.currentPatchSetId(), "a.txt", "uuid1",
new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.setTag(tag);
update.commit();
ChangeNotes notes = newNotes(c);
ImmutableListMultimap<RevId, PatchLineComment> comments = notes.getComments();
ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
assertThat(comments).hasSize(1);
assertThat(
comments.entries().asList().get(0).getValue().getTag())
comments.entries().asList().get(0).getValue().tag)
.isEqualTo(tag);
}
@ -159,9 +160,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
RevCommit commit = tr.commit().message("PS2").create();
update = newUpdate(c, changeOwner);
update.putComment(newPublishedComment(c.currentPatchSetId(), "a.txt",
"uuid1", new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.putComment(Status.PUBLISHED,
newComment(c.currentPatchSetId(), "a.txt", "uuid1",
new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.setChangeMessage("coverage verification");
update.setTag(coverageTag);
update.commit();
@ -180,10 +182,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
assertThat(approval.getTag()).isEqualTo(integrationTag);
assertThat(approval.getValue()).isEqualTo(-1);
ImmutableListMultimap<RevId, PatchLineComment> comments =
notes.getComments();
ImmutableListMultimap<RevId, Comment> comments = notes.getComments();
assertThat(comments).hasSize(1);
assertThat(comments.entries().asList().get(0).getValue().getTag())
assertThat(comments.entries().asList().get(0).getValue().tag)
.isEqualTo(coverageTag);
ImmutableList<ChangeMessage> messages = notes.getChangeMessages();
@ -923,9 +924,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update.setPatchSetState(PatchSetState.DRAFT);
update.putApproval("Code-Review", (short) 1);
update.setChangeMessage("This is a message");
update.putComment(newPublishedComment(c.currentPatchSetId(), "a.txt",
"uuid1", new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.putComment(Status.PUBLISHED,
newComment(c.currentPatchSetId(), "a.txt", "uuid1",
new CommentRange(1, 2, 3, 4), 1, changeOwner, null,
TimeUtil.nowTs(), "Comment", (short) 1, commit.name()));
update.commit();
ChangeNotes notes = newNotes(c);
@ -1022,9 +1024,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, changeOwner);
update.setPatchSetId(psId2);
Timestamp ts = TimeUtil.nowTs();
update.putComment(newPublishedComment(psId2, "a.txt",
"uuid1", new CommentRange(1, 2, 3, 4), 1, changeOwner, null, ts,
"Comment", (short) 1, commit.name()));
update.putComment(Status.PUBLISHED,
newComment(psId2, "a.txt", "uuid1", new CommentRange(1, 2, 3, 4), 1,
changeOwner, null, ts, "Comment", (short) 1, commit.name()));
update.commit();
notes = newNotes(c);
@ -1102,11 +1104,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
RevCommit tipCommit;
try (NoteDbUpdateManager updateManager =
updateManagerFactory.create(project)) {
PatchLineComment comment1 = newPublishedComment(psId, "file1",
Comment comment1 = newComment(psId, "file1",
uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1,
(short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234");
update1.setPatchSetId(psId);
update1.putComment(comment1);
update1.putComment(Status.PUBLISHED, comment1);
updateManager.add(update1);
ChangeUpdate update2 = newUpdate(c, otherUser);
@ -1329,11 +1331,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
PatchSet.Id psId = c.currentPatchSetId();
RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
PatchLineComment comment = newPublishedComment(psId, "file1",
Comment comment = newComment(psId, "file1",
"uuid", null, 0, otherUser, null,
TimeUtil.nowTs(), "message", (short) 1, revId.get());
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1349,11 +1351,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
CommentRange range = new CommentRange(1, 0, 2, 0);
PatchLineComment comment = newPublishedComment(psId, "file1",
Comment comment = newComment(psId, "file1",
"uuid", range, range.getEndLine(), otherUser, null,
TimeUtil.nowTs(), "message", (short) 1, revId.get());
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1369,11 +1371,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
CommentRange range = new CommentRange(0, 0, 0, 0);
PatchLineComment comment = newPublishedComment(psId, "file",
Comment comment = newComment(psId, "file",
"uuid", range, range.getEndLine(), otherUser, null,
TimeUtil.nowTs(), "message", (short) 1, revId.get());
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1389,11 +1391,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
RevId revId = new RevId("abcd1234abcd1234abcd1234abcd1234abcd1234");
CommentRange range = new CommentRange(1, 2, 3, 4);
PatchLineComment comment = newPublishedComment(psId, "",
"uuid", range, range.getEndLine(), otherUser, null,
TimeUtil.nowTs(), "message", (short) 1, revId.get());
Comment comment = newComment(psId, "", "uuid", range, range.getEndLine(),
otherUser, null, TimeUtil.nowTs(), "message", (short) 1, revId.get());
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1417,29 +1418,29 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp time3 = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment comment1 = newPublishedComment(psId, "file1",
uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1,
(short) 1, "abcd1234abcd1234abcd1234abcd1234abcd1234");
Comment comment1 = newComment(psId, "file1", uuid1, range1,
range1.getEndLine(), otherUser, null, time1, message1, (short) 1,
"abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
update = newUpdate(c, otherUser);
CommentRange range2 = new CommentRange(2, 1, 3, 1);
PatchLineComment comment2 = newPublishedComment(psId, "file1",
uuid2, range2, range2.getEndLine(), otherUser, null, time2, message2,
(short) 1, "abcd1234abcd1234abcd1234abcd1234abcd1234");
Comment comment2 = newComment(psId, "file1", uuid2, range2,
range2.getEndLine(), otherUser, null, time2, message2, (short) 1,
"abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
update = newUpdate(c, otherUser);
CommentRange range3 = new CommentRange(3, 0, 4, 1);
PatchLineComment comment3 = newPublishedComment(psId, "file2",
uuid3, range3, range3.getEndLine(), otherUser, null, time3, message3,
(short) 1, "abcd1234abcd1234abcd1234abcd1234abcd1234");
Comment comment3 = newComment(psId, "file2", uuid3, range3,
range3.getEndLine(), otherUser, null, time3, message3, (short) 1,
"abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment3);
update.putComment(Status.PUBLISHED, comment3);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1500,20 +1501,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp time2 = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment comment1 = newPublishedComment(psId, "file1",
Comment comment1 = newComment(psId, "file1",
uuid1, range1, range1.getEndLine(), otherUser, null, time1, message1,
(short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
update = newUpdate(c, otherUser);
CommentRange range2 = new CommentRange(2, 1, 3, 1);
PatchLineComment comment2 = newPublishedComment(psId, "file1",
Comment comment2 = newComment(psId, "file1",
uuid2, range2, range2.getEndLine(), otherUser, null, time2, message2,
(short) 0, "abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1570,21 +1571,21 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
PatchSet.Id psId1 = c.currentPatchSetId();
PatchSet.Id psId2 = new PatchSet.Id(c.getId(), psId1.get() + 1);
PatchLineComment comment1 = newPublishedComment(psId1, "file1",
uuid1, range1, range1.getEndLine(), otherUser, null, time, message1,
(short) 0, revId.get());
PatchLineComment comment2 = newPublishedComment(psId1, "file1",
uuid2, range2, range2.getEndLine(), otherUser, null, time, message2,
(short) 0, revId.get());
PatchLineComment comment3 = newPublishedComment(psId2, "file1",
uuid3, range1, range1.getEndLine(), otherUser, null, time, message3,
(short) 0, revId.get());
Comment comment1 =
newComment(psId1, "file1", uuid1, range1, range1.getEndLine(),
otherUser, null, time, message1, (short) 0, revId.get());
Comment comment2 =
newComment(psId1, "file1", uuid2, range2, range2.getEndLine(),
otherUser, null, time, message2, (short) 0, revId.get());
Comment comment3 =
newComment(psId2, "file1", uuid3, range1, range1.getEndLine(),
otherUser, null, time, message3, (short) 0, revId.get());
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(psId2);
update.putComment(comment3);
update.putComment(comment2);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment3);
update.putComment(Status.PUBLISHED, comment2);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1654,11 +1655,11 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp time = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment comment = newPublishedComment(psId, "file1",
uuid, range, range.getEndLine(), user, null, time, "comment",
(short) 1, "abcd1234abcd1234abcd1234abcd1234abcd1234");
Comment comment = newComment(psId, "file1", uuid, range, range.getEndLine(),
user, null, time, "comment", (short) 1,
"abcd1234abcd1234abcd1234abcd1234abcd1234");
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1690,7 +1691,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
}
}
assertThat(notes.getComments())
.isEqualTo(ImmutableMultimap.of(comment.getRevId(), comment));
.isEqualTo(ImmutableMultimap.of(new RevId(comment.revId), comment));
}
@Test
@ -1708,21 +1709,20 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp now = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment commentForBase =
newPublishedComment(psId, "filename", uuid1,
range, range.getEndLine(), otherUser, null, now, messageForBase,
(short) 0, rev1);
Comment commentForBase =
newComment(psId, "filename", uuid1, range, range.getEndLine(),
otherUser, null, now, messageForBase, (short) 0, rev1);
update.setPatchSetId(psId);
update.putComment(commentForBase);
update.putComment(Status.PUBLISHED, commentForBase);
update.commit();
update = newUpdate(c, otherUser);
PatchLineComment commentForPS =
newPublishedComment(psId, "filename", uuid2,
range, range.getEndLine(), otherUser, null, now, messageForPS,
Comment commentForPS =
newComment(psId, "filename", uuid2, range, range.getEndLine(),
otherUser, null, now, messageForPS,
(short) 1, rev2);
update.setPatchSetId(psId);
update.putComment(commentForPS);
update.putComment(Status.PUBLISHED, commentForPS);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -1745,19 +1745,19 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp timeForComment1 = TimeUtil.nowTs();
Timestamp timeForComment2 = TimeUtil.nowTs();
PatchLineComment comment1 = newPublishedComment(psId, filename,
uuid1, range, range.getEndLine(), otherUser, null, timeForComment1,
"comment 1", side, rev);
Comment comment1 =
newComment(psId, filename, uuid1, range, range.getEndLine(), otherUser,
null, timeForComment1, "comment 1", side, rev);
update.setPatchSetId(psId);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
update = newUpdate(c, otherUser);
PatchLineComment comment2 = newPublishedComment(psId, filename,
uuid2, range, range.getEndLine(), otherUser, null, timeForComment2,
"comment 2", side, rev);
Comment comment2 =
newComment(psId, filename, uuid2, range, range.getEndLine(), otherUser,
null, timeForComment2, "comment 2", side, rev);
update.setPatchSetId(psId);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -1780,19 +1780,19 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newPublishedComment(psId, filename1,
Comment comment1 = newComment(psId, filename1,
uuid, range, range.getEndLine(), otherUser, null, now, "comment 1",
side, rev);
update.setPatchSetId(psId);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
update = newUpdate(c, otherUser);
PatchLineComment comment2 = newPublishedComment(psId, filename2,
Comment comment2 = newComment(psId, filename2,
uuid, range, range.getEndLine(), otherUser, null, now, "comment 2",
side, rev);
update.setPatchSetId(psId);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -1814,11 +1814,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newPublishedComment(ps1, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps1",
side, rev1);
Comment comment1 = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side, rev1);
update.setPatchSetId(ps1);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
incrementPatchSet(c);
@ -1826,11 +1825,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
now = TimeUtil.nowTs();
PatchLineComment comment2 = newPublishedComment(ps2, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps2",
side, rev2);
Comment comment2 = newComment(ps2, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps2", side, rev2);
update.setPatchSetId(ps2);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -1851,11 +1849,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side,
rev, Status.DRAFT);
Comment comment1 = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side, rev);
update.setPatchSetId(ps1);
update.putComment(comment1);
update.putComment(Status.DRAFT, comment1);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1863,10 +1860,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ImmutableMultimap.of(new RevId(rev), comment1));
assertThat(notes.getComments()).isEmpty();
comment1.setStatus(Status.PUBLISHED);
update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
notes = newNotes(c);
@ -1892,14 +1888,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
// Write two drafts on the same side of one patch set.
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(psId);
PatchLineComment comment1 = newComment(psId, filename, uuid1,
range1, range1.getEndLine(), otherUser, null, now, "comment on ps1",
side, rev, Status.DRAFT);
PatchLineComment comment2 = newComment(psId, filename, uuid2,
range2, range2.getEndLine(), otherUser, null, now, "other on ps1",
side, rev, Status.DRAFT);
update.putComment(comment1);
update.putComment(comment2);
Comment comment1 = newComment(psId, filename, uuid1, range1,
range1.getEndLine(), otherUser, null, now, "comment on ps1", side, rev);
Comment comment2 = newComment(psId, filename, uuid2, range2,
range2.getEndLine(), otherUser, null, now, "other on ps1", side, rev);
update.putComment(Status.DRAFT, comment1);
update.putComment(Status.DRAFT, comment2);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1912,8 +1906,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
// Publish first draft.
update = newUpdate(c, otherUser);
update.setPatchSetId(psId);
comment1.setStatus(Status.PUBLISHED);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
notes = newNotes(c);
@ -1940,15 +1933,15 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
// Write two drafts, one on each side of the patchset.
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(psId);
PatchLineComment baseComment = newComment(psId, filename, uuid1,
range1, range1.getEndLine(), otherUser, null, now, "comment on base",
(short) 0, rev1, Status.DRAFT);
PatchLineComment psComment = newComment(psId, filename, uuid2,
range2, range2.getEndLine(), otherUser, null, now, "comment on ps",
(short) 1, rev2, Status.DRAFT);
Comment baseComment =
newComment(psId, filename, uuid1, range1, range1.getEndLine(),
otherUser, null, now, "comment on base", (short) 0, rev1);
Comment psComment =
newComment(psId, filename, uuid2, range2, range2.getEndLine(),
otherUser, null, now, "comment on ps", (short) 1, rev2);
update.putComment(baseComment);
update.putComment(psComment);
update.putComment(Status.DRAFT, baseComment);
update.putComment(Status.DRAFT, psComment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -1962,10 +1955,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
update.setPatchSetId(psId);
baseComment.setStatus(Status.PUBLISHED);
psComment.setStatus(Status.PUBLISHED);
update.putComment(baseComment);
update.putComment(psComment);
update.putComment(Status.PUBLISHED, baseComment);
update.putComment(Status.PUBLISHED, psComment);
update.commit();
notes = newNotes(c);
@ -1989,11 +1980,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment = newComment(psId, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side,
rev, Status.DRAFT);
Comment comment = newComment(psId, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side, rev);
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.DRAFT, comment);
update.commit();
ChangeNotes notes = newNotes(c);
@ -2028,11 +2018,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newComment(ps1, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps1",
side, rev1, Status.DRAFT);
Comment comment1 = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side, rev1);
update.setPatchSetId(ps1);
update.putComment(comment1);
update.putComment(Status.DRAFT, comment1);
update.commit();
incrementPatchSet(c);
@ -2040,11 +2029,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
now = TimeUtil.nowTs();
PatchLineComment comment2 = newComment(ps2, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps2",
side, rev2, Status.DRAFT);
Comment comment2 = newComment(ps2, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps2", side, rev2);
update.setPatchSetId(ps2);
update.putComment(comment2);
update.putComment(Status.DRAFT, comment2);
update.commit();
ChangeNotes notes = newNotes(c);
@ -2076,10 +2064,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side,
rev, Status.PUBLISHED);
update.putComment(comment);
Comment comment = newComment(ps1, filename, uuid, range, range.getEndLine(),
otherUser, null, now, "comment on ps1", side, rev);
update.putComment(Status.PUBLISHED, comment);
update.commit();
assertThat(repo.exactRef(changeMetaRef(c.getId()))).isNotNull();
@ -2099,10 +2086,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment draft = newComment(ps1, filename, "uuid1", range,
range.getEndLine(), otherUser, null, now, "draft comment on ps1", side,
rev, Status.DRAFT);
update.putComment(draft);
Comment draft =
newComment(ps1, filename, "uuid1", range, range.getEndLine(), otherUser,
null, now, "draft comment on ps1", side, rev);
update.putComment(Status.DRAFT, draft);
update.commit();
String draftRef = refsDraftComments(c.getId(), otherUser.getAccountId());
@ -2110,10 +2097,9 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
assertThat(old).isNotNull();
update = newUpdate(c, otherUser);
PatchLineComment pub = newComment(ps1, filename, "uuid2", range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side,
rev, Status.PUBLISHED);
update.putComment(pub);
Comment pub = newComment(ps1, filename, "uuid2", range, range.getEndLine(),
otherUser, null, now, "comment on ps1", side, rev);
update.putComment(Status.PUBLISHED, pub);
update.commit();
assertThat(exactRefAllUsers(draftRef)).isEqualTo(old);
@ -2129,11 +2115,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp now = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment comment = newPublishedComment(
psId, "filename", uuid, null, 0, otherUser, null, now, messageForBase,
(short) 0, rev);
Comment comment = newComment(psId, "filename", uuid, null, 0, otherUser,
null, now, messageForBase, (short) 0, rev);
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -2150,11 +2135,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
Timestamp now = TimeUtil.nowTs();
PatchSet.Id psId = c.currentPatchSetId();
PatchLineComment comment = newPublishedComment(
psId, "filename", uuid, null, 1, otherUser, null, now, messageForBase,
(short) 0, rev);
Comment comment = newComment(psId, "filename", uuid, null, 1, otherUser,
null, now, messageForBase, (short) 0, rev);
update.setPatchSetId(psId);
update.putComment(comment);
update.putComment(Status.PUBLISHED, comment);
update.commit();
assertThat(newNotes(c).getComments()).containsExactlyEntriesIn(
@ -2178,14 +2162,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(ps2);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newComment(ps1, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps1",
side, rev1, Status.DRAFT);
PatchLineComment comment2 = newComment(ps2, filename,
uuid, range, range.getEndLine(), otherUser, null, now, "comment on ps2",
side, rev2, Status.DRAFT);
update.putComment(comment1);
update.putComment(comment2);
Comment comment1 = newComment(ps1, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps1", side, rev1);
Comment comment2 = newComment(ps2, filename, uuid, range,
range.getEndLine(), otherUser, null, now, "comment on ps2", side, rev2);
update.putComment(Status.DRAFT, comment1);
update.putComment(Status.DRAFT, comment2);
update.commit();
ChangeNotes notes = newNotes(c);
@ -2194,10 +2176,8 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
update.setPatchSetId(ps2);
comment1.setStatus(Status.PUBLISHED);
comment2.setStatus(Status.PUBLISHED);
update.putComment(comment1);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment1);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
notes = newNotes(c);
@ -2216,14 +2196,12 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newComment(ps1, "file1",
"uuid1", range, range.getEndLine(), otherUser, null, now, "comment1",
side, rev1.get(), Status.DRAFT);
PatchLineComment comment2 = newComment(ps1, "file2",
"uuid2", range, range.getEndLine(), otherUser, null, now, "comment2",
side, rev1.get(), Status.DRAFT);
update.putComment(comment1);
update.putComment(comment2);
Comment comment1 = newComment(ps1, "file1", "uuid1", range,
range.getEndLine(), otherUser, null, now, "comment1", side, rev1.get());
Comment comment2 = newComment(ps1, "file2", "uuid2", range,
range.getEndLine(), otherUser, null, now, "comment2", side, rev1.get());
update.putComment(Status.DRAFT, comment1);
update.putComment(Status.DRAFT, comment2);
update.commit();
ChangeNotes notes = newNotes(c);
@ -2233,8 +2211,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
comment2.setStatus(Status.PUBLISHED);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
notes = newNotes(c);
@ -2269,14 +2246,14 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
ChangeUpdate update = newUpdate(c, otherUser);
Timestamp now = TimeUtil.nowTs();
PatchLineComment comment1 = newComment(ps1, "file1",
"uuid1", range, range.getEndLine(), otherUser, null, now, "comment on ps1",
side, rev1.get(), Status.DRAFT);
PatchLineComment comment2 = newComment(ps1, "file2",
"uuid2", range, range.getEndLine(), otherUser, null, now, "another comment",
side, rev1.get(), Status.DRAFT);
update.putComment(comment1);
update.putComment(comment2);
Comment comment1 =
newComment(ps1, "file1", "uuid1", range, range.getEndLine(), otherUser,
null, now, "comment on ps1", side, rev1.get());
Comment comment2 =
newComment(ps1, "file2", "uuid2", range, range.getEndLine(), otherUser,
null, now, "another comment", side, rev1.get());
update.putComment(Status.DRAFT, comment1);
update.putComment(Status.DRAFT, comment2);
update.commit();
String refName = refsDraftComments(c.getId(), otherUserId);
@ -2284,8 +2261,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
comment2.setStatus(Status.PUBLISHED);
update.putComment(comment2);
update.putComment(Status.PUBLISHED, comment2);
update.commit();
assertThat(exactRefAllUsers(refName)).isNotNull();
assertThat(exactRefAllUsers(refName)).isNotEqualTo(oldDraftId);
@ -2295,7 +2271,6 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
// non-atomically after adding the published comment succeeded.
ChangeDraftUpdate draftUpdate =
newUpdate(c, otherUser).createDraftUpdateIfNull();
comment2.setStatus(Status.DRAFT);
draftUpdate.putComment(comment2);
try (NoteDbUpdateManager manager =
updateManagerFactory.create(c.getProject())) {
@ -2308,8 +2283,6 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
assertThat(draftNotes.load().getComments().get(rev1))
.containsExactly(comment1, comment2);
comment2.setStatus(Status.PUBLISHED); // Reset for later assertions.
// Zombie comment is filtered out of drafts via ChangeNotes.
ChangeNotes notes = newNotes(c);
assertThat(notes.getDraftComments(otherUserId).get(rev1))
@ -2319,8 +2292,7 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
update = newUpdate(c, otherUser);
update.setPatchSetId(ps1);
comment1.setStatus(Status.PUBLISHED);
update.putComment(comment1);
update.putComment(Status.PUBLISHED, comment1);
update.commit();
// Updating an unrelated comment causes the zombie comment to get fixed up.
@ -2334,18 +2306,16 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
String rev = "abcd1234abcd1234abcd1234abcd1234abcd1234";
ChangeUpdate update1 = newUpdate(c, otherUser);
PatchLineComment comment1 = newComment(c.currentPatchSetId(), "filename",
Comment comment1 = newComment(c.currentPatchSetId(), "filename",
"uuid1", range, range.getEndLine(), otherUser, null,
new Timestamp(update1.getWhen().getTime()), "comment 1", (short) 1, rev,
Status.PUBLISHED);
update1.putComment(comment1);
new Timestamp(update1.getWhen().getTime()), "comment 1", (short) 1, rev);
update1.putComment(Status.PUBLISHED, comment1);
ChangeUpdate update2 = newUpdate(c, otherUser);
PatchLineComment comment2 = newComment(c.currentPatchSetId(), "filename",
Comment comment2 = newComment(c.currentPatchSetId(), "filename",
"uuid2", range, range.getEndLine(), otherUser, null,
new Timestamp(update2.getWhen().getTime()), "comment 2", (short) 1, rev,
Status.PUBLISHED);
update2.putComment(comment2);
new Timestamp(update2.getWhen().getTime()), "comment 2", (short) 1, rev);
update2.putComment(Status.PUBLISHED, comment2);
try (NoteDbUpdateManager manager = updateManagerFactory.create(project)) {
manager.add(update1);
@ -2354,10 +2324,10 @@ public class ChangeNotesTest extends AbstractChangeNotesTest {
}
ChangeNotes notes = newNotes(c);
List<PatchLineComment> comments = notes.getComments().get(new RevId(rev));
List<Comment> comments = notes.getComments().get(new RevId(rev));
assertThat(comments).hasSize(2);
assertThat(comments.get(0).getMessage()).isEqualTo("comment 1");
assertThat(comments.get(1).getMessage()).isEqualTo("comment 2");
assertThat(comments.get(0).message).isEqualTo("comment 1");
assertThat(comments.get(1).message).isEqualTo("comment 2");
}
private boolean testJson() {

View File

@ -24,7 +24,7 @@ import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.reviewdb.server.ReviewDbUtil;
import com.google.gerrit.server.PatchLineCommentsUtil;
import com.google.gerrit.server.CommentsUtil;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.notedb.ChangeBundle;
import com.google.gerrit.server.notedb.ChangeBundleReader;
@ -57,7 +57,7 @@ public class NoteDbChecker {
private final ChangeBundleReader bundleReader;
private final ChangeNotes.Factory notesFactory;
private final ChangeRebuilder changeRebuilder;
private final PatchLineCommentsUtil plcUtil;
private final CommentsUtil commentsUtil;
@Inject
NoteDbChecker(Provider<ReviewDb> dbProvider,
@ -66,14 +66,14 @@ public class NoteDbChecker {
ChangeBundleReader bundleReader,
ChangeNotes.Factory notesFactory,
ChangeRebuilder changeRebuilder,
PatchLineCommentsUtil plcUtil) {
CommentsUtil commentsUtil) {
this.dbProvider = dbProvider;
this.repoManager = repoManager;
this.bundleReader = bundleReader;
this.notesMigration = notesMigration;
this.notesFactory = notesFactory;
this.changeRebuilder = changeRebuilder;
this.plcUtil = plcUtil;
this.commentsUtil = commentsUtil;
}
public void rebuildAndCheckAllChanges() throws Exception {
@ -157,7 +157,7 @@ public class NoteDbChecker {
ChangeBundle actual;
try {
actual = ChangeBundle.fromNotes(
plcUtil, notesFactory.create(db, c.getProject(), c.getId()));
commentsUtil, notesFactory.create(db, c.getProject(), c.getId()));
} catch (Throwable t) {
String msg = "Error converting change: " + c;
msgs.add(msg);