diff options
author | Jens Baumgart | 2011-02-09 14:07:32 +0000 |
---|---|---|
committer | Jens Baumgart | 2011-02-09 14:07:32 +0000 |
commit | 32af98c85000e6f71c4112805ddcfed4ac804d9a (patch) | |
tree | bd9f4de746378e42ff41c7ea6f32d6f0b415e628 | |
parent | 0b71c1ab1cf65b06342dc266c8d6749133671a42 (diff) | |
download | egit-32af98c85000e6f71c4112805ddcfed4ac804d9a.tar.gz egit-32af98c85000e6f71c4112805ddcfed4ac804d9a.tar.xz egit-32af98c85000e6f71c4112805ddcfed4ac804d9a.zip |
Cache DirCache instance in DecoratableResourceHelper
DirCache instances are reused in DecoratableResourceAdapter and
DecoratableResourceHelper to improve decoration performance.
Depends on jgit change http://egit.eclipse.org/r/2467
Change-Id: I222c5880167c99dee1c3a5c018fb329688720472
Signed-off-by: Jens Baumgart <jens.baumgart@sap.com>
Signed-off-by: Philipp Thun <philipp.thun@sap.com>
2 files changed, 19 insertions, 2 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceAdapter.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceAdapter.java index 3424c23348..5eddaf7b67 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceAdapter.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceAdapter.java @@ -349,10 +349,11 @@ class DecoratableResourceAdapter extends DecoratableResource { treeWalk.addTree(new EmptyTreeIterator()); // Index - treeWalk.addTree(new DirCacheIterator(repository.readDirCache())); + treeWalk.addTree(new DirCacheIterator(DecoratableResourceHelper.getDirCache(repository))); // Working directory treeWalk.addTree(IteratorService.createInitialIterator(repository)); return treeWalk; } + } diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceHelper.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceHelper.java index 22b7734188..816def25e3 100644 --- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceHelper.java +++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/decorators/DecoratableResourceHelper.java @@ -10,6 +10,8 @@ package org.eclipse.egit.ui.internal.decorators; import java.io.IOException; import java.util.ArrayList; +import java.util.Map; +import java.util.WeakHashMap; import org.eclipse.core.resources.IResource; import org.eclipse.egit.core.ContainerTreeIterator; @@ -17,6 +19,7 @@ import org.eclipse.egit.core.ContainerTreeIterator.ResourceEntry; import org.eclipse.egit.core.IteratorService; import org.eclipse.egit.core.project.RepositoryMapping; import org.eclipse.egit.ui.internal.decorators.IDecoratableResource.Staged; +import org.eclipse.jgit.dircache.DirCache; import org.eclipse.jgit.dircache.DirCacheEntry; import org.eclipse.jgit.dircache.DirCacheIterator; import org.eclipse.jgit.lib.Constants; @@ -42,6 +45,8 @@ class DecoratableResourceHelper { static final int T_WORKSPACE = 2; + private static final Map<Repository, DirCache> repoToDirCache = new WeakHashMap<Repository, DirCache>(); + static IDecoratableResource[] createDecoratableResources( final IResource[] resources) throws IOException { // Use first (available) resource to get repository mapping @@ -112,6 +117,17 @@ class DecoratableResourceHelper { return decoratableResources; } + static DirCache getDirCache(Repository repository) throws IOException { + synchronized(repoToDirCache) { + DirCache dirCache = repoToDirCache.get(repository); + if (dirCache != null && !dirCache.isOutdated()) + return dirCache; + dirCache = repository.readDirCache(); + repoToDirCache.put(repository, dirCache); + return dirCache; + } + } + private static TreeWalk createThreeWayTreeWalk( final RepositoryMapping mapping, final ArrayList<String> resourcePaths) throws IOException { @@ -136,7 +152,7 @@ class DecoratableResourceHelper { treeWalk.addTree(new EmptyTreeIterator()); // Index - treeWalk.addTree(new DirCacheIterator(repository.readDirCache())); + treeWalk.addTree(new DirCacheIterator(getDirCache(repository))); // Working directory treeWalk.addTree(IteratorService.createInitialIterator(repository)); |