mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 06:05:01 +07:00
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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user