diff --git a/platform/platform-resources/src/META-INF/VcsExtensions.xml b/platform/platform-resources/src/META-INF/VcsExtensions.xml index 09da555cce7e..923d3ae8453b 100644 --- a/platform/platform-resources/src/META-INF/VcsExtensions.xml +++ b/platform/platform-resources/src/META-INF/VcsExtensions.xml @@ -38,6 +38,8 @@ serviceImplementation="com.intellij.openapi.vcs.contentAnnotation.ContentAnnotationCacheImpl"/> + @@ -131,7 +133,8 @@ - + + diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileContentProvider.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileContentProvider.java index e2d85498dc5a..eded10ef4173 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileContentProvider.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileContentProvider.java @@ -3,6 +3,7 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.vcs.VcsKey; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; /** @@ -18,5 +19,5 @@ public interface IgnoredFileContentProvider { String getFileName(); @NotNull - String buildIgnoreFileContent(@NotNull IgnoredFileProvider[] ignoredFileProviders); + String buildIgnoreFileContent(@NotNull VirtualFile ignoreFileRoot, @NotNull IgnoredFileProvider[] ignoredFileProviders); } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileGenerator.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileGenerator.java index 04fdd082d816..468f1f5ec737 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileGenerator.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileGenerator.java @@ -2,6 +2,7 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.vcs.AbstractVcs; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import java.io.IOException; @@ -13,5 +14,5 @@ import java.io.IOException; */ public interface IgnoredFileGenerator { - boolean generateFile(@NotNull AbstractVcs vcs) throws IOException; + boolean generateFile(@NotNull VirtualFile ignoreFileRoot, @NotNull AbstractVcs vcs) throws IOException; } diff --git a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileProvider.java b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileProvider.java index 909cc534665d..55d5f6f0e418 100644 --- a/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileProvider.java +++ b/platform/vcs-api/src/com/intellij/openapi/vcs/changes/IgnoredFileProvider.java @@ -18,6 +18,7 @@ package com.intellij.openapi.vcs.changes; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.project.Project; import com.intellij.openapi.vcs.FilePath; +import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import java.util.Set; @@ -32,7 +33,7 @@ public interface IgnoredFileProvider { boolean isIgnoredFile(@NotNull Project project, @NotNull FilePath filePath); @NotNull - Set getIgnoredFilesMasks(@NotNull Project project); + Set getIgnoredFilesMasks(@NotNull Project project, @NotNull VirtualFile ignoreFileRoot); @NotNull String getMasksGroupDescription(); diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java index c3157ed68a53..0eabaf70edb0 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ChangeListManagerImpl.java @@ -62,7 +62,6 @@ import javax.swing.*; import java.io.File; import java.util.*; import java.util.concurrent.*; -import java.util.stream.Collectors; import static com.intellij.openapi.project.Project.DIRECTORY_STORE_FOLDER; import static com.intellij.openapi.vcs.ProjectLevelVcsManager.VCS_CONFIGURATION_CHANGED; @@ -1536,8 +1535,7 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec @Override public boolean isIgnoredFile(@NotNull Project project, @NotNull FilePath filePath) { IProjectStore store = ProjectKt.getStateStore(project); - return getInstanceImpl(project).myIgnoredIdeaLevel.isIgnoredFile(filePath) - || (!ProjectKt.isDirectoryBased(project) && FileUtilRt.extensionEquals(filePath.getPath(), WorkspaceFileType.DEFAULT_EXTENSION)) + return (!ProjectKt.isDirectoryBased(project) && FileUtilRt.extensionEquals(filePath.getPath(), WorkspaceFileType.DEFAULT_EXTENSION)) || StringsKt.equals(filePath.getPath(), store.getWorkspaceFilePath(), !SystemInfo.isFileSystemCaseSensitive) || isShelfDirOrInsideIt(filePath, project); } @@ -1549,42 +1547,34 @@ public class ChangeListManagerImpl extends ChangeListManagerEx implements Projec @NotNull @Override - public Set getIgnoredFilesMasks(@NotNull Project project) { - Set masks = ContainerUtil.newHashSet(); - masks.addAll(getProjectExcludePathsRelativeTo(project)); - @SystemIndependent String projectBasePath = project.getBasePath(); - if (projectBasePath != null) { - String relativeShelfPath = - FileUtil.getRelativePath(projectBasePath, ShelveChangesManager.getDefaultShelfPath(project), File.separatorChar); - if (relativeShelfPath != null) { - masks.add(relativeShelfPath); + public Set getIgnoredFilesMasks(@NotNull Project project, @NotNull VirtualFile ignoreFileRoot) { + Set masks = ContainerUtil.newLinkedHashSet(); + @SystemIndependent String projectBasePath = project.getBasePath(); + if (projectBasePath == null) return masks; + + if (FileUtil.isAncestor(ignoreFileRoot.getPath(), projectBasePath, false)) { + String defaultShelfPath = ShelveChangesManager.getDefaultShelfPath(project); + if (FileUtil.isAncestor(projectBasePath, defaultShelfPath, true)) { + String relativeShelfPath = + FileUtil.getRelativePath(projectBasePath, defaultShelfPath, '/'); + if (relativeShelfPath != null) { + masks.add("/" + relativeShelfPath + "/"); + } } } + String workspaceFilePath = ProjectKt.getStateStore(project).getWorkspaceFilePath(); if (ProjectKt.isDirectoryBased(project)) { - masks.add(DIRECTORY_STORE_FOLDER + "/workspace.xml"); + if (workspaceFilePath != null && FileUtil.isAncestor(ignoreFileRoot.getPath(), workspaceFilePath, false)) { + masks.add("/" + DIRECTORY_STORE_FOLDER + "/workspace.xml"); + } } else { masks.add("*." + WorkspaceFileType.DEFAULT_EXTENSION); } + return ContainerUtil.unmodifiableOrEmptySet(masks); } - @NotNull - private static Set getProjectExcludePathsRelativeTo(@NotNull Project project) { - Set paths = ContainerUtil.newHashSet(); - @SystemIndependent String basePath = project.getBasePath(); - assert basePath != null : "Doesn't support default projects"; - - for (Module module : ModuleManager.getInstance(project).getModules()) { - VirtualFile[] roots = ModuleRootManager.getInstance(module).getExcludeRoots(); - paths.addAll(Arrays.stream(roots) - .filter((root) -> FileUtil.isAncestor(basePath, root.getPath(), true)) - .map((root) -> FileUtil.getRelativePath(basePath, root.getPath(), File.separatorChar)) - .collect(Collectors.toSet())); - } - return paths; - } - @NotNull @Override public String getMasksGroupDescription() { diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFileGeneratorImpl.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFileGeneratorImpl.java index a7f1cc9c1cdb..954a6367f52a 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFileGeneratorImpl.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/IgnoredFileGeneratorImpl.java @@ -1,8 +1,8 @@ // Copyright 2000-2018 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. package com.intellij.openapi.vcs.changes; -import com.intellij.ide.util.PropertiesComponent; import com.intellij.notification.NotificationAction; +import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.OpenFileDescriptor; import com.intellij.openapi.project.Project; @@ -13,23 +13,23 @@ import com.intellij.openapi.vcs.VcsBundle; import com.intellij.openapi.vcs.VcsNotifier; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; +import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.encoding.EncodingProjectManager; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.SystemIndependent; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.Set; public class IgnoredFileGeneratorImpl implements IgnoredFileGenerator { private static final Logger LOG = Logger.getInstance(IgnoredFileGeneratorImpl.class); - private static final String IGNORE_FILE_GENERATED_PROPERTY = "VCS_IGNOREFILE_GENERATED"; - private final Project myProject; private final Object myWriteLock = new Object(); @@ -39,23 +39,25 @@ public class IgnoredFileGeneratorImpl implements IgnoredFileGenerator { } @Override - public boolean generateFile(@NotNull AbstractVcs vcs) throws IOException { - if (!needGenerateIgnoreFile(myProject)) { - LOG.debug("Skip VCS ignore file generation"); - return false; - } - + public boolean generateFile(@NotNull VirtualFile ignoreFileRoot, @NotNull AbstractVcs vcs) throws IOException { IgnoredFileContentProvider ignoredFileContentProvider = findIgnoredFileContentProvider(vcs); if (ignoredFileContentProvider == null) { LOG.debug("Cannot find content provider for vcs " + vcs.getName()); return false; } + String ignoreFileName = ignoredFileContentProvider.getFileName(); + + if (!needGenerateIgnoreFile(myProject, ignoreFileRoot)) { + LOG.debug("Skip VCS ignore file generation"); + return false; + } + synchronized (myWriteLock) { - File ignoreFile = getIgnoreFile(ignoredFileContentProvider.getFileName()); + File ignoreFile = getIgnoreFile(ignoreFileRoot, ignoreFileName); if (!ignoreFile.exists()) { String projectCharsetName = EncodingProjectManager.getInstance(myProject).getDefaultCharsetName(); - String ignoreFileContent = ignoredFileContentProvider.buildIgnoreFileContent(IgnoredFileProvider.IGNORE_FILE.getExtensions()); + String ignoreFileContent = ignoredFileContentProvider.buildIgnoreFileContent(ignoreFileRoot, IgnoredFileProvider.IGNORE_FILE.getExtensions()); FileUtil.writeToFile(ignoreFile, ignoreFileContent.getBytes(projectCharsetName)); LocalFileSystem.getInstance().refreshIoFiles(Collections.singleton(ignoreFile)); notifyAboutIgnoreFileGeneration(ignoreFile); @@ -74,16 +76,13 @@ public class IgnoredFileGeneratorImpl implements IgnoredFileGenerator { } @NotNull - private File getIgnoreFile(@NotNull String fileName) { - @SystemIndependent String basePath = myProject.getBasePath(); - assert basePath != null : "Doesn't support default projects"; - - return new File(basePath, fileName); + private static File getIgnoreFile(@NotNull VirtualFile ignoreFileRoot, @NotNull String ignoreFileName) { + File vcsRootFile = VfsUtilCore.virtualToIoFile(ignoreFileRoot); + return new File(vcsRootFile.getPath(), ignoreFileName); } private void notifyAboutIgnoreFileGeneration(@NotNull File ignoreFile) { - PropertiesComponent propertiesComponent = PropertiesComponent.getInstance(myProject); - propertiesComponent.setValue(IGNORE_FILE_GENERATED_PROPERTY, true); + IgnoredFileRootStore.getInstance(myProject).addRoot(ignoreFile.getParent()); VcsNotifier.getInstance(myProject) .notifyMinorInfo("", VcsBundle.message("ignored.file.generation.message", ignoreFile.getName()), @@ -99,10 +98,47 @@ public class IgnoredFileGeneratorImpl implements IgnoredFileGenerator { })); } - private static boolean needGenerateIgnoreFile(@NotNull Project project) { - boolean wasGeneratedPreviously = PropertiesComponent.getInstance(project).getBoolean(IGNORE_FILE_GENERATED_PROPERTY, false); - LOG.debug("Ignore file generated previously " + wasGeneratedPreviously); + private static boolean needGenerateIgnoreFile(@NotNull Project project, @NotNull VirtualFile ignoreFileRoot) { + boolean wasGeneratedPreviously = IgnoredFileRootStore.getInstance(project).containsRoot(ignoreFileRoot.getPath()); + if (wasGeneratedPreviously) { + LOG.debug("Ignore file generated previously for root " + ignoreFileRoot.getPath()); + } boolean needGenerateRegistryFlag = Registry.is("vcs.ignorefile.generation", true); return !wasGeneratedPreviously && needGenerateRegistryFlag; } + + @State(name = "IgnoredFileRootStore", storages = {@Storage(StoragePathMacros.WORKSPACE_FILE)}) + static class IgnoredFileRootStore implements PersistentStateComponent { + + static class State { + public Set generatedRoots = ContainerUtil.newHashSet(); + } + + State myState; + + static IgnoredFileRootStore getInstance(Project project) { + return ServiceManager.getService(project, IgnoredFileRootStore.class); + } + + boolean containsRoot(@NotNull String root) { + return myState != null && myState.generatedRoots.contains(root); + } + + void addRoot(@NotNull String root) { + if (myState != null) { + myState.generatedRoots.add(root); + } + } + + @Nullable + @Override + public State getState() { + return myState; + } + + @Override + public void loadState(@NotNull State state) { + myState = state; + } + } } diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt new file mode 100644 index 000000000000..0488e7cd2c8f --- /dev/null +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/ProjectExcludesIgnoredFileProvider.kt @@ -0,0 +1,33 @@ +// Copyright 2000-2018 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. +package com.intellij.openapi.vcs.changes + +import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.project.Project +import com.intellij.openapi.roots.ModuleRootManager +import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.vcs.FilePath +import com.intellij.openapi.vcs.changes.ChangeListManagerImpl.getInstanceImpl +import com.intellij.openapi.vcs.changes.ui.ChangesComparator +import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFile + +class ProjectExcludesIgnoredFileProvider : IgnoredFileProvider { + + override fun isIgnoredFile(project: Project, filePath: FilePath) = getInstanceImpl(project).ignoredFilesComponent.isIgnoredFile(filePath) + + override fun getIgnoredFilesMasks(project: Project, ignoreFileRoot: VirtualFile) = getProjectExcludePathsRelativeTo(project, + ignoreFileRoot) + + override fun getMasksGroupDescription() = "Project exclude paths" + + private fun getProjectExcludePathsRelativeTo(project: Project, ignoreFileRoot: VirtualFile): Set { + val excludes = sortedSetOf(ChangesComparator.getVirtualFileComparator(false)) + + for (module in ModuleManager.getInstance(project).modules) { + val roots = ModuleRootManager.getInstance(module).excludeRoots + excludes.addAll(roots.filter { root -> VfsUtilCore.isAncestor(ignoreFileRoot, root, false) }) + } + + return excludes.map { root -> "/" + FileUtil.getRelativePath(ignoreFileRoot.path, root.path, '/')!! + '/' }.toSet() + } +} \ No newline at end of file diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreFilesChecker.kt b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreFilesChecker.kt index e1521c2217b5..dcedb9cc2085 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreFilesChecker.kt +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/changes/VcsIgnoreFilesChecker.kt @@ -4,10 +4,10 @@ package com.intellij.openapi.vcs.changes import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.DumbAware import com.intellij.openapi.project.Project +import com.intellij.openapi.project.guessProjectDir import com.intellij.openapi.startup.StartupActivity -import com.intellij.openapi.vcs.ProjectLevelVcsManager -import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.vcsUtil.VcsImplUtil +import com.intellij.vcsUtil.VcsUtil private val LOG = Logger.getInstance("#com.intellij.openapi.vcs.changes.VcsIgnoreFilesChecker") @@ -16,12 +16,12 @@ class VcsIgnoreFilesChecker : StartupActivity, DumbAware { override fun runActivity(project: Project) = generateVcsIgnoreFileIfNeeded(project) private fun generateVcsIgnoreFileIfNeeded(project: Project) { - val basePath = project.basePath - val projectBaseDir = if (basePath != null) LocalFileSystem.getInstance().findFileByPath(basePath) else null - val vcs = ProjectLevelVcsManager.getInstance(project).findVersioningVcs(projectBaseDir) + //at the moment we check and generate if needed ignore file only for projectDir. In future we can utilize VcsRootDetector for that purpose + val projectDir = project.guessProjectDir() ?: return + val vcs = VcsUtil.getVcsFor(project, projectDir) if (vcs != null) { LOG.debug("Generate VCS file for $vcs") - VcsImplUtil.generateIgnoreFileIfNeeded(project, vcs) + VcsImplUtil.generateIgnoreFileIfNeeded(project, vcs, projectDir) } } } \ No newline at end of file diff --git a/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsIntegrationEnabler.java b/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsIntegrationEnabler.java index fdb6b6b20721..a57ede553a97 100644 --- a/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsIntegrationEnabler.java +++ b/platform/vcs-impl/src/com/intellij/openapi/vcs/roots/VcsIntegrationEnabler.java @@ -54,7 +54,7 @@ public abstract class VcsIntegrationEnabler { if (roots.isEmpty()) { boolean succeeded = initOrNotifyError(projectDir); if (succeeded) { - VcsImplUtil.generateIgnoreFileIfNeeded(myProject, myVcs); + VcsImplUtil.generateIgnoreFileIfNeeded(myProject, myVcs, projectDir); addVcsRoots(Collections.singleton(projectDir)); } } diff --git a/platform/vcs-impl/src/com/intellij/vcsUtil/VcsImplUtil.java b/platform/vcs-impl/src/com/intellij/vcsUtil/VcsImplUtil.java index 25a3b27f26be..9ef99a3f7a30 100644 --- a/platform/vcs-impl/src/com/intellij/vcsUtil/VcsImplUtil.java +++ b/platform/vcs-impl/src/com/intellij/vcsUtil/VcsImplUtil.java @@ -55,14 +55,16 @@ public class VcsImplUtil { return Registry.is("vcs.non.modal.commit"); } - public static boolean generateIgnoreFileIfNeeded(@NotNull Project project, @NotNull AbstractVcs vcs) { + public static boolean generateIgnoreFileIfNeeded(@NotNull Project project, + @NotNull AbstractVcs vcs, + @NotNull VirtualFile ignoreFileRoot) { IgnoredFileGenerator ignoredFileGenerator = ServiceManager.getService(project, IgnoredFileGenerator.class); if (ignoredFileGenerator == null) { LOG.debug("Cannot find ignore file ignoredFileGenerator for " + vcs.getName() + " VCS"); return false; } try { - return ignoredFileGenerator.generateFile(vcs); + return ignoredFileGenerator.generateFile(ignoreFileRoot, vcs); } catch (IOException e) { LOG.warn(e); diff --git a/plugins/git4idea/remote-servers-git/src/com/intellij/remoteServer/util/CloudGitDeploymentRuntime.java b/plugins/git4idea/remote-servers-git/src/com/intellij/remoteServer/util/CloudGitDeploymentRuntime.java index c129451cc4d7..aa5b26ef22b8 100644 --- a/plugins/git4idea/remote-servers-git/src/com/intellij/remoteServer/util/CloudGitDeploymentRuntime.java +++ b/plugins/git4idea/remote-servers-git/src/com/intellij/remoteServer/util/CloudGitDeploymentRuntime.java @@ -352,7 +352,7 @@ public class CloudGitDeploymentRuntime extends CloudDeploymentRuntime { protected void refreshApplicationRepository() { Project project = getProject(); GitInit.refreshAndConfigureVcsMappings(project, getRepositoryRoot(), getRepositoryRootFile().getAbsolutePath()); - GitUtil.generateGitignoreFileIfNeeded(project); + GitUtil.generateGitignoreFileIfNeeded(project, getRepositoryRoot()); } protected void pushApplication(@NotNull CloudGitApplication application) throws ServerRuntimeException { diff --git a/plugins/git4idea/src/git4idea/GitUtil.java b/plugins/git4idea/src/git4idea/GitUtil.java index b137e64225ca..3c4e80593958 100644 --- a/plugins/git4idea/src/git4idea/GitUtil.java +++ b/plugins/git4idea/src/git4idea/GitUtil.java @@ -1049,7 +1049,7 @@ public class GitUtil { return findRealRepositoryDir(rootDir, pathToDir) != null; } - public static void generateGitignoreFileIfNeeded(@NotNull Project project){ - VcsImplUtil.generateIgnoreFileIfNeeded(project, GitVcs.getInstance(project)); + public static void generateGitignoreFileIfNeeded(@NotNull Project project, @NotNull VirtualFile ignoreFileRoot) { + VcsImplUtil.generateIgnoreFileIfNeeded(project, GitVcs.getInstance(project), ignoreFileRoot); } } diff --git a/plugins/git4idea/src/git4idea/actions/GitInit.java b/plugins/git4idea/src/git4idea/actions/GitInit.java index 40004673c40d..9c4fd4e2c886 100644 --- a/plugins/git4idea/src/git4idea/actions/GitInit.java +++ b/plugins/git4idea/src/git4idea/actions/GitInit.java @@ -69,7 +69,7 @@ public class GitInit extends DumbAwareAction { @Override public void run(@NotNull ProgressIndicator indicator) { refreshAndConfigureVcsMappings(project, root, root.getPath()); - GitUtil.generateGitignoreFileIfNeeded(project); + GitUtil.generateGitignoreFileIfNeeded(project, root); } }); }); diff --git a/plugins/git4idea/src/git4idea/ignore/GitIgnoredFileContentProvider.kt b/plugins/git4idea/src/git4idea/ignore/GitIgnoredFileContentProvider.kt index d3730a6124d5..873bf780c579 100644 --- a/plugins/git4idea/src/git4idea/ignore/GitIgnoredFileContentProvider.kt +++ b/plugins/git4idea/src/git4idea/ignore/GitIgnoredFileContentProvider.kt @@ -5,6 +5,7 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.vcs.VcsKey import com.intellij.openapi.vcs.changes.IgnoredFileContentProvider import com.intellij.openapi.vcs.changes.IgnoredFileProvider +import com.intellij.openapi.vfs.VirtualFile import git4idea.GitVcs import git4idea.repo.GitRepositoryFiles.GITIGNORE import java.lang.System.lineSeparator @@ -15,19 +16,19 @@ open class GitIgnoredFileContentProvider(private val project: Project) : Ignored override fun getFileName() = GITIGNORE - override fun buildIgnoreFileContent(ignoredFileProviders: Array): String { + override fun buildIgnoreFileContent(ignoreFileRoot: VirtualFile, ignoredFileProviders: Array): String { val content = StringBuilder() for (i in ignoredFileProviders.indices) { val provider = ignoredFileProviders[i] - val translatedMasks = provider.getIgnoredFilesMasks(project) - if (translatedMasks.isEmpty()) continue + val ignoredFileMasks = provider.getIgnoredFilesMasks(project, ignoreFileRoot) + if (ignoredFileMasks.isEmpty()) continue val description = provider.masksGroupDescription if (description.isNotBlank()) { content.append(prependCommentHashCharacterIfNeeded(description)) content.append(lineSeparator()) } - content.append(translatedMasks.joinToString(lineSeparator())) + content.append(ignoredFileMasks.joinToString(lineSeparator())) if (i + 1 < ignoredFileProviders.size) { content.append(lineSeparator()).append(lineSeparator()) diff --git a/plugins/git4idea/tests/git4idea/ignore/GitIgnoredFileTest.kt b/plugins/git4idea/tests/git4idea/ignore/GitIgnoredFileTest.kt index 446dbfe03af3..2174fe6a9f31 100644 --- a/plugins/git4idea/tests/git4idea/ignore/GitIgnoredFileTest.kt +++ b/plugins/git4idea/tests/git4idea/ignore/GitIgnoredFileTest.kt @@ -20,7 +20,7 @@ class GitIgnoredFileTest : GitPlatformTest() { override fun setUp() { super.setUp() createRepository(project, projectPath) - GitUtil.generateGitignoreFileIfNeeded(project) + GitUtil.generateGitignoreFileIfNeeded(project, projectRoot) } override fun setUpModule() { @@ -45,17 +45,20 @@ class GitIgnoredFileTest : GitPlatformTest() { val projectCharset = EncodingProjectManager.getInstance(project).defaultCharset val gitIgnoreExpectedContentList = """ # Default ignored files + /.shelf/ *.iws - .shelf - $OUT - $EXCLUDED - $EXCLUDED_CHILD_DIR + + # Project exclude paths + /$EXCLUDED/ + /$EXCLUDED_CHILD_DIR/ + /$OUT/ """.trimIndent().lines() val gitIgnoreFile = File("$projectPath/$GITIGNORE") assertTrue(gitIgnoreFile.exists()) val generatedGitIgnoreContent = gitIgnoreFile.readText(projectCharset) assertFalse("Generated ignore file is empty", generatedGitIgnoreContent.isBlank()) - assertContainsElements(generatedGitIgnoreContent.lines(), gitIgnoreExpectedContentList) + assertFalse("Generated ignore file content should be system-independent", generatedGitIgnoreContent.contains('\\')) + assertContainsOrdered(generatedGitIgnoreContent.lines(), gitIgnoreExpectedContentList) } private fun VirtualFile.findOrCreateDir(dirName: String) = this.findChild(dirName) ?: createChildDirectory(this, dirName) diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.kt b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.kt index 31e559fc2862..8727700427c1 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.kt +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.kt @@ -236,7 +236,7 @@ class GithubShareAction : DumbAwareAction("Share Project on GitHub", "Easily sha return false } GitInit.refreshAndConfigureVcsMappings(project, root, root.path) - GitUtil.generateGitignoreFileIfNeeded(project) + GitUtil.generateGitignoreFileIfNeeded(project, root) return true }