// Copyright (C) 2009 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.server.mail; import com.google.gerrit.reviewdb.Change; import com.google.gerrit.reviewdb.Patch; import com.google.gerrit.reviewdb.PatchLineComment; import com.google.gerrit.server.patch.PatchFile; import com.google.gerrit.server.patch.PatchList; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; /** Send comments, after the author of them hit used Publish Comments in the UI. */ public class CommentSender extends ReplyToChangeSender { public static interface Factory { public CommentSender create(Change change); } private List<PatchLineComment> inlineComments = Collections.emptyList(); @Inject public CommentSender(EmailArguments ea, @Assisted Change c) { super(ea, c, "comment"); } public void setPatchLineComments(final List<PatchLineComment> plc) { inlineComments = plc; Set<String> paths = new HashSet<String>(); for (PatchLineComment c : plc) { Patch.Key p = c.getKey().getParentKey(); if (!Patch.COMMIT_MSG.equals(p.getFileName())) { paths.add(p.getFileName()); } } String[] names = paths.toArray(new String[paths.size()]); Arrays.sort(names); changeData.setCurrentFilePaths(names); } @Override protected void init() throws EmailException { super.init(); ccAllApprovals(); bccStarredBy(); bccWatchesNotifyAllComments(); } @Override public void formatChange() throws EmailException { appendText(velocifyFile("Comment.vm")); } public String getInlineComments() { StringBuilder cmts = new StringBuilder(); final Repository repo = getRepository(); try { final PatchList patchList = repo != null ? getPatchList() : null; Patch.Key currentFileKey = null; PatchFile currentFileData = null; for (final PatchLineComment c : inlineComments) { final Patch.Key pk = c.getKey().getParentKey(); final int lineNbr = c.getLine(); final short side = c.getSide(); if (!pk.equals(currentFileKey)) { cmts.append("....................................................\n"); if (Patch.COMMIT_MSG.equals(pk.get())) { cmts.append("Commit Message\n"); } else { cmts.append("File "); cmts.append(pk.get()); cmts.append("\n"); } currentFileKey = pk; if (patchList != null) { try { currentFileData = new PatchFile(repo, patchList, pk.getFileName()); } catch (IOException e) { // Don't quote the line if we can't load it. } } else { currentFileData = null; } } cmts.append("Line " + lineNbr); if (currentFileData != null) { try { final String lineStr = currentFileData.getLine(side, lineNbr); cmts.append(": "); cmts.append(lineStr); } catch (Throwable cce) { // Don't quote the line if we can't safely convert it. } } cmts.append("\n"); cmts.append(c.getMessage().trim()); cmts.append("\n\n"); } } finally { if (repo != null) { repo.close(); } } return cmts.toString(); } private Repository getRepository() { try { return args.server.openRepository(projectState.getProject().getNameKey()); } catch (RepositoryNotFoundException e) { return null; } } }