git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[EGIT PATCH 14/12] Allow project decorations regardless of repository root location

From
Tor Arne Vestbø <torarnv@gmail.com>
Date
Feb 17, 2009, 17:52 UTC
Message-ID
<1234893162-23254-1-git-send-email-torarnv@gmail.com>
In-Reply-To
<1234893101-23143-1-git-send-email-torarnv@gmail.com>

If the repository root is more than one level above the project directory we use the AdaptableFileTreeIterator to recurse the repository tree until we find a directory that can be mapped to a container in the workspace. The iterator is then adapted to a ContainerTreeIterator and decorations are applied like usual.

Signed-off-by: Tor Arne Vestbø <torarnv@gmail.com>
---
 .../decorators/DecoratableResourceAdapter.java     |   39 +++++++++++++-------
 1 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/DecoratableResourceAdapter.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/DecoratableResourceAdapter.java
index e2fe54b..5c68d5b 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/DecoratableResourceAdapter.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/DecoratableResourceAdapter.java
@@ -13,15 +13,17 @@
 
 package org.spearce.egit.ui.internal.decorators;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.team.core.Team;
+import org.spearce.egit.core.AdaptableFileTreeIterator;
 import org.spearce.egit.core.ContainerTreeIterator;
 import org.spearce.egit.core.ContainerTreeIterator.ResourceEntry;
 import org.spearce.egit.core.project.RepositoryMapping;
@@ -39,6 +41,7 @@
 import org.spearce.jgit.revwalk.RevWalk;
 import org.spearce.jgit.treewalk.EmptyTreeIterator;
 import org.spearce.jgit.treewalk.TreeWalk;
+import org.spearce.jgit.treewalk.WorkingTreeIterator;
 import org.spearce.jgit.treewalk.filter.AndTreeFilter;
 import org.spearce.jgit.treewalk.filter.PathFilterGroup;
 import org.spearce.jgit.treewalk.filter.TreeFilter;
@@ -210,13 +213,21 @@ public boolean include(TreeWalk treeWalk)
 		}
 
 		private boolean shouldRecurse(TreeWalk treeWalk) {
-			final ContainerTreeIterator workspaceIterator = treeWalk.getTree(
-					T_WORKSPACE, ContainerTreeIterator.class);
-			final ResourceEntry resourceEntry = workspaceIterator != null ? workspaceIterator
-					.getResourceEntry()
-					: null;
-			IResource visitingResource = resourceEntry.getResource();
+			final WorkingTreeIterator workspaceIterator = treeWalk.getTree(
+					T_WORKSPACE, WorkingTreeIterator.class);
+
+			if (workspaceIterator instanceof AdaptableFileTreeIterator)
+				return true;
+
+			ResourceEntry resourceEntry = null;
+			if (workspaceIterator != null)
+				resourceEntry = ((ContainerTreeIterator) workspaceIterator)
+						.getResourceEntry();
+
+			if (resourceEntry == null)
+				return true;
 
+			IResource visitingResource = resourceEntry.getResource();
 			if (targetDepth == -1) {
 				if (visitingResource.equals(resource)
 						|| visitingResource.getParent().equals(resource))
@@ -319,14 +330,16 @@ private TreeWalk createThreeWayTreeWalk() throws IOException {
 
 		// Working directory
 		IProject project = resource.getProject();
-		IWorkspace workspace = resource.getWorkspace();
-		if (repository.getWorkDir().equals(project.getLocation().toFile()))
+		IWorkspaceRoot workspaceRoot = resource.getWorkspace().getRoot();
+		File repoRoot = repository.getWorkDir();
+
+		if (repoRoot.equals(project.getLocation().toFile()))
 			treeWalk.addTree(new ContainerTreeIterator(project));
+		else if (repoRoot.equals(workspaceRoot.getLocation().toFile()))
+			treeWalk.addTree(new ContainerTreeIterator(workspaceRoot));
 		else
-			treeWalk.addTree(new ContainerTreeIterator(workspace.getRoot()));
-
-		// TODO: Add fallback for projects with the repository more than
-		// one parent up, for example by using a stack of DummyIterators
+			treeWalk.addTree(new AdaptableFileTreeIterator(repoRoot,
+					workspaceRoot));
 
 		return treeWalk;
 	}
-- 
1.6.1.2.309.g2ea3
Previous: Tor Arne Vestbø
Message 21 of 21 in “Support customizable label decorations”
  1. 00/12 Support customizable label decorationsTor Arne Vestbø, Feb 11, 2009
  2. 01/12 Add support code to handle plugin property changesTor Arne Vestbø, Feb 11, 2009
  3. 02/12 Use Set instead of array to keep track of change listenersTor Arne Vestbø, Feb 11, 2009
  4. 03/12 Add a specialized team exception for GitTor Arne Vestbø, Feb 11, 2009
  5. 04/12 Add new class ExceptionCollector for grouping exceptionsTor Arne Vestbø, Feb 11, 2009
  6. 05/12 Add new class SWTUtils with helper-methods for creating controlsTor Arne Vestbø, Feb 11, 2009
  7. 06/12 Implement basic customizable label decorations with preferencesTor Arne Vestbø, Feb 11, 2009
  8. 07/12 Add binding for name of the current branchTor Arne Vestbø, Feb 11, 2009
  9. 08/12 Add icon decoration for tracked and untracked resourcesTor Arne Vestbø, Feb 11, 2009
  10. 09/12 Implement icon and text decorations of various resource statesTor Arne Vestbø, Feb 11, 2009
  11. 10/12 Don't decorate every single resource on repository changeTor Arne Vestbø, Feb 11, 2009
  12. 11/12 Expose the underlying resource entries in ContainerTreeIteratorTor Arne Vestbø, Feb 11, 2009
  13. 12/12 Implement label decorations for folders and projectsTor Arne Vestbø, Feb 11, 2009
  14. Robin RosenbergFeb 12, 2009
  15. Robin RosenbergFeb 11, 2009
  16. 08/12 Add icon decoration for tracked and untracked resourcesTor Arne Vestbø, Feb 11, 2009
  17. Robin RosenbergFeb 16, 2009
  18. Tor Arne VestbøFeb 16, 2009
  19. Robin RosenbergFeb 17, 2009
  20. 13/12 Add new file tree iterator that can adapt into a ContainerTreeIteratorTor Arne Vestbø, Feb 17, 2009
  21. 14/12 Allow project decorations regardless of repository root locationTor Arne Vestbø, Feb 17, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.