blob: 73be454a7116f67cd464d1938818c03e8406a9d9 [file] [log] [blame]
/*
* Copyright 2000-2014 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package git4idea.config;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vcs.VcsException;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
import git4idea.commands.GitCommand;
import git4idea.commands.GitSimpleHandler;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.Nullable;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Git utilities for working with configuration
*/
public class GitConfigUtil {
public static final String USER_NAME = "user.name";
public static final String USER_EMAIL = "user.email";
public static final String BRANCH_AUTOSETUP_REBASE = "branch.autosetuprebase";
public static final String CORE_AUTOCRLF = "core.autocrlf";
private GitConfigUtil() {
}
/**
* Get configuration values for the repository. Note that the method executes a git command.
*
* @param project the context project
* @param root the git root
* @param keyMask the keys to be queried
* @param result the map to put results to
* @throws VcsException if there is a problem with running git
*/
public static void getValues(Project project, VirtualFile root, String keyMask, Map<String, String> result) throws VcsException {
GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
h.setSilent(true);
h.addParameters("--null");
if (keyMask != null) {
h.addParameters("--get-regexp", keyMask);
} else {
h.addParameters("-l");
}
String output = h.run();
int start = 0;
int pos;
while ((pos = output.indexOf('\n', start)) != -1) {
String key = output.substring(start, pos);
start = pos + 1;
if ((pos = output.indexOf('\u0000', start)) == -1) {
break;
}
String value = output.substring(start, pos);
start = pos + 1;
result.put(key, value);
}
}
/**
* Get configuration values for the repository. Note that the method executes a git command.
*
* @param project the context project
* @param root the git root
* @param key the keys to be queried
* @return list of pairs ({@link Pair#first} is the key, {@link Pair#second} is the value)
* @throws VcsException an exception
*/
public static List<Couple<String>> getAllValues(Project project, VirtualFile root, @NonNls String key) throws VcsException {
List<Couple<String>> result = new ArrayList<Couple<String>>();
GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
h.setSilent(true);
h.addParameters("--null", "--get-all", key);
String output = h.run();
int start = 0;
int pos;
while ((pos = output.indexOf('\u0000', start)) != -1) {
String value = output.substring(start, pos);
start = pos + 1;
result.add(Couple.of(key, value));
}
return result;
}
/**
* Get configuration value for the repository. Note that the method executes a git command.
*
* @param project the context project
* @param root the git root
* @param key the keys to be queried
* @return the value associated with the key or null if the value is not found
* @throws VcsException an exception
*/
@Nullable
public static String getValue(Project project, VirtualFile root, @NonNls String key) throws VcsException {
GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
h.setSilent(true);
h.ignoreErrorCode(1);
h.addParameters("--null", "--get", key);
String output = h.run();
int pos = output.indexOf('\u0000');
if (h.getExitCode() != 0 || pos == -1) {
return null;
}
return output.substring(0, pos);
}
/**
* Get boolean configuration value for the repository. Note that the method executes a git command.
*
* @param project the context project
* @param root the git root
* @param key the keys to be queried
* @return the value associated with the key or null if the value is not found, value is not valid integer or boolean
* @throws VcsException an exception
*/
@SuppressWarnings({"HardCodedStringLiteral"})
@Nullable
public static Boolean getBoolValue(final Project project, final VirtualFile root, @NonNls final String key) throws VcsException {
String value = getValue(project, root, key);
if (value == null) {
return null;
}
value = value.trim();
if (value.length() == 0) {
return null;
}
if ("yes".equals(value) || "true".equals(value)) {
return Boolean.TRUE;
}
if ("no".equals(value) || "false".equals(value)) {
return Boolean.FALSE;
}
try {
int i = Integer.parseInt(value);
return i != 0;
}
catch (NumberFormatException ex) {
return null;
}
}
/**
* Get commit encoding for the specified root
*
* @param project the context project
* @param root the project root
* @return the commit encoding or UTF-8 if the encoding is note explicitly specified
*/
public static String getCommitEncoding(final Project project, VirtualFile root) {
@NonNls String encoding = null;
try {
encoding = getValue(project, root, "i18n.commitencoding");
}
catch (VcsException e) {
// ignore exception
}
if (encoding == null || encoding.length() == 0) {
encoding = CharsetToolkit.UTF8;
}
return encoding;
}
/**
* Get log output encoding for the specified root
*
* @param project the context project
* @param root the project root
* @return the log output encoding, the commit encoding, or UTF-8 if the encoding is note explicitly specified
*/
public static String getLogEncoding(final Project project, VirtualFile root) {
@NonNls String encoding = null;
try {
encoding = getValue(project, root, "i18n.logoutputencoding");
}
catch (VcsException e) {
// ignore exception
}
if (encoding == null || encoding.length() == 0) {
encoding = getCommitEncoding(project, root);
}
return encoding;
}
/**
* Get encoding that GIT uses for file names.
*
* @return the encoding for file names
*/
public static String getFileNameEncoding() {
// TODO the best guess is that the default encoding is used.
return Charset.defaultCharset().name();
}
/**
* Unset the current value
*
* @param project the project
* @param root the git root
* @param key the key to unset
* @throws VcsException if there is a problem with running git
*/
public static void unsetValue(Project project, VirtualFile root, String key) throws VcsException {
GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
h.setSilent(true);
h.ignoreErrorCode(1);
h.addParameters("--unset", key);
h.run();
}
/**
* Set the value
*
* @param project the project
* @param root the git root
* @param key the key to set
* @param value the value to set
* @throws VcsException if there is a problem with running git
*/
public static void setValue(Project project, VirtualFile root, String key, String value, String... additionalParameters) throws VcsException {
GitSimpleHandler h = new GitSimpleHandler(project, root, GitCommand.CONFIG);
h.setSilent(true);
h.ignoreErrorCode(1);
h.addParameters(additionalParameters);
h.addParameters(key, value);
h.run();
}
}