summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/google/gerrit/server/mail/CommentSender.java
blob: 7f52fac618790580604ad31599572ec5adeeca9d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// 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.client.reviewdb.Change;
import com.google.gerrit.client.reviewdb.Patch;
import com.google.gerrit.client.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.Collections;
import java.util.List;

/** 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(@Assisted Change c) {
    super(c, "comment");
  }

  public void setPatchLineComments(final List<PatchLineComment> plc) {
    inlineComments = plc;
  }

  @Override
  protected void init() {
    super.init();

    ccAllApprovals();
    bccStarredBy();
    bccWatchesNotifyAllComments();
  }

  @Override
  protected void format() {
    if (!"".equals(getCoverLetter()) || !inlineComments.isEmpty()) {
      appendText("Comments on Patch Set " + patchSet.getPatchSetId() + ":\n");
      appendText("\n");
      formatCoverLetter();
      formatInlineComments();
      if (getChangeUrl() != null) {
        appendText("To respond, visit " + getChangeUrl() + "\n");
        appendText("\n");
      }
    }
  }

  private void formatInlineComments() {
    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)) {
          appendText("....................................................\n");
          appendText("File ");
          appendText(pk.get());
          appendText("\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;
          }
        }

        appendText("Line " + lineNbr);
        if (currentFileData != null) {
          try {
            final String lineStr = currentFileData.getLine(side, lineNbr);
            appendText(": ");
            appendText(lineStr);
          } catch (Throwable cce) {
            // Don't quote the line if we can't safely convert it.
          }
        }
        appendText("\n");

        appendText(c.getMessage().trim());
        appendText("\n\n");
      }
    } finally {
      if (repo != null) {
        repo.close();
      }
    }
  }

  private Repository getRepository() {
    try {
      return server.openRepository(projectName);
    } catch (RepositoryNotFoundException e) {
      return null;
    }
  }
}