Add the context-padding parameter to the comment context
This parameter allows padding the context lines with extra lines before and after the comment range. This parameter works only if the enable-context parameter is set to true. This change is backward compatible: if the new parameter is not set or set to zero, only the lines of the comment range are returned. Change-Id: I2d44fb852c68ba484cbf94adff912b7ee522f9c5
This commit is contained in:
		| @@ -2056,6 +2056,10 @@ If the `enable-context` request parameter is set to true, the comment entries | |||||||
| will contain a list of link:#context-line[ContextLine] containing the lines of | will contain a list of link:#context-line[ContextLine] containing the lines of | ||||||
| the source file where the comment was written. | the source file where the comment was written. | ||||||
|  |  | ||||||
|  | The `context-padding` request parameter can be used to specify an extra number | ||||||
|  | of context lines to be added before and after the comment range. This parameter | ||||||
|  | only works if `enable-context` is set to true. | ||||||
|  |  | ||||||
| .Request | .Request | ||||||
| ---- | ---- | ||||||
|   GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/comments HTTP/1.0 |   GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/comments HTTP/1.0 | ||||||
|   | |||||||
| @@ -413,6 +413,7 @@ public interface ChangeApi { | |||||||
|  |  | ||||||
|   abstract class CommentsRequest { |   abstract class CommentsRequest { | ||||||
|     private boolean enableContext; |     private boolean enableContext; | ||||||
|  |     private int contextPadding; | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * Get all published comments on a change. |      * Get all published comments on a change. | ||||||
| @@ -436,6 +437,11 @@ public interface ChangeApi { | |||||||
|       return this; |       return this; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public CommentsRequest contextPadding(int contextPadding) { | ||||||
|  |       this.contextPadding = contextPadding; | ||||||
|  |       return this; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public CommentsRequest withContext() { |     public CommentsRequest withContext() { | ||||||
|       this.enableContext = true; |       this.enableContext = true; | ||||||
|       return this; |       return this; | ||||||
| @@ -444,6 +450,10 @@ public interface ChangeApi { | |||||||
|     public boolean getContext() { |     public boolean getContext() { | ||||||
|       return enableContext; |       return enableContext; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     public int getContextPadding() { | ||||||
|  |       return contextPadding; | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   abstract class SuggestedReviewersRequest { |   abstract class SuggestedReviewersRequest { | ||||||
|   | |||||||
| @@ -612,6 +612,7 @@ class ChangeApiImpl implements ChangeApi { | |||||||
|         try { |         try { | ||||||
|           ListChangeComments listComments = listCommentsProvider.get(); |           ListChangeComments listComments = listCommentsProvider.get(); | ||||||
|           listComments.setContext(this.getContext()); |           listComments.setContext(this.getContext()); | ||||||
|  |           listComments.setContextPadding(this.getContextPadding()); | ||||||
|           return listComments.apply(change).value(); |           return listComments.apply(change).value(); | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|           throw asRestApiException("Cannot get comments", e); |           throw asRestApiException("Cannot get comments", e); | ||||||
| @@ -623,6 +624,7 @@ class ChangeApiImpl implements ChangeApi { | |||||||
|         try { |         try { | ||||||
|           ListChangeComments listComments = listCommentsProvider.get(); |           ListChangeComments listComments = listCommentsProvider.get(); | ||||||
|           listComments.setContext(this.getContext()); |           listComments.setContext(this.getContext()); | ||||||
|  |           listComments.setContextPadding(this.getContextPadding()); | ||||||
|           return listComments.getComments(change); |           return listComments.getComments(change); | ||||||
|         } catch (Exception e) { |         } catch (Exception e) { | ||||||
|           throw asRestApiException("Cannot get comments", e); |           throw asRestApiException("Cannot get comments", e); | ||||||
|   | |||||||
| @@ -58,7 +58,7 @@ public class CommentContextCacheImpl implements CommentContextCache { | |||||||
|       @Override |       @Override | ||||||
|       protected void configure() { |       protected void configure() { | ||||||
|         persist(CACHE_NAME, CommentContextKey.class, CommentContext.class) |         persist(CACHE_NAME, CommentContextKey.class, CommentContext.class) | ||||||
|             .version(1) |             .version(2) | ||||||
|             .diskLimit(1 << 30) // limit the total cache size to 1 GB |             .diskLimit(1 << 30) // limit the total cache size to 1 GB | ||||||
|             .maximumWeight(1 << 23) // Limit the size of the in-memory cache to 8 MB |             .maximumWeight(1 << 23) // Limit the size of the in-memory cache to 8 MB | ||||||
|             .weigher(CommentContextWeigher.class) |             .weigher(CommentContextWeigher.class) | ||||||
| @@ -220,7 +220,7 @@ public class CommentContextCacheImpl implements CommentContextCache { | |||||||
|       Map<ContextInput, CommentContextKey> commentsToKeys = new HashMap<>(); |       Map<ContextInput, CommentContextKey> commentsToKeys = new HashMap<>(); | ||||||
|       for (CommentContextKey key : keys) { |       for (CommentContextKey key : keys) { | ||||||
|         Comment comment = getCommentForKey(humanComments, key); |         Comment comment = getCommentForKey(humanComments, key); | ||||||
|         commentsToKeys.put(ContextInput.fromComment(comment), key); |         commentsToKeys.put(ContextInput.fromComment(comment, key.contextPadding()), key); | ||||||
|       } |       } | ||||||
|       Map<ContextInput, CommentContext> allContext = loader.getContext(commentsToKeys.keySet()); |       Map<ContextInput, CommentContext> allContext = loader.getContext(commentsToKeys.keySet()); | ||||||
|       return allContext.entrySet().stream() |       return allContext.entrySet().stream() | ||||||
|   | |||||||
| @@ -28,6 +28,9 @@ public abstract class CommentContextKey { | |||||||
|  |  | ||||||
|   abstract Integer patchset(); |   abstract Integer patchset(); | ||||||
|  |  | ||||||
|  |   /** Number of extra lines of context that should be added before and after the comment range. */ | ||||||
|  |   abstract int contextPadding(); | ||||||
|  |  | ||||||
|   abstract Builder toBuilder(); |   abstract Builder toBuilder(); | ||||||
|  |  | ||||||
|   public static Builder builder() { |   public static Builder builder() { | ||||||
| @@ -47,6 +50,8 @@ public abstract class CommentContextKey { | |||||||
|  |  | ||||||
|     public abstract Builder patchset(Integer patchset); |     public abstract Builder patchset(Integer patchset); | ||||||
|  |  | ||||||
|  |     public abstract Builder contextPadding(Integer numLines); | ||||||
|  |  | ||||||
|     public abstract CommentContextKey build(); |     public abstract CommentContextKey build(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -62,6 +67,7 @@ public abstract class CommentContextKey { | |||||||
|               .setPatchset(key.patchset()) |               .setPatchset(key.patchset()) | ||||||
|               .setPathHash(key.path()) |               .setPathHash(key.path()) | ||||||
|               .setCommentId(key.id()) |               .setCommentId(key.id()) | ||||||
|  |               .setContextPadding(key.contextPadding()) | ||||||
|               .build()); |               .build()); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -75,6 +81,7 @@ public abstract class CommentContextKey { | |||||||
|           .patchset(proto.getPatchset()) |           .patchset(proto.getPatchset()) | ||||||
|           .id(proto.getCommentId()) |           .id(proto.getCommentId()) | ||||||
|           .path(proto.getPathHash()) |           .path(proto.getPathHash()) | ||||||
|  |           .contextPadding(proto.getContextPadding()) | ||||||
|           .build(); |           .build(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -98,15 +98,20 @@ public class CommentContextLoader { | |||||||
|             case COMMIT_MSG: |             case COMMIT_MSG: | ||||||
|               result.put( |               result.put( | ||||||
|                   contextInput, |                   contextInput, | ||||||
|                   getContextForCommitMessage(rw.getObjectReader(), commit, range.get())); |                   getContextForCommitMessage( | ||||||
|  |                       rw.getObjectReader(), commit, range.get(), contextInput.contextPadding())); | ||||||
|               break; |               break; | ||||||
|             case MERGE_LIST: |             case MERGE_LIST: | ||||||
|               result.put( |               result.put( | ||||||
|                   contextInput, getContextForMergeList(rw.getObjectReader(), commit, range.get())); |                   contextInput, | ||||||
|  |                   getContextForMergeList( | ||||||
|  |                       rw.getObjectReader(), commit, range.get(), contextInput.contextPadding())); | ||||||
|               break; |               break; | ||||||
|             default: |             default: | ||||||
|               result.put( |               result.put( | ||||||
|                   contextInput, getContextForFilePath(repo, rw, commit, filePath, range.get())); |                   contextInput, | ||||||
|  |                   getContextForFilePath( | ||||||
|  |                       repo, rw, commit, filePath, range.get(), contextInput.contextPadding())); | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -115,20 +120,27 @@ public class CommentContextLoader { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   private CommentContext getContextForCommitMessage( |   private CommentContext getContextForCommitMessage( | ||||||
|       ObjectReader reader, RevCommit commit, Range range) throws IOException { |       ObjectReader reader, RevCommit commit, Range commentRange, int contextPadding) | ||||||
|  |       throws IOException { | ||||||
|     Text text = Text.forCommit(reader, commit); |     Text text = Text.forCommit(reader, commit); | ||||||
|     return createContext(text, range); |     return createContext(text, commentRange, contextPadding); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private CommentContext getContextForMergeList(ObjectReader reader, RevCommit commit, Range range) |   private CommentContext getContextForMergeList( | ||||||
|  |       ObjectReader reader, RevCommit commit, Range commentRange, int contextPadding) | ||||||
|       throws IOException { |       throws IOException { | ||||||
|     ComparisonType cmp = ComparisonType.againstParent(1); |     ComparisonType cmp = ComparisonType.againstParent(1); | ||||||
|     Text text = Text.forMergeList(cmp, reader, commit); |     Text text = Text.forMergeList(cmp, reader, commit); | ||||||
|     return createContext(text, range); |     return createContext(text, commentRange, contextPadding); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private CommentContext getContextForFilePath( |   private CommentContext getContextForFilePath( | ||||||
|       Repository repo, RevWalk rw, RevCommit commit, String filePath, Range range) |       Repository repo, | ||||||
|  |       RevWalk rw, | ||||||
|  |       RevCommit commit, | ||||||
|  |       String filePath, | ||||||
|  |       Range commentRange, | ||||||
|  |       int contextPadding) | ||||||
|       throws IOException { |       throws IOException { | ||||||
|     // TODO(ghareeb): We can further group the comments by file paths to avoid opening |     // TODO(ghareeb): We can further group the comments by file paths to avoid opening | ||||||
|     // the same file multiple times. |     // the same file multiple times. | ||||||
| @@ -140,23 +152,38 @@ public class CommentContextLoader { | |||||||
|       } |       } | ||||||
|       ObjectId id = tw.getObjectId(0); |       ObjectId id = tw.getObjectId(0); | ||||||
|       Text src = new Text(repo.open(id, Constants.OBJ_BLOB)); |       Text src = new Text(repo.open(id, Constants.OBJ_BLOB)); | ||||||
|       return createContext(src, range); |       return createContext(src, commentRange, contextPadding); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private static CommentContext createContext(Text src, Range range) { |   private static CommentContext createContext(Text src, Range commentRange, int contextPadding) { | ||||||
|     if (range.start() < 1 || range.end() > src.size()) { |     if (commentRange.start() < 1 || commentRange.end() - 1 > src.size()) { | ||||||
|       throw new StorageException( |       throw new StorageException( | ||||||
|           "Invalid comment range " + range + ". Text only contains " + src.size() + " lines."); |           "Invalid comment range " | ||||||
|  |               + commentRange | ||||||
|  |               + ". Text only contains " | ||||||
|  |               + src.size() | ||||||
|  |               + " lines."); | ||||||
|     } |     } | ||||||
|  |     commentRange = adjustRange(commentRange, contextPadding, src.size()); | ||||||
|     ImmutableMap.Builder<Integer, String> context = |     ImmutableMap.Builder<Integer, String> context = | ||||||
|         ImmutableMap.builderWithExpectedSize(range.end() - range.start()); |         ImmutableMap.builderWithExpectedSize(commentRange.end() - commentRange.start()); | ||||||
|     for (int i = range.start(); i < range.end(); i++) { |     for (int i = commentRange.start(); i < commentRange.end(); i++) { | ||||||
|       context.put(i, src.getString(i - 1)); |       context.put(i, src.getString(i - 1)); | ||||||
|     } |     } | ||||||
|     return CommentContext.create(context.build()); |     return CommentContext.create(context.build()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Adjust the {@code commentRange} parameter by adding {@code contextPadding} lines before and | ||||||
|  |    * after the comment range. | ||||||
|  |    */ | ||||||
|  |   private static Range adjustRange(Range commentRange, int contextPadding, int fileLines) { | ||||||
|  |     int newStartLine = commentRange.start() - contextPadding; | ||||||
|  |     int newEndLine = commentRange.end() + contextPadding; | ||||||
|  |     return Range.create(Math.max(1, newStartLine), Math.min(fileLines + 1, newEndLine)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private static Optional<Range> getStartAndEndLines(ContextInput comment) { |   private static Optional<Range> getStartAndEndLines(ContextInput comment) { | ||||||
|     if (comment.range() != null) { |     if (comment.range() != null) { | ||||||
|       return Optional.of(Range.create(comment.range().startLine, comment.range().endLine + 1)); |       return Optional.of(Range.create(comment.range().startLine, comment.range().endLine + 1)); | ||||||
| @@ -177,17 +204,23 @@ public class CommentContextLoader { | |||||||
|  |  | ||||||
|     /** End line of the comment (exclusive). */ |     /** End line of the comment (exclusive). */ | ||||||
|     abstract int end(); |     abstract int end(); | ||||||
|  |  | ||||||
|  |     /** Number of lines covered by this range. */ | ||||||
|  |     int size() { | ||||||
|  |       return end() - start(); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** This entity only contains comment fields needed to load the comment context. */ |   /** This entity only contains comment fields needed to load the comment context. */ | ||||||
|   @AutoValue |   @AutoValue | ||||||
|   abstract static class ContextInput { |   abstract static class ContextInput { | ||||||
|     static ContextInput fromComment(Comment comment) { |     static ContextInput fromComment(Comment comment, int contextPadding) { | ||||||
|       return new AutoValue_CommentContextLoader_ContextInput.Builder() |       return new AutoValue_CommentContextLoader_ContextInput.Builder() | ||||||
|           .commitId(comment.getCommitId()) |           .commitId(comment.getCommitId()) | ||||||
|           .filePath(comment.key.filename) |           .filePath(comment.key.filename) | ||||||
|           .range(comment.range) |           .range(comment.range) | ||||||
|           .lineNumber(comment.lineNbr) |           .lineNumber(comment.lineNbr) | ||||||
|  |           .contextPadding(contextPadding) | ||||||
|           .build(); |           .build(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -210,6 +243,9 @@ public class CommentContextLoader { | |||||||
|      */ |      */ | ||||||
|     abstract Integer lineNumber(); |     abstract Integer lineNumber(); | ||||||
|  |  | ||||||
|  |     /** Number of extra lines of context that should be added before and after the comment range. */ | ||||||
|  |     abstract Integer contextPadding(); | ||||||
|  |  | ||||||
|     @AutoValue.Builder |     @AutoValue.Builder | ||||||
|     public abstract static class Builder { |     public abstract static class Builder { | ||||||
|  |  | ||||||
| @@ -221,6 +257,8 @@ public class CommentContextLoader { | |||||||
|  |  | ||||||
|       public abstract Builder lineNumber(Integer lineNumber); |       public abstract Builder lineNumber(Integer lineNumber); | ||||||
|  |  | ||||||
|  |       public abstract Builder contextPadding(Integer contextPadding); | ||||||
|  |  | ||||||
|       public abstract ContextInput build(); |       public abstract ContextInput build(); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -61,6 +61,7 @@ public class CommentJson { | |||||||
|   private boolean fillAccounts = true; |   private boolean fillAccounts = true; | ||||||
|   private boolean fillPatchSet; |   private boolean fillPatchSet; | ||||||
|   private boolean fillCommentContext; |   private boolean fillCommentContext; | ||||||
|  |   private int contextPadding; | ||||||
|  |  | ||||||
|   @Inject |   @Inject | ||||||
|   CommentJson(AccountLoader.Factory accountLoaderFactory, CommentContextCache commentContextCache) { |   CommentJson(AccountLoader.Factory accountLoaderFactory, CommentContextCache commentContextCache) { | ||||||
| @@ -83,6 +84,11 @@ public class CommentJson { | |||||||
|     return this; |     return this; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   CommentJson setContextPadding(int contextPadding) { | ||||||
|  |     this.contextPadding = contextPadding; | ||||||
|  |     return this; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   CommentJson setProjectKey(Project.NameKey project) { |   CommentJson setProjectKey(Project.NameKey project) { | ||||||
|     this.project = project; |     this.project = project; | ||||||
|     return this; |     return this; | ||||||
| @@ -184,6 +190,7 @@ public class CommentJson { | |||||||
|           .id(r.id) |           .id(r.id) | ||||||
|           .path(r.path) |           .path(r.path) | ||||||
|           .patchset(r.patchSet) |           .patchset(r.patchSet) | ||||||
|  |           .contextPadding(contextPadding) | ||||||
|           .build(); |           .build(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -42,6 +42,7 @@ public class ListChangeComments implements RestReadView<ChangeResource> { | |||||||
|   private final CommentsUtil commentsUtil; |   private final CommentsUtil commentsUtil; | ||||||
|  |  | ||||||
|   private boolean includeContext; |   private boolean includeContext; | ||||||
|  |   private int contextPadding; | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Optional parameter. If set, the contextLines field of the {@link ContextLineInfo} of the |    * Optional parameter. If set, the contextLines field of the {@link ContextLineInfo} of the | ||||||
| @@ -54,6 +55,16 @@ public class ListChangeComments implements RestReadView<ChangeResource> { | |||||||
|     this.includeContext = context; |     this.includeContext = context; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   /** | ||||||
|  |    * Optional parameter. Works only if {@link #includeContext} is set to true. If {@link | ||||||
|  |    * #contextPadding} is set, the context lines in the response will be padded with {@link | ||||||
|  |    * #contextPadding} extra lines before and after the comment range. | ||||||
|  |    */ | ||||||
|  |   @Option(name = "--context-padding") | ||||||
|  |   public void setContextPadding(int contextPadding) { | ||||||
|  |     this.contextPadding = contextPadding; | ||||||
|  |   } | ||||||
|  |  | ||||||
|   @Inject |   @Inject | ||||||
|   ListChangeComments( |   ListChangeComments( | ||||||
|       ChangeData.Factory changeDataFactory, |       ChangeData.Factory changeDataFactory, | ||||||
| @@ -105,6 +116,7 @@ public class ListChangeComments implements RestReadView<ChangeResource> { | |||||||
|         .setFillAccounts(true) |         .setFillAccounts(true) | ||||||
|         .setFillPatchSet(true) |         .setFillPatchSet(true) | ||||||
|         .setFillCommentContext(includeContext) |         .setFillCommentContext(includeContext) | ||||||
|  |         .setContextPadding(contextPadding) | ||||||
|         .setProjectKey(rsrc.getProject()) |         .setProjectKey(rsrc.getProject()) | ||||||
|         .setChangeId(rsrc.getId()) |         .setChangeId(rsrc.getId()) | ||||||
|         .newHumanCommentFormatter(); |         .newHumanCommentFormatter(); | ||||||
|   | |||||||
| @@ -286,6 +286,64 @@ public class CommentContextIT extends AbstractDaemonTest { | |||||||
|     assertThat(comments.get(0).contextLines).isEmpty(); |     assertThat(comments.get(0).contextLines).isEmpty(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   @Test | ||||||
|  |   public void commentContextWithZeroPadding() throws Exception { | ||||||
|  |     String changeId = createChangeWithComment(3, 4); | ||||||
|  |     assertContextLines(changeId, /* contextPadding= */ 0, ImmutableList.of(3, 4)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Test | ||||||
|  |   public void commentContextWithSmallPadding() throws Exception { | ||||||
|  |     String changeId = createChangeWithComment(3, 4); | ||||||
|  |     assertContextLines(changeId, /* contextPadding= */ 1, ImmutableList.of(2, 3, 4, 5)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Test | ||||||
|  |   public void commentContextWithSmallPaddingAtTheBeginningOfFile() throws Exception { | ||||||
|  |     String changeId = createChangeWithComment(1, 2); | ||||||
|  |     assertContextLines(changeId, /* contextPadding= */ 2, ImmutableList.of(1, 2, 3, 4)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   @Test | ||||||
|  |   public void commentContextWithPaddingLargerThanFileSize() throws Exception { | ||||||
|  |     String changeId = createChangeWithComment(3, 3); | ||||||
|  |     assertContextLines( | ||||||
|  |         changeId, | ||||||
|  |         /* contextPadding= */ 20, | ||||||
|  |         ImmutableList.of(1, 2, 3, 4, 5, 6)); // file only contains six lines. | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private String createChangeWithComment(int startLine, int endLine) throws Exception { | ||||||
|  |     PushOneCommit.Result result = | ||||||
|  |         createChange(testRepo, "master", SUBJECT, FILE_NAME, FILE_CONTENT, "topic"); | ||||||
|  |     String changeId = result.getChangeId(); | ||||||
|  |     String ps1 = result.getCommit().name(); | ||||||
|  |  | ||||||
|  |     Comment.Range commentRange = createCommentRange(startLine, endLine); | ||||||
|  |     CommentInput comment = | ||||||
|  |         CommentsUtil.newComment(FILE_NAME, Side.REVISION, commentRange, "comment", false); | ||||||
|  |     CommentsUtil.addComments(gApi, changeId, ps1, comment); | ||||||
|  |     return changeId; | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   private void assertContextLines( | ||||||
|  |       String changeId, int contextPadding, ImmutableList<Integer> expectedLines) throws Exception { | ||||||
|  |     List<CommentInfo> comments = | ||||||
|  |         gApi.changes() | ||||||
|  |             .id(changeId) | ||||||
|  |             .commentsRequest() | ||||||
|  |             .withContext(true) | ||||||
|  |             .contextPadding(contextPadding) | ||||||
|  |             .getAsList(); | ||||||
|  |  | ||||||
|  |     assertThat(comments).hasSize(1); | ||||||
|  |     assertThat( | ||||||
|  |             comments.get(0).contextLines.stream() | ||||||
|  |                 .map(c -> c.lineNumber) | ||||||
|  |                 .collect(Collectors.toList())) | ||||||
|  |         .containsExactlyElementsIn(expectedLines); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private Comment.Range createCommentRange(int startLine, int endLine) { |   private Comment.Range createCommentRange(int startLine, int endLine) { | ||||||
|     Comment.Range range = new Comment.Range(); |     Comment.Range range = new Comment.Range(); | ||||||
|     range.startLine = startLine; |     range.startLine = startLine; | ||||||
|   | |||||||
| @@ -34,6 +34,7 @@ public class CommentContextSerializerTest { | |||||||
|             .id("commentId") |             .id("commentId") | ||||||
|             .path("pathHash") |             .path("pathHash") | ||||||
|             .patchset(1) |             .patchset(1) | ||||||
|  |             .contextPadding(3) | ||||||
|             .build(); |             .build(); | ||||||
|     byte[] serialized = CommentContextKey.Serializer.INSTANCE.serialize(k); |     byte[] serialized = CommentContextKey.Serializer.INSTANCE.serialize(k); | ||||||
|     assertThat(k).isEqualTo(CommentContextKey.Serializer.INSTANCE.deserialize(serialized)); |     assertThat(k).isEqualTo(CommentContextKey.Serializer.INSTANCE.deserialize(serialized)); | ||||||
|   | |||||||
| @@ -511,7 +511,7 @@ message ProjectCacheKeyProto { | |||||||
| } | } | ||||||
|  |  | ||||||
| // Serialized form of com.google.gerrit.server.comment.CommentContextCacheImpl.Key | // Serialized form of com.google.gerrit.server.comment.CommentContextCacheImpl.Key | ||||||
| // Next ID: 6 | // Next ID: 7 | ||||||
| message CommentContextKeyProto { | message CommentContextKeyProto { | ||||||
|   string project = 1; |   string project = 1; | ||||||
|   string change_id = 2; |   string change_id = 2; | ||||||
| @@ -520,6 +520,8 @@ message CommentContextKeyProto { | |||||||
|  |  | ||||||
|   // hashed with the murmur3_128 hash function |   // hashed with the murmur3_128 hash function | ||||||
|   string path_hash = 5; |   string path_hash = 5; | ||||||
|  |  | ||||||
|  |   int32 context_padding = 6; | ||||||
| } | } | ||||||
|  |  | ||||||
| // Serialized form of a list of com.google.gerrit.extensions.common.ContextLineInfo | // Serialized form of a list of com.google.gerrit.extensions.common.ContextLineInfo | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Youssef Elghareeb
					Youssef Elghareeb