ExcludedFileIndex -> FileIndexFacade; use it in PsiClassImplUtil
[idea/community.git] / platform / vcs-impl / src / com / intellij / openapi / vcs / changes / VcsGuess.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.vcs.changes;
17
18 import com.intellij.lifecycle.PeriodicalTasksCloser;
19 import com.intellij.openapi.application.ApplicationManager;
20 import com.intellij.openapi.components.StorageScheme;
21 import com.intellij.openapi.project.Project;
22 import com.intellij.openapi.project.ex.ProjectEx;
23 import com.intellij.openapi.roots.FileIndexFacade;
24 import com.intellij.openapi.util.Computable;
25 import com.intellij.openapi.vcs.AbstractVcs;
26 import com.intellij.openapi.vcs.FilePath;
27 import com.intellij.openapi.vcs.impl.ProjectLevelVcsManagerImpl;
28 import com.intellij.openapi.vfs.VfsUtil;
29 import com.intellij.openapi.vfs.VirtualFile;
30 import org.jetbrains.annotations.Nullable;
31
32 public class VcsGuess {
33   private final Project myProject;
34   private final ProjectLevelVcsManagerImpl myVcsManager;
35   private final FileIndexFacade myExcludedFileIndex;
36
37   VcsGuess(final Project project) {
38     myProject = project;
39     myVcsManager = (ProjectLevelVcsManagerImpl) ProjectLevelVcsManagerImpl.getInstance(myProject);
40     myExcludedFileIndex = PeriodicalTasksCloser.getInstance().safeGetService(myProject, FileIndexFacade.class);
41   }
42
43   @Nullable
44   public AbstractVcs getVcsForDirty(final VirtualFile file) {
45     if (!file.isInLocalFileSystem()) {
46       return null;
47     }
48     if (myExcludedFileIndex.isInContent(file) || isFileInBaseDir(file) ||
49         myVcsManager.hasExplicitMapping(file) || file.equals(myProject.getBaseDir())) {
50       if (myExcludedFileIndex.isExcludedFile(file)) {
51         return null;
52       }
53       return myVcsManager.getVcsFor(file);
54     }
55     return null;
56   }
57
58   @Nullable
59   public AbstractVcs getVcsForDirty(final FilePath filePath) {
60     if (filePath.isNonLocal()) {
61       return null;
62     }
63     final VirtualFile validParent = ApplicationManager.getApplication().runReadAction(new Computable<VirtualFile>() {
64       public VirtualFile compute() {
65         return ChangesUtil.findValidParent(filePath);
66       }
67     });
68     if (validParent == null) {
69       return null;
70     }
71     if (myExcludedFileIndex.isInContent(validParent) || isFileInBaseDir(filePath) ||
72         myVcsManager.hasExplicitMapping(validParent) || isInDirectoryBasedRoot(validParent)) {
73       if (myExcludedFileIndex.isExcludedFile(validParent)) {
74         return null;
75       }
76       return myVcsManager.getVcsFor(validParent);
77     }
78     return null;
79   }
80
81   private boolean isInDirectoryBasedRoot(final VirtualFile file) {
82     if (file == null) return false;
83     final StorageScheme storageScheme = ((ProjectEx) myProject).getStateStore().getStorageScheme();
84     if (StorageScheme.DIRECTORY_BASED.equals(storageScheme)) {
85       final VirtualFile baseDir = myProject.getBaseDir();
86       if (baseDir == null) return false;
87       final VirtualFile ideaDir = baseDir.findChild(Project.DIRECTORY_STORE_FOLDER);
88       return (ideaDir != null && ideaDir.isValid() && ideaDir.isDirectory() && VfsUtil.isAncestor(ideaDir, file, false));
89     }
90     return false;
91   }
92
93   private boolean isFileInBaseDir(final VirtualFile file) {
94     VirtualFile parent = file.getParent();
95     return !file.isDirectory() && parent != null && parent.equals(myProject.getBaseDir());
96   }
97
98   private boolean isFileInBaseDir(final FilePath filePath) {
99     final VirtualFile parent = filePath.getVirtualFileParent();
100     return !filePath.isDirectory() && parent != null && parent.equals(myProject.getBaseDir());
101   }
102 }