git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [EGIT PATCH 0/5] Support linked resources in repositories
@ 2008-08-06  3:09 Shawn O. Pearce
  2008-08-06  3:09 ` [EGIT PATCH 1/5] Remove the pointless GitProjectData resource change listener Shawn O. Pearce
  0 siblings, 1 reply; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

Sometimes users need to create links inside of a project to point
back to their Git working directory.  This is sort of like a symlink
in POSIX, but its managed at the Eclipse workspace level.

If a resource is contained within a linked directory and that is
also within a Git repository we want to allow Git operations on
that linked resource to operate using the paths of the files as
they are in the repository working directory, and not the path of
the files in the Eclipse workspace.

Shawn O. Pearce (5):
  Remove the pointless GitProjectData resource change listener
  Don't crash the decorator update loop when resources are deleted
  Fix RepositoryMapping.getRepoRelativePath to honor linked resources
  Change GitProjectData.getRepositoryMapping to work on linked
    resources
  Correct getRepositoryMapping callers to use any IResource

 .../egit/core/op/ConnectProviderOperation.java     |   14 +---
 .../org/spearce/egit/core/op/UntrackOperation.java |    4 +-
 .../spearce/egit/core/project/GitProjectData.java  |  111 ++++++--------------
 .../egit/core/project/RepositoryFinder.java        |   11 +--
 .../egit/core/project/RepositoryMapping.java       |   79 ++++++--------
 .../egit/ui/internal/actions/CommitAction.java     |    2 +-
 .../internal/decorators/GitResourceDecorator.java  |   11 ++-
 7 files changed, 81 insertions(+), 151 deletions(-)

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [EGIT PATCH 1/5] Remove the pointless GitProjectData resource change listener
  2008-08-06  3:09 [EGIT PATCH 0/5] Support linked resources in repositories Shawn O. Pearce
@ 2008-08-06  3:09 ` Shawn O. Pearce
  2008-08-06  3:09   ` [EGIT PATCH 2/5] Don't crash the decorator update loop when resources are deleted Shawn O. Pearce
  0 siblings, 1 reply; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

Apparently on any IResourceChangeEvent.POST_CHANGE we just burn some
CPU time and generate some garbage for the GC to clean out later.  I
cannot see a reason why this code is still here.  My memory says we
did this in the past to notify the resource decorator that it needs
to update, or we used it for our cache tree invalidation.

Since this code has no side effect other than to waste time we can
safely remove it, and cut our project down a little bit.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../spearce/egit/core/project/GitProjectData.java  |   64 --------------------
 1 files changed, 0 insertions(+), 64 deletions(-)

diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
index 8754bd1..3d5424c 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
@@ -29,8 +29,6 @@ import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Preferences;
@@ -61,10 +59,6 @@ public class GitProjectData {
 		@SuppressWarnings("synthetic-access")
 		public void resourceChanged(final IResourceChangeEvent event) {
 			switch (event.getType()) {
-			case IResourceChangeEvent.POST_CHANGE:
-				projectsChanged(event.getDelta().getAffectedChildren(
-						IResourceDelta.CHANGED));
-				break;
 			case IResourceChangeEvent.PRE_CLOSE:
 				uncache((IProject) event.getResource());
 				break;
@@ -182,16 +176,6 @@ public class GitProjectData {
 		Activator.trace("(GitProjectData) " + m);
 	}
 
-	private static void projectsChanged(final IResourceDelta[] projDeltas) {
-		for (int k = 0; k < projDeltas.length; k++) {
-			final IResource r = projDeltas[k].getResource();
-			final GitProjectData d = get((IProject) r);
-			if (d != null) {
-				d.notifyChanged(projDeltas[k]);
-			}
-		}
-	}
-
 	private synchronized static void cache(final IProject p,
 			final GitProjectData d) {
 		projectDataCache.put(p, d);
@@ -380,54 +364,6 @@ public class GitProjectData {
 		}
 	}
 
-	private void notifyChanged(final IResourceDelta projDelta) {
-//		final Set affectedMappings = new HashSet();
-		try {
-			projDelta.accept(new IResourceDeltaVisitor() {
-				public boolean visit(final IResourceDelta d)
-						throws CoreException {
-					final int f = d.getFlags();
-					IResource res = d.getResource();
-					IResource r = res;
-					if ((f & IResourceDelta.CONTENT) != 0
-							|| (f & IResourceDelta.ENCODING) != 0
-							|| r instanceof IContainer) {
-						String s = null;
-						RepositoryMapping m = null;
-
-						while (r != null) {
-							m = getRepositoryMapping(r);
-							if (m != null) {
-								break;
-							}
-
-							if (s != null) {
-								s = r.getName() + "/" + s;
-							} else {
-								s = r.getName();
-							}
-
-							r = r.getParent();
-						}
-
-						if (m == null) {
-							return false;
-						} else if (s == null) {
-							return true;
-						}
-					}
-					return false;
-				}
-			});
-		} catch (CoreException ce) {
-			// We are in deep trouble. This should NOT have happend. Detach
-			// our listeners and forget it ever did.
-			//
-			detachFromWorkspace();
-			Activator.logError(CoreText.GitProjectData_notifyChangedFailed, ce);
-		}
-	}
-
 	private File propertyFile() {
 		return new File(getProject()
 				.getWorkingLocation(Activator.getPluginId()).toFile(),
-- 
1.6.0.rc1.250.g9b5e2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [EGIT PATCH 2/5] Don't crash the decorator update loop when resources are deleted
  2008-08-06  3:09 ` [EGIT PATCH 1/5] Remove the pointless GitProjectData resource change listener Shawn O. Pearce
@ 2008-08-06  3:09   ` Shawn O. Pearce
  2008-08-06  3:09     ` [EGIT PATCH 3/5] Fix RepositoryMapping.getRepoRelativePath to honor linked resources Shawn O. Pearce
  0 siblings, 1 reply; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

If a resource is deleted from the workspace we don't need to clear
its GITFOLDERDIRTYSTATEPROPERTY from the item because it is gone.
There won't be anyone else to query for that flag, so the flag is
not relevant anymore.  Further trying to call accept() on those
resources throws an exception because Eclipse won't let you touch
a deleted resource.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../internal/decorators/GitResourceDecorator.java  |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitResourceDecorator.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitResourceDecorator.java
index 6d2f88e..84ad949 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitResourceDecorator.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/decorators/GitResourceDecorator.java
@@ -126,6 +126,14 @@ public class GitResourceDecorator extends LabelProvider implements
 						Iterator<IResource> i = resources.iterator();
 						m = i.next();
 						i.remove();
+
+						while (!m.isAccessible()) {
+							if (!i.hasNext())
+								return Status.OK_STATUS;
+							m = i.next();
+							i.remove();
+						}
+
 						if (resources.size() > 0)
 							schedule();
 					}
@@ -188,8 +196,7 @@ public class GitResourceDecorator extends LabelProvider implements
 	} // End ResCL
 
 	void clearDecorationState(IResource r) throws CoreException {
-		if (r.isAccessible())
-			r.setSessionProperty(GITFOLDERDIRTYSTATEPROPERTY, null);
+		r.setSessionProperty(GITFOLDERDIRTYSTATEPROPERTY, null);
 		fireLabelProviderChanged(new LabelProviderChangedEvent(this, r));
 	}
 
-- 
1.6.0.rc1.250.g9b5e2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [EGIT PATCH 3/5] Fix RepositoryMapping.getRepoRelativePath to honor linked resources
  2008-08-06  3:09   ` [EGIT PATCH 2/5] Don't crash the decorator update loop when resources are deleted Shawn O. Pearce
@ 2008-08-06  3:09     ` Shawn O. Pearce
  2008-08-06  3:09       ` [EGIT PATCH 4/5] Change GitProjectData.getRepositoryMapping to work on " Shawn O. Pearce
  0 siblings, 1 reply; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

If a project resource is linked to a repository working directory we
should be locating the path of the resource within the repository by
the path it appears in the filesystem, not the path it appears at in
the Eclipse project structure.  By using the filesystem location we
can ensure the paths match what C Git would see when accessing the
same resource.

By making this change we can now safely remove the subset concept
from RepositoryMapping as it was a crude form of trying to come up
with the same result when projects appeared within a repository.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../egit/core/op/ConnectProviderOperation.java     |   14 +----
 .../egit/core/project/RepositoryFinder.java        |   11 +--
 .../egit/core/project/RepositoryMapping.java       |   65 ++++++++-----------
 3 files changed, 32 insertions(+), 58 deletions(-)

diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/ConnectProviderOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/ConnectProviderOperation.java
index 3ed3569..bf814f4 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/ConnectProviderOperation.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/ConnectProviderOperation.java
@@ -15,10 +15,8 @@ import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.team.core.RepositoryProvider;
 import org.spearce.egit.core.Activator;
@@ -70,17 +68,7 @@ public class ConnectProviderOperation implements IWorkspaceRunnable {
 
 					db = new Repository(newGitDir);
 					db.create();
-					IPath gitDirParent = Path.fromOSString(
-							db.getDirectory().getAbsolutePath())
-							.removeLastSegments(1);
-					IPath cPath = project.getLocation();
-					String subset = null;
-					if (gitDirParent.isPrefixOf(cPath)) {
-						int n = cPath.matchingFirstSegments(gitDirParent);
-						subset = cPath.removeFirstSegments(n).toPortableString();
-					}
-					repos.add(new RepositoryMapping(project, db.getDirectory(),
-							subset));
+					repos.add(new RepositoryMapping(project, db.getDirectory()));
 					db.close();
 
 					// If we don't refresh the project directory right
diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryFinder.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryFinder.java
index 68cf79c..116a7bf 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryFinder.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryFinder.java
@@ -92,17 +92,15 @@ public class RepositoryFinder {
 				final IResource[] children;
 
 				if (ownCfg.isFile()) {
-					register(c, ownCfg.getParentFile(), null);
+					register(c, ownCfg.getParentFile());
 				} else if (c.isLinked() || c instanceof IProject) {
-					String s = fsLoc.getName();
 					File p = fsLoc.getParentFile();
 					while (p != null) {
 						final File pCfg = configFor(p);
 						if (pCfg.isFile()) {
-							register(c, pCfg.getParentFile(), s);
+							register(c, pCfg.getParentFile());
 							break;
 						}
-						s = p.getName() + "/" + s;
 						p = p.getParentFile();
 					}
 				}
@@ -132,14 +130,13 @@ public class RepositoryFinder {
 		return new File(new File(fsLoc, ".git"), "config");
 	}
 
-	private void register(final IContainer c, final File gitdir,
-			final String subset) {
+	private void register(final IContainer c, final File gitdir) {
 		File f;
 		try {
 			f = gitdir.getCanonicalFile();
 		} catch (IOException ioe) {
 			f = gitdir.getAbsoluteFile();
 		}
-		results.add(new RepositoryMapping(c, f, subset));
+		results.add(new RepositoryMapping(c, f));
 	}
 }
diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
index 6a0b56f..17e8142 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
@@ -41,10 +41,10 @@ public class RepositoryMapping {
 
 	private final String gitdirPath;
 
-	private final String subset;
-
 	private Repository db;
 
+	private String workdirPrefix;
+
 	private IContainer container;
 
 	/**
@@ -55,12 +55,9 @@ public class RepositoryMapping {
 	 */
 	public RepositoryMapping(final Properties p, final String initialKey) {
 		final int dot = initialKey.lastIndexOf('.');
-		String s;
 
 		containerPath = initialKey.substring(0, dot);
 		gitdirPath = p.getProperty(initialKey);
-		s = p.getProperty(containerPath + ".subset");
-		subset = "".equals(s) ? null : s;
 	}
 
 	/**
@@ -69,10 +66,8 @@ public class RepositoryMapping {
 	 *
 	 * @param mappedContainer
 	 * @param gitDir
-	 * @param subsetRoot
 	 */
-	public RepositoryMapping(final IContainer mappedContainer,
-			final File gitDir, final String subsetRoot) {
+	public RepositoryMapping(final IContainer mappedContainer, final File gitDir) {
 		final IPath cLoc = mappedContainer.getLocation()
 				.removeTrailingSeparator();
 		final IPath gLoc = Path.fromOSString(gitDir.getAbsolutePath())
@@ -98,8 +93,6 @@ public class RepositoryMapping {
 		} else {
 			gitdirPath = gLoc.toPortableString();
 		}
-
-		subset = "".equals(subsetRoot) ? null : subsetRoot;
 	}
 
 	IPath getContainerPath() {
@@ -111,17 +104,6 @@ public class RepositoryMapping {
 	}
 
 	/**
-	 * Eclipse projects typically reside one or more levels
-	 * below the repository. This method return the relative
-	 * path to the project. Null is returned instead of "".
-	 *
-	 * @return relative path from repository to project, or null
-	 */
-	public String getSubset() {
-		return subset;
-	}
-
-	/**
 	 * @return the workdir file, i.e. where the files are checked out
 	 */
 	public File getWorkDir() {
@@ -130,6 +112,7 @@ public class RepositoryMapping {
 
 	synchronized void clear() {
 		db = null;
+		workdirPrefix = null;
 		container = null;
 	}
 
@@ -142,6 +125,15 @@ public class RepositoryMapping {
 
 	synchronized void setRepository(final Repository r) {
 		db = r;
+
+		try {
+			workdirPrefix = getWorkDir().getCanonicalPath();
+		} catch (IOException err) {
+			workdirPrefix = getWorkDir().getAbsolutePath();
+		}
+		workdirPrefix = workdirPrefix.replace('\\', '/');
+		if (!workdirPrefix.endsWith("/"))
+			workdirPrefix += "/";
 	}
 
 	/**
@@ -166,9 +158,6 @@ public class RepositoryMapping {
 
 	synchronized void store(final Properties p) {
 		p.setProperty(containerPath + ".gitdir", gitdirPath);
-		if (subset != null && !"".equals(subset)) {
-			p.setProperty(containerPath + ".subset", subset);
-		}
 	}
 
 	public String toString() {
@@ -209,20 +198,20 @@ public class RepositoryMapping {
 	 * @param rsrc
 	 * @return the path relative to the Git repository, including base name.
 	 */
-	public String getRepoRelativePath(IResource rsrc) {
-		String prefix = getSubset();
-		String projectRelativePath = rsrc.getProjectRelativePath().toString();
-		String repoRelativePath;
-		if (prefix != null) {
-			if (projectRelativePath.length() == 0)
-				repoRelativePath = prefix;
-			else
-				repoRelativePath = prefix + "/" + projectRelativePath;
-		} else
-			repoRelativePath = projectRelativePath;
-
-		assert repoRelativePath != null;
-		return repoRelativePath;
+	public String getRepoRelativePath(final IResource rsrc) {
+		// We should only be called for resources that are actually
+		// in this repository, so we can safely assume that their
+		// path prefix matches workdirPrefix. Testing that here is
+		// rather expensive so we don't bother.
+		//
+		final int pfxLen = workdirPrefix.length();
+		final String p = rsrc.getLocation().toString();
+		final int pLen = p.length();
+		if (pLen > pfxLen)
+			return p.substring(pfxLen);
+		else if (p.length() == pfxLen - 1)
+			return "";
+		return null;
 	}
 
 	/**
-- 
1.6.0.rc1.250.g9b5e2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [EGIT PATCH 4/5] Change GitProjectData.getRepositoryMapping to work on linked resources
  2008-08-06  3:09     ` [EGIT PATCH 3/5] Fix RepositoryMapping.getRepoRelativePath to honor linked resources Shawn O. Pearce
@ 2008-08-06  3:09       ` Shawn O. Pearce
  2008-08-06  3:09         ` [EGIT PATCH 5/5] Correct getRepositoryMapping callers to use any IResource Shawn O. Pearce
  0 siblings, 1 reply; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

When we are looking up the mapping for a file contained within a linked
directory the linked directory may be mapped to a Git repository that is
not the same as the project itself, or the project doesn't even have a
Git repository.

This may also be necessary for submodules.  For example a single project
in Eclipse may actually contain several Git submodules below it and each
must have its own RepositoryMapping.

We now store the RepositoryMapping for a given IContainer directly on
that container using a session property.  This way Eclipse manages the
hash lookups for us, and we can efficiently walk up the tree to locate
the nearest mapping for any resource.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../spearce/egit/core/project/GitProjectData.java  |   47 +++++++++++++-------
 1 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
index 3d5424c..9998880 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/GitProjectData.java
@@ -32,6 +32,7 @@ import org.eclipse.core.resources.IResourceChangeListener;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Preferences;
+import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.team.core.RepositoryProvider;
 import org.spearce.egit.core.Activator;
@@ -71,6 +72,9 @@ public class GitProjectData {
 		}
 	}
 
+	private static QualifiedName MAPPING_KEY = new QualifiedName(
+			GitProjectData.class.getName(), "RepositoryMapping");
+
 	/**
 	 * Start listening for resource changes.
 	 *
@@ -226,8 +230,6 @@ public class GitProjectData {
 
 	private final Collection mappings;
 
-	private final Map c2mapping;
-
 	private final Set protectedResources;
 
 	/**
@@ -239,7 +241,6 @@ public class GitProjectData {
 	public GitProjectData(final IProject p) {
 		project = p;
 		mappings = new ArrayList();
-		c2mapping = new HashMap();
 		protectedResources = new HashSet();
 	}
 
@@ -267,15 +268,16 @@ public class GitProjectData {
 	 * @throws CoreException
 	 */
 	public void markTeamPrivateResources() throws CoreException {
-		final Iterator i = c2mapping.entrySet().iterator();
-		while (i.hasNext()) {
-			final Map.Entry e = (Map.Entry) i.next();
-			final IContainer c = (IContainer) e.getKey();
+		for (final Object rmObj : mappings) {
+			final RepositoryMapping rm = (RepositoryMapping)rmObj;
+			final IContainer c = rm.getContainer();
+			if (c == null)
+				continue; // Not fully mapped yet?
+
 			final IResource dotGit = c.findMember(".git");
 			if (dotGit != null) {
 				try {
-					final Repository r = ((RepositoryMapping) e.getValue())
-							.getRepository();
+					final Repository r = rm.getRepository();
 					final File dotGitDir = dotGit.getLocation().toFile()
 							.getCanonicalFile();
 					if (dotGitDir.equals(r.getDirectory())) {
@@ -298,14 +300,23 @@ public class GitProjectData {
 	}
 
 	/**
-	 * TODO: check usage, we should probably declare the parameter
-	 * as IProject.
-	 *
-	 * @param r Eclipse project
+	 * @param r any workbench resource contained within this project.
 	 * @return the mapping for the specified project
 	 */
-	public RepositoryMapping getRepositoryMapping(final IResource r) {
-		return (RepositoryMapping) c2mapping.get(r);
+	public RepositoryMapping getRepositoryMapping(IResource r) {
+		try {
+			while (r != null) {
+				final RepositoryMapping m;
+
+				m = (RepositoryMapping) r.getSessionProperty(MAPPING_KEY);
+				if (m != null)
+					return m;
+ 				r = r.getParent();
+			}
+		} catch (CoreException err) {
+			Activator.logError("Falied finding RepositoryMapping", err);
+		}
+		return null;
 	}
 
 	private void delete() {
@@ -445,7 +456,11 @@ public class GitProjectData {
 		m.fireRepositoryChanged();
 
 		trace("map " + c + " -> " + m.getRepository());
-		c2mapping.put(c, m);
+		try {
+			c.setSessionProperty(MAPPING_KEY, m);
+		} catch (CoreException err) {
+			Activator.logError("Failed to cache RepositoryMapping", err);
+		}
 
 		dotGit = c.findMember(".git");
 		if (dotGit != null && dotGit.getLocation().toFile().equals(git)) {
-- 
1.6.0.rc1.250.g9b5e2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [EGIT PATCH 5/5] Correct getRepositoryMapping callers to use any IResource
  2008-08-06  3:09       ` [EGIT PATCH 4/5] Change GitProjectData.getRepositoryMapping to work on " Shawn O. Pearce
@ 2008-08-06  3:09         ` Shawn O. Pearce
  0 siblings, 0 replies; 6+ messages in thread
From: Shawn O. Pearce @ 2008-08-06  3:09 UTC (permalink / raw
  To: Robin Rosenberg, Marek Zawirski; +Cc: git

We really need to use the exact resource we want a mapping for, even
if that is an IFile, because the file may be in a different repository
than the project it is contained in.  This can happen due to linked
resources, or due to submodules.  Either way the mapping cannot be
driven by the project.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
---
 .../org/spearce/egit/core/op/UntrackOperation.java |    4 +---
 .../egit/core/project/RepositoryMapping.java       |   14 +++++++-------
 .../egit/ui/internal/actions/CommitAction.java     |    2 +-
 3 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java b/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java
index 369ff38..b491e6d 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/op/UntrackOperation.java
@@ -15,7 +15,6 @@ import java.util.IdentityHashMap;
 import java.util.Iterator;
 
 import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.IWorkspaceRunnable;
@@ -67,9 +66,8 @@ public class UntrackOperation implements IWorkspaceRunnable {
 				obj = ((IAdaptable)obj).getAdapter(IResource.class);
 				if (obj instanceof IResource) {
 					final IResource toRemove = (IResource)obj;
-					final IProject p = toRemove.getProject();					
 					final GitProjectData pd = GitProjectData.get(toRemove.getProject());
-					final RepositoryMapping rm = pd.getRepositoryMapping(p);
+					final RepositoryMapping rm = pd.getRepositoryMapping(toRemove);
 					final GitIndex index = rm.getRepository().getIndex();
 					tomerge.put(rm, Boolean.TRUE);
 					if (toRemove instanceof IContainer) {
diff --git a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
index 17e8142..961dbaf 100644
--- a/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
+++ b/org.spearce.egit.core/src/org/spearce/egit/core/project/RepositoryMapping.java
@@ -221,15 +221,15 @@ public class RepositoryMapping {
 	 * @return the RepositoryMapping for this resource,
 	 *         or null for non GitProvider.
 	 */
-	public static RepositoryMapping getMapping(IResource resource) {
-		IProject project = resource.getProject();
+	public static RepositoryMapping getMapping(final IResource resource) {
+		final IProject project = resource.getProject();
 		if (project == null)
 			return null;
-		RepositoryProvider provider = RepositoryProvider.getProvider(project);
-		if (!(provider instanceof GitProvider))
+
+		final RepositoryProvider rp = RepositoryProvider.getProvider(project);
+		if (!(rp instanceof GitProvider))
 			return null;
-		GitProvider gp = (GitProvider)provider;
-		RepositoryMapping repositoryMapping = gp.getData().getRepositoryMapping(project);
-		return repositoryMapping;
+
+		return ((GitProvider)rp).getData().getRepositoryMapping(resource);
 	}
 }
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
index db38c10..4956be3 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
@@ -363,7 +363,7 @@ public class CommitAction extends RepositoryAction {
 
 		try {
 			RepositoryMapping repositoryMapping = projectData
-					.getRepositoryMapping(resource.getProject());
+					.getRepositoryMapping(resource);
 
 			if (isChanged(repositoryMapping, resource)) {
 				files.add(resource);
-- 
1.6.0.rc1.250.g9b5e2

^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-08-06  3:10 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-06  3:09 [EGIT PATCH 0/5] Support linked resources in repositories Shawn O. Pearce
2008-08-06  3:09 ` [EGIT PATCH 1/5] Remove the pointless GitProjectData resource change listener Shawn O. Pearce
2008-08-06  3:09   ` [EGIT PATCH 2/5] Don't crash the decorator update loop when resources are deleted Shawn O. Pearce
2008-08-06  3:09     ` [EGIT PATCH 3/5] Fix RepositoryMapping.getRepoRelativePath to honor linked resources Shawn O. Pearce
2008-08-06  3:09       ` [EGIT PATCH 4/5] Change GitProjectData.getRepositoryMapping to work on " Shawn O. Pearce
2008-08-06  3:09         ` [EGIT PATCH 5/5] Correct getRepositoryMapping callers to use any IResource Shawn O. Pearce

Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).