From 9193df7c1d97fec306b3eb3e3dfd7024c83747a5 Mon Sep 17 00:00:00 2001 From: irengrig Date: Thu, 23 Dec 2010 16:20:17 +0300 Subject: [PATCH] IDEA-59757 Version Control: autodetect VCS root doesn't delete corresponding none mapping (PyCharm). (for IDEA as well) --- .../vcs/impl/ModuleDefaultVcsRootPolicy.java | 14 ++++++++----- .../vcs/impl/BasicDefaultVcsRootPolicy.java | 7 ++++--- .../vcs/impl/DefaultVcsRootPolicy.java | 4 ++-- .../vcs/impl/ProjectLevelVcsManagerImpl.java | 19 +++++++++++++++++- .../vcs/impl/projectlevelman/NewMappings.java | 20 +++++++++++++++++-- .../platform/PlatformVcsDetector.java | 2 ++ 6 files changed, 53 insertions(+), 13 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/vcs/impl/ModuleDefaultVcsRootPolicy.java b/platform/lang-impl/src/com/intellij/openapi/vcs/impl/ModuleDefaultVcsRootPolicy.java index 418d5ec5bcf0..e16e9459dde1 100644 --- a/platform/lang-impl/src/com/intellij/openapi/vcs/impl/ModuleDefaultVcsRootPolicy.java +++ b/platform/lang-impl/src/com/intellij/openapi/vcs/impl/ModuleDefaultVcsRootPolicy.java @@ -34,6 +34,7 @@ import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx; import com.intellij.openapi.vcs.impl.projectlevelman.NewMappings; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -52,15 +53,18 @@ public class ModuleDefaultVcsRootPolicy extends DefaultVcsRootPolicy { myModuleManager = ModuleManager.getInstance(myProject); } - public void addDefaultVcsRoots(final NewMappings mappingList, final AbstractVcs vcs, final List result) { + public void addDefaultVcsRoots(final NewMappings mappingList, @NotNull final String vcsName, final List result) { final ProjectLevelVcsManager vcsManager = ProjectLevelVcsManager.getInstance(myProject); - if (myBaseDir != null && vcs.getName().equals(mappingList.getVcsFor(myBaseDir)) && (vcs.equals(vcsManager.getVcsFor(myBaseDir)))) { - result.add(myBaseDir); + if (myBaseDir != null && vcsName.equals(mappingList.getVcsFor(myBaseDir))) { + final AbstractVcs vcsFor = vcsManager.getVcsFor(myBaseDir); + if (vcsFor != null && vcsName.equals(vcsFor.getName())) { + result.add(myBaseDir); + } } final StorageScheme storageScheme = ((ProjectEx) myProject).getStateStore().getStorageScheme(); if (StorageScheme.DIRECTORY_BASED.equals(storageScheme) && (myBaseDir != null)) { final VirtualFile ideaDir = myBaseDir.findChild(Project.DIRECTORY_STORE_FOLDER); - if (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory() && vcs.equals(vcsManager.getVcsFor(ideaDir))) { + if (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory() && vcsName.equals(vcsManager.getVcsFor(ideaDir))) { result.add(ideaDir); } } @@ -77,7 +81,7 @@ public class ModuleDefaultVcsRootPolicy extends DefaultVcsRootPolicy { // explicitly (we know it anyway) VcsDirectoryMapping mapping = mappingList.getMappingFor(file, module); final String mappingVcs = mapping != null ? mapping.getVcs() : null; - if (vcs.getName().equals(mappingVcs)) { + if (vcsName.equals(mappingVcs)) { result.add(file); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/BasicDefaultVcsRootPolicy.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/BasicDefaultVcsRootPolicy.java index c6f8b5a3299b..f87afb065828 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/BasicDefaultVcsRootPolicy.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/BasicDefaultVcsRootPolicy.java @@ -19,12 +19,13 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.FilePathImpl; import com.intellij.openapi.vcs.changes.DirtBuilder; -import com.intellij.openapi.vcs.changes.VcsGuess; import com.intellij.openapi.vcs.changes.FilePathUnderVcs; +import com.intellij.openapi.vcs.changes.VcsGuess; import com.intellij.openapi.vcs.impl.projectlevelman.NewMappings; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.platform.ProjectBaseDirectory; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -41,9 +42,9 @@ public class BasicDefaultVcsRootPolicy extends DefaultVcsRootPolicy { myBaseDir = project.getBaseDir(); } - public void addDefaultVcsRoots(final NewMappings mappingList, final AbstractVcs vcs, final List result) { + public void addDefaultVcsRoots(final NewMappings mappingList, @NotNull final String vcsName, final List result) { final VirtualFile baseDir = ProjectBaseDirectory.getInstance(myProject).getBaseDir(myBaseDir); - if (baseDir != null && vcs.getName().equals(mappingList.getVcsFor(baseDir))) { + if (baseDir != null && vcsName.equals(mappingList.getVcsFor(baseDir))) { result.add(baseDir); } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/DefaultVcsRootPolicy.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/DefaultVcsRootPolicy.java index 32bef26b67bf..32ae467c1fa0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/DefaultVcsRootPolicy.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/DefaultVcsRootPolicy.java @@ -17,11 +17,11 @@ package com.intellij.openapi.vcs.impl; import com.intellij.lifecycle.PeriodicalTasksCloser; import com.intellij.openapi.project.Project; -import com.intellij.openapi.vcs.AbstractVcs; import com.intellij.openapi.vcs.changes.DirtBuilder; import com.intellij.openapi.vcs.changes.VcsGuess; import com.intellij.openapi.vcs.impl.projectlevelman.NewMappings; import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -34,7 +34,7 @@ public abstract class DefaultVcsRootPolicy { return PeriodicalTasksCloser.getInstance().safeGetService(project, DefaultVcsRootPolicy.class); } - public abstract void addDefaultVcsRoots(final NewMappings mappingList, AbstractVcs vcs, List result); + public abstract void addDefaultVcsRoots(final NewMappings mappingList, @NotNull String vcsName, List result); public abstract boolean matchesDefaultMapping(final VirtualFile file, final Object matchContext); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java index 4a71ba72d1c1..6cd0714ee643 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/ProjectLevelVcsManagerImpl.java @@ -59,6 +59,8 @@ import com.intellij.util.containers.Convertor; import com.intellij.util.messages.MessageBus; import com.intellij.util.messages.MessageBusConnection; import com.intellij.util.ui.EditorAdapter; +import org.jdom.Attribute; +import org.jdom.DataConversionException; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -71,7 +73,8 @@ import java.util.List; public class ProjectLevelVcsManagerImpl extends ProjectLevelVcsManagerEx implements ProjectComponent, JDOMExternalizable { private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl"); - + public static final String SETTINGS_EDITED_MANUALLY = "settingsEditedManually"; + private final ProjectLevelVcsManagerSerialization mySerialization; private final OptionsAndConfirmations myOptionsAndConfirmations; @@ -454,6 +457,10 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes } public void setAutoDirectoryMapping(String path, String activeVcsName) { + final List defaultRoots = myMappings.getDefaultRoots(); + if (defaultRoots.size() == 1 && "".equals(myMappings.haveDefaultMapping())) { + myMappings.removeDirectoryMapping(new VcsDirectoryMapping("", "")); + } myMappings.setMapping(path, activeVcsName); } @@ -472,10 +479,20 @@ public void addMessageToConsoleWindow(final String message, final TextAttributes public void readExternal(Element element) throws InvalidDataException { mySerialization.readExternalUtil(element, myOptionsAndConfirmations); + final Attribute attribute = element.getAttribute(SETTINGS_EDITED_MANUALLY); + if (attribute != null) { + try { + myHaveLegacyVcsConfiguration = attribute.getBooleanValue(); + } + catch (DataConversionException e) { + // + } + } } public void writeExternal(Element element) throws WriteExternalException { mySerialization.writeExternalUtil(element, myOptionsAndConfirmations); + element.setAttribute(SETTINGS_EDITED_MANUALLY, String.valueOf(myHaveLegacyVcsConfiguration)); } @NotNull diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java index 71aee4c055a0..633eba307147 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/impl/projectlevelman/NewMappings.java @@ -32,7 +32,6 @@ import com.intellij.openapi.vcs.impl.VcsInitObject; import com.intellij.openapi.vcs.ui.VcsBalloonProblemNotifier; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.EventDispatcher; import com.intellij.util.containers.Convertor; import com.intellij.util.messages.MessageBus; import org.jetbrains.annotations.NotNull; @@ -268,7 +267,7 @@ public class NewMappings { for (VcsDirectoryMapping mapping : mappings) { if (mapping.isDefaultMapping()) { // todo callback here; don't like it - myDefaultVcsRootPolicy.addDefaultVcsRoots(this, vcs, result); + myDefaultVcsRootPolicy.addDefaultVcsRoots(this, vcsName, result); } else { final VirtualFile file = LocalFileSystem.getInstance().findFileByPath(mapping.getDirectory()); if (file != null) { @@ -586,4 +585,21 @@ public class NewMappings { private @interface Modification { } + public List getDefaultRoots() { + synchronized (myLock) { + final String defaultVcs = haveDefaultMapping(); + if (defaultVcs == null) return Collections.emptyList(); + final List list = new ArrayList(); + myDefaultVcsRootPolicy.addDefaultVcsRoots(this, defaultVcs, list); + if (StringUtil.isEmptyOrSpaces(defaultVcs)) { + return AbstractVcs.filterUniqueRootsDefault(list, Convertor.SELF); + } else { + final AbstractVcs vcs = AllVcses.getInstance(myProject).getByName(defaultVcs); + if (vcs == null) { + return AbstractVcs.filterUniqueRootsDefault(list, Convertor.SELF); + } + return vcs.filterUniqueRoots(list, Convertor.SELF); + } + } + } } diff --git a/platform/vcs-impl/src/com/intellij/platform/PlatformVcsDetector.java b/platform/vcs-impl/src/com/intellij/platform/PlatformVcsDetector.java index 4d026d4292a8..9a27b64efc8d 100644 --- a/platform/vcs-impl/src/com/intellij/platform/PlatformVcsDetector.java +++ b/platform/vcs-impl/src/com/intellij/platform/PlatformVcsDetector.java @@ -20,6 +20,7 @@ import com.intellij.openapi.project.DumbAwareRunnable; import com.intellij.openapi.project.Project; import com.intellij.openapi.startup.StartupManager; import com.intellij.openapi.vcs.AbstractVcs; +import com.intellij.openapi.vcs.VcsDirectoryMapping; import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NonNls; @@ -44,6 +45,7 @@ public class PlatformVcsDetector implements ProjectComponent { if (myVcsManager.needAutodetectMappings()) { AbstractVcs vcs = myVcsManager.findVersioningVcs(file); if (vcs != null && vcs != myVcsManager.getVcsFor(file)) { + myVcsManager.removeDirectoryMapping(new VcsDirectoryMapping("", "")); myVcsManager.setAutoDirectoryMapping(file.getPath(), vcs.getName()); myVcsManager.cleanupMappings(); myVcsManager.updateActiveVcss();