TW-53097 use UTF-8 for git commands output
authorDmitry Neverov <dmitry.neverov@gmail.com>
Thu, 1 Feb 2018 10:07:14 +0000 (11:07 +0100)
committerDmitry Neverov <dmitry.neverov@gmail.com>
Thu, 1 Feb 2018 10:15:48 +0000 (11:15 +0100)
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/AgentPluginConfig.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/GitCommandLine.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/PluginConfigImpl.java

index 3d5c6a5b9b933bf9cfcb306810448e85e9cee990..40baa630defde979c109ae8a76adfde89c488484 100644 (file)
@@ -19,6 +19,7 @@ package jetbrains.buildServer.buildTriggers.vcs.git.agent;
 import jetbrains.buildServer.buildTriggers.vcs.git.GitVcsRoot;
 import jetbrains.buildServer.buildTriggers.vcs.git.PluginConfig;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * @author dmitry.neverov
@@ -71,6 +72,12 @@ public interface AgentPluginConfig extends PluginConfig {
 
   boolean isProvideCredHelper();
 
+  /**
+   * Returns charset name for git output or null if the default charset should be used
+   */
+  @Nullable
+  String getGitOutputCharsetName();
+
   /**
    * Defines how progress output from git commands is written into build log
    */
index e078e4ee913e2fbbf9a22c0cad0a3cc7108b7ba6..10317aa1f7ef5d2eaf9569b44ba98cf50bea9acb 100644 (file)
@@ -38,6 +38,7 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.*;
 import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -285,4 +286,22 @@ public class GitCommandLine extends GeneralCommandLine {
     if (reason != null)
       throw new CheckoutCanceledException(reason);
   }
+
+  @Override
+  public Charset getCharset() {
+    // Override the method instead of using the setCharset(), because
+    // setCharset() adds the '-Dfile.encoding={charset}' parameter to
+    // the parameter list which makes git to fail.
+    AgentPluginConfig config = myCtx.getConfig();
+    if (config == null)
+      return super.getCharset();
+    String charsetName = config.getGitOutputCharsetName();
+    if (charsetName == null)
+      return super.getCharset();
+    try {
+      return Charset.forName(charsetName);
+    } catch (UnsupportedCharsetException e) {
+      return super.getCharset();
+    }
+  }
 }
index 1346232cee5667d87d11e13481969e368a884fd1..e6efbd860a26c41a05d2afc2f1997e02936afd73 100644 (file)
@@ -24,6 +24,7 @@ import jetbrains.buildServer.buildTriggers.vcs.git.agent.command.impl.CommandUti
 import jetbrains.buildServer.util.StringUtil;
 import org.apache.log4j.Logger;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.util.Map;
@@ -53,6 +54,8 @@ public class PluginConfigImpl implements AgentPluginConfig {
   public static final String EXCLUDE_USERNAME_FROM_HTTP_URL = "teamcity.git.excludeUsernameFromHttpUrl";
   public static final String CLEAN_CRED_HELPER_SCRIPT = "teamcity.git.cleanCredHelperScript";
   public static final String PROVIDE_CRED_HELPER = "teamcity.git.provideCredentialHelper";
+  private static final String USE_DEFAULT_CHARSET = "teamcity.git.useDefaultCharset";
+  private static final String GIT_OUTPUT_CHARSET = "teamcity.git.outputCharset";
 
   private final BuildAgentConfiguration myAgentConfig;
   private final AgentRunningBuild myBuild;
@@ -281,6 +284,16 @@ public class PluginConfigImpl implements AgentPluginConfig {
     return !"false".equals(value);
   }
 
+  @Nullable
+  @Override
+  public String getGitOutputCharsetName() {
+    String useDefault = myBuild.getSharedConfigParameters().get(USE_DEFAULT_CHARSET);
+    if (Boolean.valueOf(useDefault))
+      return null;
+    String charsetName = myBuild.getSharedConfigParameters().get(GIT_OUTPUT_CHARSET);
+    return StringUtil.isNotEmpty(charsetName) ? charsetName : "UTF-8";
+  }
+
   private int parseTimeout(String valueFromBuild) {
     return parseTimeout(valueFromBuild, DEFAULT_IDLE_TIMEOUT);
   }