Merge branch 'Indore-2017.1.x'
[teamcity/git-plugin.git] / git-server / src / jetbrains / buildServer / buildTriggers / vcs / git / WellKnownHostingsUtil.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 org.eclipse.jgit.transport.URIish;
20 import org.jetbrains.annotations.NotNull;
21 import org.jetbrains.annotations.Nullable;
22
23 public final class WellKnownHostingsUtil {
24   private WellKnownHostingsUtil() {}
25
26   @Nullable
27   public static VcsHostingRepo getGitHubRepo(@NotNull URIish uri) {
28     if (!"github.com".equals(uri.getHost()))
29       return null;
30
31     return ownerProjectStyleRepo("https://github.com/", uri);
32   }
33
34   @Nullable
35   public static VcsHostingRepo getGitlabRepo(@NotNull URIish uri) {
36     if (!"gitlab.com".equals(uri.getHost()))
37       return null;
38
39     return ownerProjectStyleRepo("https://gitlab.com/", uri);
40   }
41
42   @Nullable
43   public static VcsHostingRepo getBitbucketRepo(@NotNull URIish uri) {
44     if (!"bitbucket.org".equals(uri.getHost()))
45       return null;
46
47     return ownerProjectStyleRepo("https://bitbucket.org/", uri);
48   }
49
50   @Nullable
51   public static VcsHostingRepo getBitbucketServerRepo(@NotNull URIish uri) {
52     String host = uri.getHost();
53     if (host == null)
54       return null;
55
56     String path = uri.getPath();
57     if (uri.getScheme() != null && uri.getScheme().startsWith("http") && path.endsWith(".git") && (path.startsWith("/scm/") || path.startsWith("/git/"))) {
58       // probably Bitbucket server
59       String ownerAndRepo = path.substring(5); // length of /scm/ or /git/
60       int slashIdx = ownerAndRepo.indexOf('/');
61       if (slashIdx == -1) return null;
62       String owner = ownerAndRepo.substring(0, slashIdx);
63       String repo = ownerAndRepo.substring(slashIdx+1, ownerAndRepo.length() - ".git".length());
64       if (repo.contains("/")) return null;
65
66       boolean personalRepo = '~' == owner.charAt(0);
67       if (personalRepo) {
68         owner = owner.substring(1);
69       }
70
71       String hostAndPort = host;
72       if (uri.getPort() > 0 && uri.getPort() != 80 && uri.getPort() != 443) {
73         hostAndPort += ":" + uri.getPort();
74       }
75
76       if (personalRepo) {
77         return new VcsHostingRepo(uri.getScheme() + "://" + hostAndPort + "/users/" + owner + "/repos/" + repo, owner, repo);
78       } else {
79         return new VcsHostingRepo(uri.getScheme() + "://" + hostAndPort + "/projects/" + owner + "/repos/" + repo, owner, repo);
80       }
81     }
82
83     return null;
84   }
85
86   @Nullable
87   public static VcsHostingRepo getVSTSRepo(@NotNull URIish uri) {
88     String host = uri.getHost();
89     if (host == null)
90       return null;
91
92     final int idx = host.indexOf(".visualstudio.com");
93     if (idx <= 0)
94       return null;
95
96     String owner = host.substring(0, idx);
97
98     String path = uri.getPath();
99     if (path == null)
100       return null;
101
102     int gitPrefixIdx = path.indexOf("_git/");
103     if (gitPrefixIdx == -1) return null;
104
105     String repoName = path.substring(gitPrefixIdx + "_git/".length());
106
107     return new VcsHostingRepo("https://" + host + "/_git/" + repoName, owner, repoName);
108   }
109
110   private static VcsHostingRepo ownerProjectStyleRepo(@NotNull String hostingUrl, @NotNull URIish uri) {
111     String path = uri.getPath();
112     if (path == null)
113       return null;
114     if (path.startsWith("/"))
115       path = path.substring(1);
116     int idx = path.indexOf("/");
117     if (idx <= 0)
118       return null;
119     String owner = path.substring(0, idx);
120     String repo = path.substring(idx + 1, path.length());
121     if (repo.endsWith(".git"))
122       repo = repo.substring(0, repo.length() - 4);
123     return new VcsHostingRepo(hostingUrl + owner + "/" + repo, owner, repo);
124   }
125
126 }