blob: 7dd7f9b1004b61fa47e07d17ee3977d9d1917af0 [file] [log] [blame]
/*
* Copyright 2000-2012 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.dvcs.branch.DvcsBranchSync;
import com.intellij.dvcs.branch.DvcsSyncBranchSettings;
import com.intellij.lifecycle.PeriodicalTasksCloser;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StoragePathMacros;
import com.intellij.openapi.project.Project;
import com.intellij.util.ArrayUtil;
import git4idea.reset.GitResetMode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Git VCS settings
*/
@State(name = "Git.Settings", storages = {@Storage(file = StoragePathMacros.WORKSPACE_FILE)})
public class GitVcsSettings implements PersistentStateComponent<GitVcsSettings.State>, DvcsSyncBranchSettings {
private static final int PREVIOUS_COMMIT_AUTHORS_LIMIT = 16; // Limit for previous commit authors
private final GitVcsApplicationSettings myAppSettings;
private State myState = new State();
/**
* The way the local changes are saved before update if user has selected auto-stash
*/
public enum UpdateChangesPolicy {
STASH,
SHELVE,
}
public static class State {
// The previously entered authors of the commit (up to {@value #PREVIOUS_COMMIT_AUTHORS_LIMIT})
public List<String> PREVIOUS_COMMIT_AUTHORS = new ArrayList<String>();
public GitVcsApplicationSettings.SshExecutable SSH_EXECUTABLE = GitVcsApplicationSettings.SshExecutable.IDEA_SSH;
// The policy that specifies how files are saved before update or rebase
public UpdateChangesPolicy UPDATE_CHANGES_POLICY = UpdateChangesPolicy.STASH;
public UpdateMethod UPDATE_TYPE = UpdateMethod.BRANCH_DEFAULT;
public boolean PUSH_AUTO_UPDATE = false;
public DvcsBranchSync SYNC_SETTING = DvcsBranchSync.NOT_DECIDED;
public String RECENT_GIT_ROOT_PATH = null;
public Map<String, String> RECENT_BRANCH_BY_REPOSITORY = new HashMap<String, String>();
public String RECENT_COMMON_BRANCH = null;
public boolean AUTO_COMMIT_ON_CHERRY_PICK = false;
public boolean WARN_ABOUT_CRLF = true;
public boolean WARN_ABOUT_DETACHED_HEAD = true;
public GitResetMode RESET_MODE = null;
}
public GitVcsSettings(GitVcsApplicationSettings appSettings) {
myAppSettings = appSettings;
}
public GitVcsApplicationSettings getAppSettings() {
return myAppSettings;
}
public static GitVcsSettings getInstance(Project project) {
return PeriodicalTasksCloser.getInstance().safeGetService(project, GitVcsSettings.class);
}
public UpdateMethod getUpdateType() {
return myState.UPDATE_TYPE;
}
public void setUpdateType(UpdateMethod updateType) {
myState.UPDATE_TYPE = updateType;
}
@NotNull
public UpdateChangesPolicy updateChangesPolicy() {
return myState.UPDATE_CHANGES_POLICY;
}
public void setUpdateChangesPolicy(UpdateChangesPolicy value) {
myState.UPDATE_CHANGES_POLICY = value;
}
/**
* Save an author of the commit and make it the first one. If amount of authors exceeds the limit, remove least recently selected author.
*
* @param author an author to save
*/
public void saveCommitAuthor(String author) {
myState.PREVIOUS_COMMIT_AUTHORS.remove(author);
while (myState.PREVIOUS_COMMIT_AUTHORS.size() >= PREVIOUS_COMMIT_AUTHORS_LIMIT) {
myState.PREVIOUS_COMMIT_AUTHORS.remove(myState.PREVIOUS_COMMIT_AUTHORS.size() - 1);
}
myState.PREVIOUS_COMMIT_AUTHORS.add(0, author);
}
public String[] getCommitAuthors() {
return ArrayUtil.toStringArray(myState.PREVIOUS_COMMIT_AUTHORS);
}
public State getState() {
return myState;
}
public void loadState(State state) {
myState = state;
}
public boolean autoUpdateIfPushRejected() {
return myState.PUSH_AUTO_UPDATE;
}
public void setAutoUpdateIfPushRejected(boolean autoUpdate) {
myState.PUSH_AUTO_UPDATE = autoUpdate;
}
@NotNull
public DvcsBranchSync getSyncSetting() {
return myState.SYNC_SETTING;
}
public void setSyncSetting(@NotNull DvcsBranchSync syncSetting) {
myState.SYNC_SETTING = syncSetting;
}
@Nullable
public String getRecentRootPath() {
return myState.RECENT_GIT_ROOT_PATH;
}
public void setRecentRoot(@NotNull String recentGitRootPath) {
myState.RECENT_GIT_ROOT_PATH = recentGitRootPath;
}
@NotNull
public Map<String, String> getRecentBranchesByRepository() {
return myState.RECENT_BRANCH_BY_REPOSITORY;
}
public void setRecentBranchOfRepository(@NotNull String repositoryPath, @NotNull String branch) {
myState.RECENT_BRANCH_BY_REPOSITORY.put(repositoryPath, branch);
}
@Nullable
public String getRecentCommonBranch() {
return myState.RECENT_COMMON_BRANCH;
}
public void setRecentCommonBranch(@NotNull String branch) {
myState.RECENT_COMMON_BRANCH = branch;
}
public void setAutoCommitOnCherryPick(boolean autoCommit) {
myState.AUTO_COMMIT_ON_CHERRY_PICK = autoCommit;
}
public boolean isAutoCommitOnCherryPick() {
return myState.AUTO_COMMIT_ON_CHERRY_PICK;
}
public boolean warnAboutCrlf() {
return myState.WARN_ABOUT_CRLF;
}
public void setWarnAboutCrlf(boolean warn) {
myState.WARN_ABOUT_CRLF = warn;
}
public boolean warnAboutDetachedHead() {
return myState.WARN_ABOUT_DETACHED_HEAD;
}
public void setWarnAboutDetachedHead(boolean warn) {
myState.WARN_ABOUT_DETACHED_HEAD = warn;
}
@Nullable
public GitResetMode getResetMode() {
return myState.RESET_MODE;
}
public void setResetMode(@NotNull GitResetMode mode) {
myState.RESET_MODE = mode;
}
/**
* Provides migration from project settings.
* This method is to be removed in IDEA 13: it should be moved to {@link GitVcsApplicationSettings}
*/
@Deprecated
public boolean isIdeaSsh() {
if (getAppSettings().getIdeaSsh() == null) { // app setting has not been initialized yet => migrate the project setting there
getAppSettings().setIdeaSsh(myState.SSH_EXECUTABLE);
}
return getAppSettings().getIdeaSsh() == GitVcsApplicationSettings.SshExecutable.IDEA_SSH;
}
}