git: fix i18n warnings
[idea/community.git] / plugins / git4idea / src / git4idea / config / GitConfigUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package git4idea.config;
3
4 import com.intellij.openapi.project.Project;
5 import com.intellij.openapi.util.NlsSafe;
6 import com.intellij.openapi.util.text.StringUtil;
7 import com.intellij.openapi.vcs.VcsException;
8 import com.intellij.openapi.vfs.CharsetToolkit;
9 import com.intellij.openapi.vfs.VirtualFile;
10 import com.intellij.util.containers.ContainerUtil;
11 import git4idea.commands.Git;
12 import git4idea.commands.GitCommand;
13 import git4idea.commands.GitCommandResult;
14 import git4idea.commands.GitLineHandler;
15 import org.jetbrains.annotations.NonNls;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18
19 import java.io.File;
20 import java.nio.charset.Charset;
21 import java.util.Map;
22
23 /**
24  * Git utilities for working with configuration
25  */
26 public final class GitConfigUtil {
27
28   public static final @NlsSafe String USER_NAME = "user.name";
29   public static final @NlsSafe String USER_EMAIL = "user.email";
30   public static final @NlsSafe String CORE_AUTOCRLF = "core.autocrlf";
31   public static final @NlsSafe String CREDENTIAL_HELPER = "credential.helper";
32   public static final @NlsSafe String LOG_OUTPUT_ENCODING = "i18n.logoutputencoding";
33   public static final @NlsSafe String COMMIT_ENCODING = "i18n.commitencoding";
34
35   private GitConfigUtil() {
36   }
37
38   public static void getValues(@NotNull Project project,
39                                @NotNull VirtualFile root,
40                                @Nullable @NonNls String keyMask,
41                                @NotNull Map<String, String> result) throws VcsException {
42     GitLineHandler h = new GitLineHandler(project, root, GitCommand.CONFIG);
43     h.setSilent(true);
44     h.addParameters("--null");
45     if (keyMask != null) {
46       h.addParameters("--get-regexp", keyMask);
47     } else {
48       h.addParameters("-l");
49     }
50     String output = Git.getInstance().runCommand(h).getOutputOrThrow();
51     int start = 0;
52     int pos;
53     while ((pos = output.indexOf('\n', start)) != -1) {
54       String key = output.substring(start, pos);
55       start = pos + 1;
56       if ((pos = output.indexOf('\u0000', start)) == -1) {
57         break;
58       }
59       String value = output.substring(start, pos);
60       start = pos + 1;
61       result.put(key, value);
62     }
63   }
64
65
66   @Nullable
67   public static String getValue(@NotNull Project project, @NotNull VirtualFile root, @NotNull @NonNls String key) throws VcsException {
68     GitLineHandler h = new GitLineHandler(project, root, GitCommand.CONFIG);
69     return getValue(h, key);
70   }
71
72   @Nullable
73   private static String getValue(@NotNull GitLineHandler h, @NotNull @NonNls String key) throws VcsException {
74     h.setSilent(true);
75     h.addParameters("--null", "--get", key);
76     GitCommandResult result = Git.getInstance().runCommand(h);
77     String output = result.getOutputOrThrow(1);
78     int pos = output.indexOf('\u0000');
79     if (result.getExitCode() != 0 || pos == -1) {
80       return null;
81     }
82     return output.substring(0, pos);
83   }
84
85   /**
86    * Converts the git config boolean value (which can be specified in various ways) to Java Boolean.
87    * @return true if the value represents "true", false if the value represents "false", null if the value doesn't look like a boolean value.
88    */
89   @Nullable
90   public static Boolean getBooleanValue(@NotNull @NonNls String value) {
91     value = StringUtil.toLowerCase(value);
92     if (ContainerUtil.newHashSet("true", "yes", "on", "1").contains(value)) return true;
93     if (ContainerUtil.newHashSet("false", "no", "off", "0", "").contains(value)) return false;
94     return null;
95   }
96
97   /**
98    * Get commit encoding for the specified root, or UTF-8 if the encoding is note explicitly specified
99    */
100   @NotNull
101   public static String getCommitEncoding(@NotNull Project project, @NotNull VirtualFile root) {
102     String encoding = null;
103     try {
104       encoding = getValue(project, root, COMMIT_ENCODING);
105     }
106     catch (VcsException e) {
107       // ignore exception
108     }
109     return StringUtil.isEmpty(encoding) ? CharsetToolkit.UTF8 : encoding;
110   }
111
112   /**
113    * Get log output encoding for the specified root, or UTF-8 if the encoding is note explicitly specified
114    */
115   public static String getLogEncoding(@NotNull Project project, @NotNull VirtualFile root) {
116     String encoding = null;
117     try {
118       encoding = getValue(project, root, LOG_OUTPUT_ENCODING);
119     }
120     catch (VcsException e) {
121       // ignore exception
122     }
123     return StringUtil.isEmpty(encoding) ? getCommitEncoding(project, root) : encoding;
124   }
125
126   /**
127    * Get encoding that GIT uses for file names.
128    */
129   @NotNull
130   public static String getFileNameEncoding() {
131     // TODO the best guess is that the default encoding is used.
132     return Charset.defaultCharset().name();
133   }
134
135   public static void setValue(@NotNull Project project,
136                               @NotNull VirtualFile root,
137                               @NotNull @NonNls String key,
138                               @NotNull @NonNls String value,
139                               @NonNls String... additionalParameters) throws VcsException {
140     GitLineHandler h = new GitLineHandler(project, root, GitCommand.CONFIG);
141     h.setSilent(true);
142     h.addParameters(additionalParameters);
143     h.addParameters(key, value);
144     Git.getInstance().runCommand(h).throwOnError(1);
145   }
146
147   /**
148    * Checks that Credential helper is defined in git config.
149    */
150   public static boolean isCredentialHelperUsed(@NotNull Project project, @NotNull File workingDirectory) {
151     try {
152       GitLineHandler handler = new GitLineHandler(project, workingDirectory, GitCommand.CONFIG);
153       String value = getValue(handler, CREDENTIAL_HELPER);
154       return StringUtil.isNotEmpty(value);
155     }
156     catch (VcsException ignored) {
157       return false;
158     }
159   }
160 }