Merge branch 'Indore-2017.1.x'
[teamcity/git-plugin.git] / git-server-tc / src / jetbrains / buildServer / buildTriggers / vcs / git / GitExternalChangeViewerExtension.java
1 /*
2  * Copyright 2000-2017 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package jetbrains.buildServer.buildTriggers.vcs.git;
18
19 import jetbrains.buildServer.ExtensionHolder;
20 import jetbrains.buildServer.serverSide.changeViewers.ExternalChangeViewerExtension;
21 import jetbrains.buildServer.serverSide.changeViewers.PropertyType;
22 import jetbrains.buildServer.vcs.VcsRoot;
23 import org.eclipse.jgit.transport.URIish;
24 import org.jetbrains.annotations.NotNull;
25 import org.jetbrains.annotations.Nullable;
26
27 import java.net.URISyntaxException;
28 import java.util.HashMap;
29 import java.util.Map;
30
31 public class GitExternalChangeViewerExtension implements ExternalChangeViewerExtension {
32   public GitExternalChangeViewerExtension(@NotNull ExtensionHolder extensionHolder) {
33     extensionHolder.registerExtension(ExternalChangeViewerExtension.class, getClass().getName(), this);
34   }
35
36   @Nullable
37   @Override
38   public Map<String, String> getAvailableProperties(@NotNull final VcsRoot vcsRoot) {
39     if (!Constants.VCS_NAME.equals(vcsRoot.getVcsName())) return null;
40     String url = vcsRoot.getProperty(Constants.FETCH_URL);
41     if (url == null) return null;
42
43     URIish urIish;
44     try {
45       urIish = new URIish(url);
46     } catch (URISyntaxException e) {
47       return null;
48     }
49
50     VcsHostingRepo vcsHostingRepo = WellKnownHostingsUtil.getGitHubRepo(urIish);
51     if (vcsHostingRepo != null) {
52       final VcsHostingRepo finalVcsHostingRepo = vcsHostingRepo;
53       return new HashMap<String, String>() {{
54         put(PropertyType.CHANGE_SET_TYPE, finalVcsHostingRepo.repositoryUrl() + "/commit/${changeSetId}");
55         put(PropertyType.LINK_TEXT, "Open in GitHub");
56         put(PropertyType.LINK_ICON_CLASS, "icon-github");
57       }};
58     }
59
60     vcsHostingRepo = WellKnownHostingsUtil.getBitbucketRepo(urIish);
61     if (vcsHostingRepo != null) {
62       final VcsHostingRepo finalVcsHostingRepo = vcsHostingRepo;
63       return new HashMap<String, String>() {{
64         put(PropertyType.CHANGE_SET_TYPE, finalVcsHostingRepo.repositoryUrl() + "/commits/${changeSetId}");
65         put(PropertyType.LINK_TEXT, "Open in Bitbucket Cloud");
66         put(PropertyType.LINK_ICON_CLASS, "icon-bitbucket");
67       }};
68     }
69
70     vcsHostingRepo = WellKnownHostingsUtil.getGitlabRepo(urIish);
71     if (vcsHostingRepo != null) {
72       final VcsHostingRepo finalVcsHostingRepo = vcsHostingRepo;
73       return new HashMap<String, String>() {{
74         put(PropertyType.CHANGE_SET_TYPE, finalVcsHostingRepo.repositoryUrl() + "/commit/${changeSetId}");
75         put(PropertyType.LINK_TEXT, "Open in Gitlab.com");
76       }};
77     }
78
79     vcsHostingRepo = WellKnownHostingsUtil.getVSTSRepo(urIish);
80     if (vcsHostingRepo != null) {
81       final VcsHostingRepo finalVcsHostingRepo = vcsHostingRepo;
82       return new HashMap<String, String>() {{
83         put(PropertyType.CHANGE_SET_TYPE, finalVcsHostingRepo.repositoryUrl() + "/commit/${changeSetId}");
84         put(PropertyType.LINK_TEXT, "Open in Visual Studio Team Services");
85       }};
86     }
87
88     vcsHostingRepo = WellKnownHostingsUtil.getBitbucketServerRepo(urIish);
89     if (vcsHostingRepo != null) {
90       final VcsHostingRepo finalVcsHostingRepo = vcsHostingRepo;
91       return new HashMap<String, String>() {{
92         put(PropertyType.CHANGE_SET_TYPE, finalVcsHostingRepo.repositoryUrl() + "/commits/${changeSetId}");
93         put(PropertyType.LINK_TEXT, "Open in Bitbucket Server");
94         put(PropertyType.LINK_ICON_CLASS, "icon-bitbucket");
95       }};
96     }
97
98     return null;
99   }
100 }