Ability to disable credential helper provided by TeamCity
[teamcity/git-plugin.git] / git-agent / src / jetbrains / buildServer / buildTriggers / vcs / git / agent / PluginConfigImpl.java
1 /*
2  * Copyright 2000-2014 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.agent;
18
19 import jetbrains.buildServer.agent.AgentRunningBuild;
20 import jetbrains.buildServer.agent.AgentRuntimeProperties;
21 import jetbrains.buildServer.agent.BuildAgentConfiguration;
22 import jetbrains.buildServer.buildTriggers.vcs.git.GitVcsRoot;
23 import jetbrains.buildServer.buildTriggers.vcs.git.agent.command.impl.CommandUtil;
24 import jetbrains.buildServer.util.StringUtil;
25 import org.apache.log4j.Logger;
26 import org.jetbrains.annotations.NotNull;
27
28 import java.io.File;
29
30 /**
31  * @author dmitry.neverov
32  */
33 public class PluginConfigImpl implements AgentPluginConfig {
34
35   private final static Logger LOG = Logger.getLogger(PluginConfigImpl.class);
36
37   public static final String IDLE_TIMEOUT = "teamcity.git.idle.timeout.seconds";
38   public static final String USE_NATIVE_SSH = "teamcity.git.use.native.ssh";
39   public static final String USE_MIRRORS = "teamcity.git.use.local.mirrors";
40   public static final String USE_ALTERNATES = "teamcity.git.useAlternates";
41   public static final String USE_SHALLOW_CLONE = "teamcity.git.use.shallow.clone";
42   public static final String TEAMCITY_DONT_DELETE_TEMP_FILES = "teamcity.dont.delete.temp.files";
43   public static final String USE_MAIN_REPO_USER_FOR_SUBMODULES = "teamcity.git.useMainRepoUserForSubmodules";
44   public static final String VCS_ROOT_MIRRORS_STRATEGY = "teamcity.git.mirrorStrategy";
45   public static final String VCS_ROOT_MIRRORS_STRATEGY_ALTERNATES = "alternates";
46   public static final String VCS_ROOT_MIRRORS_STRATEGY_MIRRORS_ONLY = "mirrors";
47   public static final String USE_SPARSE_CHECKOUT = "teamcity.git.useSparseCheckout";
48   public static final String USE_BUILD_ENV = "teamcity.git.useBuildEnv";
49   public static final String FETCH_ALL_HEADS = "teamcity.git.fetchAllHeads";
50   public static final String FETCH_TAGS = "teamcity.git.fetchTags";
51   public static final String EXCLUDE_USERNAME_FROM_HTTP_URL = "teamcity.git.excludeUsernameFromHttpUrl";
52   public static final String CLEAN_CRED_HELPER_SCRIPT = "teamcity.git.cleanCredHelperScript";
53   public static final String PROVIDE_CRED_HELPER = "teamcity.git.provideCredentialHelper";
54
55   private final BuildAgentConfiguration myAgentConfig;
56   private final AgentRunningBuild myBuild;
57   private final GitExec myGitExec;
58
59   public PluginConfigImpl(@NotNull BuildAgentConfiguration agentConfig,
60                           @NotNull AgentRunningBuild build,
61                           @NotNull GitExec gitExec) {
62     myAgentConfig = agentConfig;
63     myBuild = build;
64     myGitExec = gitExec;
65   }
66
67
68   @NotNull
69   public File getCachesDir() {
70     return myAgentConfig.getCacheDirectory("git");
71   }
72
73
74   public int getIdleTimeoutSeconds() {
75     String valueFromBuild = myBuild.getSharedConfigParameters().get(IDLE_TIMEOUT);
76     if (valueFromBuild != null)
77       return parseTimeout(valueFromBuild);
78     else
79       return DEFAULT_IDLE_TIMEOUT;
80   }
81
82
83   @NotNull
84   public String getPathToGit() {
85     return myGitExec.getPath();
86   }
87
88
89   public boolean isUseNativeSSH() {
90     String value = myBuild.getSharedConfigParameters().get(USE_NATIVE_SSH);
91     return "true".equals(value);
92   }
93
94
95   public boolean isUseLocalMirrors(@NotNull GitVcsRoot root) {
96     String buildSetting = myBuild.getSharedConfigParameters().get(USE_MIRRORS);
97     if (!StringUtil.isEmpty(buildSetting)) {
98       LOG.info("Use the '" + USE_MIRRORS + "' option specified in the build");
99       return Boolean.parseBoolean(buildSetting);
100     }
101
102     Boolean rootSetting = root.isUseAgentMirrors();
103     String mirrorStrategy = getMirrorStrategy();
104     if (rootSetting != null && rootSetting && VCS_ROOT_MIRRORS_STRATEGY_MIRRORS_ONLY.equals(mirrorStrategy)) {
105       LOG.info("Use the mirrors option specified in the VCS root");
106       return true;
107     }
108
109     return false;
110   }
111
112
113   public boolean isUseAlternates(@NotNull GitVcsRoot root) {
114     String buildSetting = myBuild.getSharedConfigParameters().get(USE_ALTERNATES);
115     if (!StringUtil.isEmpty(buildSetting)) {
116       LOG.info("Use the '" + USE_ALTERNATES + "' option specified in the build");
117       return Boolean.parseBoolean(buildSetting);
118     }
119
120     Boolean rootSetting = root.isUseAgentMirrors();
121     String mirrorStrategy = getMirrorStrategy();
122     if (rootSetting != null && rootSetting && VCS_ROOT_MIRRORS_STRATEGY_ALTERNATES.equals(mirrorStrategy)) {
123       LOG.info("Use the mirrors option specified in the VCS root");
124       return true;
125     }
126
127     return false;
128   }
129
130
131   public boolean isUseSparseCheckout() {
132     String buildSetting = myBuild.getSharedConfigParameters().get(USE_SPARSE_CHECKOUT);
133     if (StringUtil.isEmpty(buildSetting))
134       return true;
135     return Boolean.parseBoolean(buildSetting);
136   }
137
138
139   public boolean isRunGitWithBuildEnv() {
140     String buildSetting = myBuild.getSharedConfigParameters().get(USE_BUILD_ENV);
141     if (StringUtil.isEmpty(buildSetting))
142       return false;
143     return Boolean.parseBoolean(buildSetting);
144   }
145
146   @NotNull
147   private String getMirrorStrategy() {
148     String strategy = myBuild.getSharedConfigParameters().get(VCS_ROOT_MIRRORS_STRATEGY);
149     if (!StringUtil.isEmpty(strategy))
150       return strategy;
151     return VCS_ROOT_MIRRORS_STRATEGY_ALTERNATES;
152   }
153
154   public boolean isUseShallowClone() {
155     String valueFromBuildConfiguration = myBuild.getSharedConfigParameters().get(USE_SHALLOW_CLONE);
156     if (valueFromBuildConfiguration != null) {
157       return "true".equals(valueFromBuildConfiguration);
158     } else {
159       String valueFromAgentConfig = myAgentConfig.getConfigurationParameters().get(USE_SHALLOW_CLONE);
160       return "true".equals(valueFromAgentConfig);
161     }
162   }
163
164
165   public boolean isDeleteTempFiles() {
166     boolean doNotDelete = Boolean.parseBoolean(myBuild.getSharedConfigParameters().get(TEAMCITY_DONT_DELETE_TEMP_FILES));
167     return !doNotDelete;
168   }
169
170
171   public boolean isFetchAllHeads() {
172     String value = myBuild.getSharedConfigParameters().get(FETCH_ALL_HEADS);
173     return Boolean.parseBoolean(value);
174   }
175
176
177   public boolean isUseMainRepoUserForSubmodules() {
178     String fromBuildConfiguration = myBuild.getSharedConfigParameters().get(USE_MAIN_REPO_USER_FOR_SUBMODULES);
179     if (fromBuildConfiguration != null)
180       return Boolean.parseBoolean(fromBuildConfiguration);
181
182     String fromAgentConfig = myAgentConfig.getConfigurationParameters().get(USE_MAIN_REPO_USER_FOR_SUBMODULES);
183     if (fromAgentConfig != null)
184       return Boolean.parseBoolean(fromAgentConfig);
185
186     return true;
187   }
188
189   @NotNull
190   public GitVersion getGitVersion() {
191     return myGitExec.getVersion();
192   }
193
194   @NotNull
195   public GitExec getGitExec() {
196     return myGitExec;
197   }
198
199   public int getCheckoutIdleTimeoutSeconds() {
200     String valueFromBuild = myBuild.getSharedConfigParameters().get(IDLE_TIMEOUT);
201     if (valueFromBuild != null) {
202       return parseTimeout(valueFromBuild, CommandUtil.DEFAULT_COMMAND_TIMEOUT_SEC);
203     } else {
204       return CommandUtil.DEFAULT_COMMAND_TIMEOUT_SEC;
205     }
206   }
207
208   public boolean isUpdateSubmoduleOriginUrl() {
209     String value = myBuild.getSharedConfigParameters().get("teamcity.git.updateSubmoduleOriginUrl");
210     return !"false".equals(value);
211   }
212
213   @Override
214   public boolean isFailOnCleanCheckout() {
215     return "true".equals(myBuild.getSharedConfigParameters().get(AgentRuntimeProperties.FAIL_ON_CLEAN_CHECKOUT));
216   }
217
218
219   @Override
220   public boolean isFetchTags() {
221     String value = myBuild.getSharedConfigParameters().get(FETCH_TAGS);
222     //by default tags are fetched
223     return !"false".equals(value);
224   }
225
226   public boolean isCredHelperMatchesAllUrls() {
227     //it looks to be safe to enable all urls matching by default because we did
228     //a similar thing with ask-pass script: it provides password for any server
229     String value = myBuild.getSharedConfigParameters().get("teamcity.git.credentialHelperMatchesAllUrls");
230     return !"false".equals(value);
231   }
232
233   @NotNull
234   @Override
235   public GitProgressMode getGitProgressMode() {
236     String value = myBuild.getSharedConfigParameters().get("teamcity.git.progressMode");
237     if (value == null)
238       return GitProgressMode.DEBUG;
239     try {
240       return GitProgressMode.valueOf(value.toUpperCase());
241     } catch (IllegalArgumentException e) {
242       return GitProgressMode.DEBUG;
243     }
244   }
245
246   @Override
247   public boolean isExcludeUsernameFromHttpUrl() {
248     String value = myBuild.getSharedConfigParameters().get(EXCLUDE_USERNAME_FROM_HTTP_URL);
249     return !"false".equals(value);
250   }
251
252   @Override
253   public boolean isCleanCredHelperScript() {
254     String value = myBuild.getSharedConfigParameters().get(CLEAN_CRED_HELPER_SCRIPT);
255     return !"false".equals(value);
256   }
257
258   @Override
259   public boolean isProvideCredHelper() {
260     String value = myBuild.getSharedConfigParameters().get(PROVIDE_CRED_HELPER);
261     return !"false".equals(value);
262   }
263
264   private int parseTimeout(String valueFromBuild) {
265     return parseTimeout(valueFromBuild, DEFAULT_IDLE_TIMEOUT);
266   }
267
268   private int parseTimeout(String valueFromBuild, int defaultValue) {
269     try {
270       int timeout = Integer.parseInt(valueFromBuild);
271       if (timeout > 0)
272         return timeout;
273       else
274         return defaultValue;
275     } catch (NumberFormatException e) {
276       return defaultValue;
277     }
278   }
279 }