Vcs Repository Manager refactoring: recently added ugly api method removed; validation method optimized and reused; getRepositoryForRoot method without refresh provided only in impl module

This commit is contained in:
Nadya Zabrodina
2015-05-08 15:52:36 +04:00
parent 07feeea9d1
commit 1271bb77f3
5 changed files with 28 additions and 28 deletions
@@ -47,9 +47,6 @@ public interface RepositoryManager<T extends Repository> {
@Nullable
T getRepositoryForFile(@NotNull VirtualFile file);
@Nullable
T getRepositoryForFile(@NotNull VirtualFile file, boolean updateIfNeeded);
/**
* Returns the {@link Repository} which the given file belongs to, or {@code null} if the file is not under any Git ot Hg repository.
*/
@@ -29,9 +29,12 @@ public abstract class AbstractRepositoryManager<T extends Repository>
@Override
@Nullable
public T getRepositoryForRoot(@Nullable VirtualFile root) {
Repository repository = myGlobalRepositoryManager.getRepositoryForRoot(root, true);
//noinspection unchecked
return isRootValid(repository) ? (T)repository : null;
return validateAndGetRepository(myGlobalRepositoryManager.getRepositoryForRoot(root));
}
@Nullable
public T getRepositoryForRootQuick(@Nullable VirtualFile root) {
return validateAndGetRepository(myGlobalRepositoryManager.getRepositoryForRootQuick(root));
}
@Override
@@ -52,15 +55,7 @@ public abstract class AbstractRepositoryManager<T extends Repository>
@Override
@Nullable
public T getRepositoryForFile(@NotNull VirtualFile file) {
return getRepositoryForFile(file, true);
}
@Override
@Nullable
public T getRepositoryForFile(@NotNull VirtualFile file, boolean updateIfNeeded) {
Repository repository = myGlobalRepositoryManager.getRepositoryForFile(file, updateIfNeeded);
//noinspection unchecked
return repository != null && myVcs.equals(repository.getVcs()) ? (T)repository : null;
return validateAndGetRepository(myGlobalRepositoryManager.getRepositoryForFile(file));
}
@Override
@@ -103,9 +98,11 @@ public abstract class AbstractRepositoryManager<T extends Repository>
});
}
private boolean isRootValid(@Nullable Repository repository) {
if (repository == null || !myVcs.equals(repository.getVcs())) return false;
@Nullable
private T validateAndGetRepository(@Nullable Repository repository) {
if (repository == null || !myVcs.equals(repository.getVcs())) return null;
VirtualFile vcsDir = repository.getRoot().findChild(myRepoDirName);
return vcsDir != null && vcsDir.exists();
//noinspection unchecked
return vcsDir != null && vcsDir.exists() ? (T)repository : null;
}
}
@@ -80,17 +80,22 @@ public class VcsRepositoryManager extends AbstractProjectComponent implements Di
@Nullable
public Repository getRepositoryForFile(@NotNull VirtualFile file) {
return getRepositoryForFile(file, true);
}
@Nullable
public Repository getRepositoryForFile(@NotNull VirtualFile file, boolean updateIfNeeded) {
final VcsRoot vcsRoot = myVcsManager.getVcsRootObjectFor(file);
return vcsRoot != null ? getRepositoryForRoot(vcsRoot.getPath(), updateIfNeeded) : null;
return vcsRoot != null ? getRepositoryForRoot(vcsRoot.getPath()) : null;
}
@Nullable
public Repository getRepositoryForRoot(@Nullable VirtualFile root, boolean updateIfNeeded) {
public Repository getRepositoryForRootQuick(@Nullable VirtualFile root) {
return getRepositoryForRoot(root, false);
}
@Nullable
public Repository getRepositoryForRoot(@Nullable VirtualFile root) {
return getRepositoryForRoot(root, true);
}
@Nullable
private Repository getRepositoryForRoot(@Nullable VirtualFile root, boolean updateIfNeeded) {
if (root == null) return null;
Repository result;
try {
@@ -120,12 +120,12 @@ public class VcsRepositoryManagerTest extends UsefulTestCase {
public void testRepositoryInfoReadingWhileModifying() throws Exception {
final VirtualFile repositoryFile = createExternalRepository();
assertNotNull(myGlobalRepositoryManager.getRepositoryForRoot(repositoryFile, true));
assertNotNull(myGlobalRepositoryManager.getRepositoryForRoot(repositoryFile));
FutureTask<Repository> readExistingRepo = new FutureTask<Repository>(new Callable<Repository>() {
@Override
public Repository call() throws Exception {
return myGlobalRepositoryManager.getRepositoryForRoot(repositoryFile, true);
return myGlobalRepositoryManager.getRepositoryForRoot(repositoryFile);
}
});
@@ -15,6 +15,7 @@
*/
package git4idea.repo;
import com.intellij.dvcs.DvcsUtil;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
@@ -298,7 +299,7 @@ public class GitUntrackedFilesHolder implements Disposable, BulkFileListener {
private boolean belongsToThisRepository(VirtualFile file) {
// this check should be quick
// we shouldn't create a full instance repository here because it may lead to SOE while many unversioned files will be processed
final GitRepository repository = myRepositoryManager.getRepositoryForFile(file, false);
final GitRepository repository = myRepositoryManager.getRepositoryForRootQuick(DvcsUtil.getVcsRoot(myProject, file));
return repository != null && repository.getRoot().equals(myRoot);
}
}