| // Copyright (C) 2023 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.send; |
| |
| import com.google.common.collect.Iterables; |
| import com.google.gerrit.common.Nullable; |
| import com.google.gerrit.entities.BranchNameKey; |
| import com.google.gerrit.mail.MailHeader; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** Contains utils for email notification related to the events on project+branch. */ |
| public class BranchEmailUtils { |
| /** Set a reasonable list id so that filters can be used to sort messages. */ |
| public static void setListIdHeader(OutgoingEmail email, BranchNameKey branch) { |
| email.setHeader( |
| "List-Id", |
| "<gerrit-" + branch.project().get().replace('/', '-') + "." + email.getGerritHost() + ">"); |
| if (email.getSettingsUrl() != null) { |
| email.setHeader("List-Unsubscribe", "<" + email.getSettingsUrl() + ">"); |
| } |
| } |
| |
| /** Add branch information to soy template params. */ |
| public static void addBranchData(OutgoingEmail email, EmailArguments args, BranchNameKey branch) { |
| String projectName = branch.project().get(); |
| email.addSoyParam("projectName", projectName); |
| // shortProjectName is the project name with the path abbreviated. |
| email.addSoyParam("shortProjectName", getShortProjectName(projectName)); |
| |
| // instanceAndProjectName is the instance's name followed by the abbreviated project path |
| email.addSoyParam( |
| "instanceAndProjectName", |
| getInstanceAndProjectName(args.instanceNameProvider.get(), projectName)); |
| email.addSoyParam("addInstanceNameInSubject", args.addInstanceNameInSubject); |
| |
| email.addSoyEmailDataParam("sshHost", getSshHost(email.getGerritHost(), args.sshAddresses)); |
| |
| Map<String, String> branchData = new HashMap<>(); |
| branchData.put("shortName", branch.shortName()); |
| email.addSoyParam("branch", branchData); |
| |
| email.addFooter(MailHeader.PROJECT.withDelimiter() + branch.project().get()); |
| email.addFooter(MailHeader.BRANCH.withDelimiter() + branch.shortName()); |
| } |
| |
| @Nullable |
| private static String getSshHost(String gerritHost, List<String> sshAddresses) { |
| String host = Iterables.getFirst(sshAddresses, null); |
| if (host == null) { |
| return null; |
| } |
| if (host.startsWith("*:")) { |
| return gerritHost + host.substring(1); |
| } |
| return host; |
| } |
| |
| /** Shortens project/repo name to only show part after the last '/'. */ |
| public static String getShortProjectName(String projectName) { |
| int lastIndexSlash = projectName.lastIndexOf('/'); |
| if (lastIndexSlash == 0) { |
| return projectName.substring(1); // Remove the first slash |
| } |
| if (lastIndexSlash == -1) { // No slash in the project name |
| return projectName; |
| } |
| |
| return "..." + projectName.substring(lastIndexSlash + 1); |
| } |
| |
| /** Returns a project/repo name that includes instance as prefix. */ |
| public static String getInstanceAndProjectName(String instanceName, String projectName) { |
| if (instanceName == null || instanceName.isEmpty()) { |
| return getShortProjectName(projectName); |
| } |
| // Extract the project name (everything after the last slash) and prepends it with gerrit's |
| // instance name |
| return instanceName + "/" + projectName.substring(projectName.lastIndexOf('/') + 1); |
| } |
| } |