Merge branch 'Indore-2017.1.x'
[teamcity/git-plugin.git] / git-agent / src / jetbrains / buildServer / buildTriggers / vcs / git / agent / command / ScriptGen.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.command;
18
19 import com.intellij.openapi.util.io.StreamUtil;
20 import jetbrains.buildServer.agent.ClasspathUtil;
21 import jetbrains.buildServer.buildTriggers.vcs.git.AuthSettings;
22 import jetbrains.buildServer.buildTriggers.vcs.git.agent.CredentialsHelper;
23 import jetbrains.buildServer.util.FileUtil;
24 import jetbrains.buildServer.util.StringUtil;
25 import org.jetbrains.annotations.NotNull;
26
27 import java.io.*;
28
29 public abstract class ScriptGen {
30
31   protected final File myTempDir;
32
33   public ScriptGen(@NotNull File tempDir) {
34     myTempDir = tempDir;
35   }
36
37   @NotNull
38   public abstract File generateAskPass(@NotNull AuthSettings authSettings) throws IOException;
39
40
41   @NotNull
42   public File generateCredentialsHelper() throws IOException {
43     String template = getCredHelperTemplate();
44     String extension = "";
45     int idx = template.lastIndexOf(".");
46     if (idx != -1)
47       extension = template.substring(idx, template.length());
48
49     File result = FileUtil.createTempFile(myTempDir, "credHelper", extension, true);
50     PrintWriter out = null;
51     try {
52       out = new PrintWriter(new FileWriter(result));
53
54       InputStream templateStream = ScriptGen.class.getResourceAsStream(template);
55       if (templateStream == null)
56         throw new IOException("Cannot read script template " + template);
57       String script = StreamUtil.readText(templateStream);
58       String javaPath = "java";
59       String javaHome = System.getProperty("java.home");
60       if (StringUtil.isNotEmpty(javaHome)) {
61         javaPath = "\"" + javaHome + File.separatorChar + "bin" + File.separatorChar + "java\"";
62       }
63       script = script.replace("{JAVA}", javaPath);
64       script = script.replace("{CREDENTIALS_SCRIPT}", result.getCanonicalPath());
65       script = script.replace("{CREDENTIALS_CLASSPATH}", ClasspathUtil.composeClasspath(new Class[]{CredentialsHelper.class}, null, null));
66       script = script.replace("{CREDENTIALS_CLASS}", CredentialsHelper.class.getName());
67       String[] lines = script.split("(\r\n|\r|\n)");
68       for (String line : lines) {
69         out.println(line);
70       }
71       if (!result.setExecutable(true))
72         throw new IOException("Cannot make credentialsHelper script executable");
73     } catch (IOException e) {
74       FileUtil.delete(result);
75       throw e;
76     } finally {
77       if (out != null)
78         out.close();
79     }
80     return result;
81   }
82
83
84   @NotNull
85   protected abstract String getCredHelperTemplate();
86 }