0da2de7917da1af0187382409546eb5d190a9370
[idea/community.git] / platform / vcs-api / src / com / intellij / openapi / vcs / ProjectLevelVcsManager.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;
17
18 import com.intellij.lifecycle.PeriodicalTasksCloser;
19 import com.intellij.openapi.application.ApplicationManager;
20 import com.intellij.openapi.editor.markup.TextAttributes;
21 import com.intellij.openapi.progress.ProcessCanceledException;
22 import com.intellij.openapi.project.Project;
23 import com.intellij.openapi.util.Computable;
24 import com.intellij.openapi.vcs.history.VcsHistoryCache;
25 import com.intellij.openapi.vcs.impl.VcsDescriptor;
26 import com.intellij.openapi.vcs.impl.VcsEnvironmentsProxyCreator;
27 import com.intellij.openapi.vcs.update.UpdatedFiles;
28 import com.intellij.openapi.vfs.VirtualFile;
29 import com.intellij.util.Processor;
30 import com.intellij.util.messages.Topic;
31 import org.jetbrains.annotations.NonNls;
32 import org.jetbrains.annotations.NotNull;
33 import org.jetbrains.annotations.Nullable;
34
35 import java.util.List;
36
37 /**
38  * Manages the version control systems used by a specific project.
39  */
40 public abstract class ProjectLevelVcsManager {
41   @NonNls public static final String FILE_VIEW_TOOL_WINDOW_ID = "File View";
42
43   /**
44    * Returns the <code>ProjectLevelVcsManager<code> instance for the specified project.
45    *
46    * @param project the project for which the instance is requested.
47    * @return the manager instance.
48    */
49   public static ProjectLevelVcsManager getInstance(Project project) {
50     return PeriodicalTasksCloser.getInstance().safeGetComponent(project, ProjectLevelVcsManager.class);
51   }
52
53   /**
54    * Gets the instance of the component if the project wasn't disposed. If the project was
55    * disposed, throws ProcessCanceledException. Should only be used for calling from background
56    * threads (for example, committed changes refresh thread).
57    *
58    * @param project the project for which the component instance should be retrieved.
59    * @return component instance
60    */
61   public static ProjectLevelVcsManager getInstanceChecked(final Project project) {
62     return ApplicationManager.getApplication().runReadAction(new Computable<ProjectLevelVcsManager>() {
63       public ProjectLevelVcsManager compute() {
64         if (project.isDisposed()) throw new ProcessCanceledException();
65         return getInstance(project);
66       }
67     });
68   }
69
70   /**
71    * Returns the list of all registered version control systems.
72    *
73    * @return the list of registered version control systems.
74    */
75   public abstract VcsDescriptor[] getAllVcss();
76
77   /**
78    * Returns the version control system with the specified name.
79    *
80    * @param name the name of the VCS to find.
81    * @return the VCS instance, or null if none is found.
82    */
83   public abstract AbstractVcs findVcsByName(@NonNls String name);
84
85   @Nullable
86   public abstract VcsDescriptor getDescriptor(final String name);
87   /**
88    * Checks if all files in the specified array are managed by the specified VCS.
89    *
90    * @param abstractVcs the VCS to check.
91    * @param files       the files to check.
92    * @return true if all files are managed by the VCS, false otherwise.
93    */
94   public abstract boolean checkAllFilesAreUnder(AbstractVcs abstractVcs, VirtualFile[] files);
95
96   /**
97    * Returns the VCS managing the specified file.
98    *
99    * @param file the file to check.
100    * @return the VCS instance, or null if the file does not belong to any module or the module
101    *         it belongs to is not under version control.
102    */
103   @Nullable
104   public abstract AbstractVcs getVcsFor(@NotNull VirtualFile file);
105
106   /**
107    * Returns the VCS managing the specified file path.
108    *
109    * @param file the file to check.
110    * @return the VCS instance, or null if the file does not belong to any module or the module
111    *         it belongs to is not under version control.
112    */
113   @Nullable
114   public abstract AbstractVcs getVcsFor(FilePath file);
115
116   /**
117    * Return the parent directory of the specified file which is mapped to a VCS.
118    *
119    * @param file the file for which the root is requested.
120    * @return the root, or null if the specified file is not in a VCS-managed directory.
121    */
122   @Nullable
123   public abstract VirtualFile getVcsRootFor(VirtualFile file);
124
125   /**
126    * Return the parent directory of the specified file path which is mapped to a VCS.
127    *
128    * @param file the file for which the root is requested.
129    * @return the root, or null if the specified file is not in a VCS-managed directory.
130    */
131   @Nullable
132   public abstract VirtualFile getVcsRootFor(FilePath file);
133
134   @Nullable
135   public abstract VcsRoot getVcsRootObjectFor(final VirtualFile file);
136   
137   @Nullable
138   public abstract VcsRoot getVcsRootObjectFor(FilePath file);
139
140   /**
141    * Checks if the specified VCS is used by any of the modules in the project.
142    *
143    * @param vcs the VCS to check.
144    * @return true if the VCS is used by any of the modules, false otherwise
145    */
146   public abstract boolean checkVcsIsActive(AbstractVcs vcs);
147
148   /**
149    * Checks if the VCS with the specified name is used by any of the modules in the project.
150    *
151    * @param vcsName the name of the VCS to check.
152    * @return true if the VCS is used by any of the modules, false otherwise
153    */
154   public abstract boolean checkVcsIsActive(@NonNls String vcsName);
155
156   /**
157    * Returns the list of VCSes used by at least one module in the project.
158    *
159    * @return the list of VCSes used in the project.
160    */
161   public abstract AbstractVcs[] getAllActiveVcss();
162
163   public abstract boolean hasActiveVcss();
164
165   public abstract boolean hasAnyMappings();
166
167   public abstract void addMessageToConsoleWindow(String message, TextAttributes attributes);
168
169   @NotNull
170   public abstract VcsShowSettingOption getStandardOption(@NotNull VcsConfiguration.StandardOption option,
171                                                          @NotNull AbstractVcs vcs);
172
173   @NotNull
174   public abstract VcsShowConfirmationOption getStandardConfirmation(@NotNull VcsConfiguration.StandardConfirmation option,
175                                                                     @NotNull AbstractVcs vcs);
176
177   @NotNull
178   public abstract VcsShowSettingOption getOrCreateCustomOption(@NotNull String vcsActionName,
179                                                                @NotNull AbstractVcs vcs);
180
181
182   public abstract void showProjectOperationInfo(final UpdatedFiles updatedFiles, String displayActionName);
183
184   /**
185    * Adds a listener for receiving notifications about changes in VCS configuration for the project.
186    *
187    * @param listener the listener instance.
188    * @deprecated use {@link #VCS_CONFIGURATION_CHANGED} instead
189    * @since 6.0
190    */
191   public abstract void addVcsListener(VcsListener listener);
192
193   /**
194    * Removes a listener for receiving notifications about changes in VCS configuration for the project.
195    *
196    * @param listener the listener instance.
197    * @deprecated use {@link #VCS_CONFIGURATION_CHANGED} instead
198    * @since 6.0
199    */
200   public abstract void removeVcsListener(VcsListener listener);
201
202   /**
203    * Marks the beginning of a background VCS operation (commit or update).
204    *
205    * @since 6.0
206    */
207   public abstract void startBackgroundVcsOperation();
208
209   /**
210    * Marks the end of a background VCS operation (commit or update).
211    *
212    * @since 6.0
213    */
214   public abstract void stopBackgroundVcsOperation();
215
216   /**
217    * Checks if a background VCS operation (commit or update) is currently in progress.
218    *
219    * @return true if a background operation is in progress, false otherwise.
220    * @since 6.0
221    */
222   public abstract boolean isBackgroundVcsOperationRunning();
223
224   public abstract List<VirtualFile> getRootsUnderVcsWithoutFiltering(final AbstractVcs vcs);
225   public abstract VirtualFile[] getRootsUnderVcs(AbstractVcs vcs);
226
227   /**
228    * Also includes into list all modules under roots
229    */
230   public abstract List<VirtualFile> getDetailedVcsMappings(final AbstractVcs vcs);
231
232   public abstract VirtualFile[] getAllVersionedRoots();
233
234   @NotNull
235   public abstract VcsRoot[] getAllVcsRoots();
236
237   public abstract void updateActiveVcss();
238
239   public abstract List<VcsDirectoryMapping> getDirectoryMappings();
240   public abstract List<VcsDirectoryMapping> getDirectoryMappings(AbstractVcs vcs);
241
242   @Nullable
243   public abstract VcsDirectoryMapping getDirectoryMappingFor(FilePath path);
244
245   /**
246    * This method can be used only when initially loading the project configuration!
247    */
248   public abstract void setDirectoryMapping(final String path, final String activeVcsName);
249
250   public abstract void setDirectoryMappings(final List<VcsDirectoryMapping> items);
251
252   public abstract void iterateVcsRoot(final VirtualFile root, final Processor<FilePath> iterator);
253
254   @Nullable
255   public abstract AbstractVcs findVersioningVcs(VirtualFile file);
256
257   public abstract CheckoutProvider.Listener getCompositeCheckoutListener();
258
259   public static Topic<VcsListener> VCS_CONFIGURATION_CHANGED = Topic.create("VCS configuration changed", VcsListener.class);
260
261   public abstract VcsEventsListenerManager getVcsEventsListenerManager();
262   protected abstract VcsEnvironmentsProxyCreator getProxyCreator();
263
264   public abstract VcsHistoryCache getVcsHistoryCache();
265   public abstract boolean isFileInContent(final VirtualFile vf);
266 }