VCS: "locally deleted" under .idea fix
[fedora-idea.git] / platform / lang-impl / src / com / intellij / openapi / vcs / impl / ModuleDefaultVcsRootPolicy.java
blob1b54cb437e956903bf48a2c72ad43ef06176566f
1 package com.intellij.openapi.vcs.impl;
3 import com.intellij.openapi.application.ApplicationManager;
4 import com.intellij.openapi.components.StorageScheme;
5 import com.intellij.openapi.module.Module;
6 import com.intellij.openapi.module.ModuleManager;
7 import com.intellij.openapi.module.ModuleUtil;
8 import com.intellij.openapi.project.Project;
9 import com.intellij.openapi.project.ex.ProjectEx;
10 import com.intellij.openapi.roots.ModuleRootManager;
11 import com.intellij.openapi.roots.ProjectRootManager;
12 import com.intellij.openapi.util.Computable;
13 import com.intellij.openapi.vcs.*;
14 import com.intellij.openapi.vcs.changes.DirtBuilder;
15 import com.intellij.openapi.vcs.changes.FilePathUnderVcs;
16 import com.intellij.openapi.vcs.changes.VcsGuess;
17 import com.intellij.openapi.vcs.ex.ProjectLevelVcsManagerEx;
18 import com.intellij.openapi.vcs.impl.projectlevelman.NewMappings;
19 import com.intellij.openapi.vfs.VfsUtil;
20 import com.intellij.openapi.vfs.VirtualFile;
21 import org.jetbrains.annotations.Nullable;
23 import java.util.List;
25 /**
26 * @author yole
28 public class ModuleDefaultVcsRootPolicy extends DefaultVcsRootPolicy {
29 private final Project myProject;
30 private final VirtualFile myBaseDir;
31 private final ModuleManager myModuleManager;
33 public ModuleDefaultVcsRootPolicy(final Project project) {
34 myProject = project;
35 myBaseDir = project.getBaseDir();
36 myModuleManager = ModuleManager.getInstance(myProject);
39 public void addDefaultVcsRoots(final NewMappings mappingList, final AbstractVcs vcs, final List<VirtualFile> result) {
40 if (myBaseDir != null && vcs.getName().equals(mappingList.getVcsFor(myBaseDir)) && vcs.fileIsUnderVcs(new FilePathImpl(myBaseDir))) {
41 result.add(myBaseDir);
43 final StorageScheme storageScheme = ((ProjectEx) myProject).getStateStore().getStorageScheme();
44 if (StorageScheme.DIRECTORY_BASED.equals(storageScheme)) {
45 final VirtualFile ideaDir = myBaseDir.findChild(Project.DIRECTORY_STORE_FOLDER);
46 if (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory()) {
47 result.add(ideaDir);
50 // assertion for read access inside
51 final Module[] modules = ApplicationManager.getApplication().runReadAction(new Computable<Module[]>() {
52 public Module[] compute() {
53 return myModuleManager.getModules();
55 });
56 for(Module module: modules) {
57 final VirtualFile[] files = ModuleRootManager.getInstance(module).getContentRoots();
58 for(VirtualFile file: files) {
59 // if we're currently processing moduleAdded notification, getModuleForFile() will return null, so we pass the module
60 // explicitly (we know it anyway)
61 VcsDirectoryMapping mapping = mappingList.getMappingFor(file, module);
62 final String mappingVcs = mapping != null ? mapping.getVcs() : null;
63 if (vcs.getName().equals(mappingVcs)) {
64 result.add(file);
70 public boolean matchesDefaultMapping(final VirtualFile file, final Object matchContext) {
71 if (matchContext != null) {
72 return true;
74 if (myBaseDir != null && VfsUtil.isAncestor(myBaseDir, file, false)) {
75 return !ProjectRootManager.getInstance(myProject).getFileIndex().isIgnored(file);
77 return false;
80 @Nullable
81 public Object getMatchContext(final VirtualFile file) {
82 return ModuleUtil.findModuleForFile(file, myProject);
85 @Nullable
86 public VirtualFile getVcsRootFor(final VirtualFile file) {
87 if (myBaseDir != null && ExcludedFileIndex.getInstance(myProject).isValidAncestor(myBaseDir, file)) {
88 return myBaseDir;
90 final VirtualFile contentRoot = ProjectRootManager.getInstance(myProject).getFileIndex().getContentRootForFile(file);
91 if (contentRoot != null) {
92 return contentRoot;
94 final StorageScheme storageScheme = ((ProjectEx) myProject).getStateStore().getStorageScheme();
95 if (StorageScheme.DIRECTORY_BASED.equals(storageScheme)) {
96 final VirtualFile ideaDir = myBaseDir.findChild(Project.DIRECTORY_STORE_FOLDER);
97 if (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory()) {
98 if (VfsUtil.isAncestor(ideaDir, file, false)) {
99 return ideaDir;
103 return null;
106 public void markDefaultRootsDirty(final DirtBuilder builder, final VcsGuess vcsGuess) {
107 final VirtualFile baseDir = myProject.getBaseDir();
109 final Module[] modules = myModuleManager.getModules();
110 final StorageScheme storageScheme = ((ProjectEx) myProject).getStateStore().getStorageScheme();
111 if (StorageScheme.DIRECTORY_BASED.equals(storageScheme)) {
112 final FilePathImpl fp = new FilePathImpl(baseDir, Project.DIRECTORY_STORE_FOLDER, true);
113 final AbstractVcs vcs = vcsGuess.getVcsForDirty(fp);
114 if (vcs != null) {
115 builder.addDirtyDirRecursively(new FilePathUnderVcs(fp, vcs));
119 for(Module module: modules) {
120 final VirtualFile[] files = ModuleRootManager.getInstance(module).getContentRoots();
121 for(VirtualFile file: files) {
122 final AbstractVcs vcs = vcsGuess.getVcsForDirty(file);
123 if (vcs != null) {
124 builder.addDirtyDirRecursively(new VcsRoot(vcs, file));
129 final ProjectLevelVcsManager plVcsManager = ProjectLevelVcsManager.getInstance(myProject);
130 final String defaultMapping = ((ProjectLevelVcsManagerEx)plVcsManager).haveDefaultMapping();
131 final boolean haveDefaultMapping = (defaultMapping != null) && (defaultMapping.length() > 0);
132 if (haveDefaultMapping) {
133 builder.addDirtyFile(new VcsRoot(plVcsManager.findVcsByName(defaultMapping), baseDir));
136 final VcsRoot[] vcsRoots = plVcsManager.getAllVcsRoots();
137 for (VcsRoot root : vcsRoots) {
138 if (! root.path.equals(baseDir)) {
139 builder.addDirtyDirRecursively(root);