always add .git to Git URL
[teamcity/git-plugin.git] / git-server / src / jetbrains / buildServer / buildTriggers / vcs / git / GitUrlSupport.java
1 /*
2  * Copyright 2000-2012 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.vcs.*;
20 import jetbrains.buildServer.vcs.impl.VcsRootImpl;
21 import org.eclipse.jgit.transport.URIish;
22 import org.jetbrains.annotations.NotNull;
23 import org.jetbrains.annotations.Nullable;
24
25 import java.net.URISyntaxException;
26 import java.util.HashMap;
27 import java.util.Map;
28
29 /**
30  * @author dmitry.neverov
31  */
32 public class GitUrlSupport implements UrlSupport {
33
34   private final GitVcsSupport myGitSupport;
35
36   public GitUrlSupport(@NotNull GitVcsSupport gitSupport) {
37     myGitSupport = gitSupport;
38   }
39
40   @Nullable
41   public Map<String, String> convertToVcsRootProperties(@NotNull VcsUrl url) throws VcsException {
42     String scmName = getMavenScmName(url);
43     if (scmName != null && !"git".equals(scmName) && !"ssh".equals(scmName)) //some other scm provider
44       return null;
45
46     String fetchUrl = getFetchUrl(url);
47
48     URIish uri;
49     try {
50       uri = new URIish(fetchUrl);
51     } catch (URISyntaxException e) {
52       throw new VcsException(e.getMessage(), e);
53     }
54
55     Map<String, String> props = new HashMap<String, String>(myGitSupport.getDefaultVcsProperties());
56     props.put(Constants.FETCH_URL, fetchUrl);
57     props.putAll(getAuthSettings(url, uri));
58
59     if ("git".equals(scmName) || "git".equals(uri.getScheme()) || uri.getPath().endsWith(".git")) //git protocol, or git scm provider, or .git suffix
60       return props;
61
62     try {
63       if (!fetchUrl.endsWith(".git")) {
64         props.put(Constants.FETCH_URL, fetchUrl + ".git");
65       }
66
67       myGitSupport.testConnection(new VcsRootImpl(-1, Constants.VCS_NAME, props));
68       return props;
69     } catch (VcsException e) {
70       return null; // probably not git
71     }
72   }
73
74   @NotNull
75   private Map<String, String> getAuthSettings(@NotNull VcsUrl url, @NotNull URIish uri) {
76     Map<String, String> authSettings = new HashMap<String, String>();
77     authSettings.put(Constants.AUTH_METHOD, getAuthMethod(url, uri).toString());
78     Credentials credentials = url.getCredentials();
79     if (credentials != null) {
80       authSettings.put(Constants.USERNAME, credentials.getUsername());
81       authSettings.put(Constants.PASSWORD, credentials.getPassword());
82     } else {
83       authSettings.put(Constants.USERNAME, uri.getUser());
84     }
85     return authSettings;
86   }
87
88   private AuthenticationMethod getAuthMethod(@NotNull VcsUrl url, @NotNull URIish uri) {
89     if (isScpSyntax(uri) || "ssh".equals(uri.getScheme()))
90       return AuthenticationMethod.PRIVATE_KEY_DEFAULT;
91     if (url.getCredentials() != null)
92       return AuthenticationMethod.PASSWORD;
93     return AuthenticationMethod.ANONYMOUS;
94   }
95
96   @Nullable
97   private String getMavenScmName(@NotNull VcsUrl url) {
98     MavenVcsUrl mavenUrl = url.asMavenVcsUrl();
99     if (mavenUrl == null)
100       return null;
101     return mavenUrl.getProviderSchema();
102   }
103
104   @NotNull
105   private String getFetchUrl(@NotNull VcsUrl url) {
106     MavenVcsUrl mavenUrl = url.asMavenVcsUrl();
107     if (mavenUrl != null)
108       return mavenUrl.getProviderSpecificPart();
109     return url.getUrl();
110   }
111
112   private boolean isScpSyntax(URIish uriish) {
113     return uriish.getScheme() == null && uriish.isRemote();
114   }
115 }