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
;
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
) {
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()) {
50 // assertion for read access inside
51 final Module
[] modules
= ApplicationManager
.getApplication().runReadAction(new Computable
<Module
[]>() {
52 public Module
[] compute() {
53 return myModuleManager
.getModules();
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
)) {
70 public boolean matchesDefaultMapping(final VirtualFile file
, final Object matchContext
) {
71 if (matchContext
!= null) {
74 if (myBaseDir
!= null && VfsUtil
.isAncestor(myBaseDir
, file
, false)) {
75 return !ProjectRootManager
.getInstance(myProject
).getFileIndex().isIgnored(file
);
81 public Object
getMatchContext(final VirtualFile file
) {
82 return ModuleUtil
.findModuleForFile(file
, myProject
);
86 public VirtualFile
getVcsRootFor(final VirtualFile file
) {
87 if (myBaseDir
!= null && ExcludedFileIndex
.getInstance(myProject
).isValidAncestor(myBaseDir
, file
)) {
90 final VirtualFile contentRoot
= ProjectRootManager
.getInstance(myProject
).getFileIndex().getContentRootForFile(file
);
91 if (contentRoot
!= null) {
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)) {
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
);
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
);
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
);