*** empty log message ***
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/target/TargetProvider.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/target/TargetProvider.java index a3d3e69..b6ca9a1 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/core/target/TargetProvider.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/core/target/TargetProvider.java
@@ -19,7 +19,7 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.core.TeamException; -import org.eclipse.team.core.sync.IRemoteResource; +import org.eclipse.team.core.sync.IRemoteSyncElement; public abstract class TargetProvider { /** @@ -136,8 +136,8 @@ /** * Answers true if the base identifier of the given resource is different to the - * current released state of the resource. Also answer true if there was not - * previously a correspondance between the local and remote resource. + * current released state of the resource. Answer false if there is no correspondence + * between the local and remote resources (i.e. hasBase(resource) returns false). * * @param resource the resource to test * @param monitor a progress monitor @@ -155,6 +155,14 @@ * @param resource the resource to test */ public abstract boolean isDirty(IResource resource); + + /** + * Answer true if the given resource at one time had a remote counterpart and still does + * to the knowledge of the provider. + * + * @param resource the resource to test + */ + public abstract boolean hasBase(IResource resource); public abstract void deregister(IProject project); @@ -181,4 +189,10 @@ throw new TeamException(e.getStatus()); } } + + /** + * Return an IRemoteSyncElement for the given resource. This element is used to + * compare the state of the local and remote resources. + */ + public abstract IRemoteSyncElement getRemoteSyncElement(IResource resource); }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/RemoteTargetSyncElement.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/RemoteTargetSyncElement.java similarity index 77% rename from bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/RemoteTargetSyncElement.java rename to bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/RemoteTargetSyncElement.java index a56297b..47649e1 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/RemoteTargetSyncElement.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/RemoteTargetSyncElement.java
@@ -8,7 +8,7 @@ * Contributors: * IBM - Initial implementation ******************************************************************************/ -package org.eclipse.team.internal.ui.target; +package org.eclipse.team.internal.core.target; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IProgressMonitor; @@ -20,8 +20,8 @@ import org.eclipse.team.core.target.IRemoteTargetResource; import org.eclipse.team.core.target.TargetManager; import org.eclipse.team.core.target.TargetProvider; -import org.eclipse.team.internal.ui.Policy; -import org.eclipse.team.internal.ui.TeamUIPlugin; +import org.eclipse.team.internal.core.Policy; +import org.eclipse.team.internal.core.TeamPlugin; /** * Is a synchronization element that can calculate three-way sync @@ -37,22 +37,17 @@ private IResource local; private TargetProvider provider; - public RemoteTargetSyncElement(IResource local, IRemoteTargetResource remote) { + public RemoteTargetSyncElement(TargetProvider provider, IResource local, IRemoteTargetResource remote) { this.local = local; this.remote = remote; - try { - this.provider = TargetManager.getProvider(local.getProject()); - } catch (TeamException e) { - TeamUIPlugin.log(e.getStatus()); - this.remote = null; - } + this.provider = provider; } /** * @see RemoteSyncElement#create(boolean, IResource, IRemoteResource, IRemoteResource, Object) */ public IRemoteSyncElement create(boolean isThreeWay, IResource local, IRemoteResource base, IRemoteResource remote, Object data) { - return new RemoteTargetSyncElement(local, (IRemoteTargetResource)remote); + return new RemoteTargetSyncElement(provider, local, (IRemoteTargetResource)remote); } /** @@ -73,7 +68,7 @@ * @see LocalSyncElement#create(IResource, IRemoteResource, Object) */ public ILocalSyncElement create(IResource local, IRemoteResource base, Object data) { - return new RemoteTargetSyncElement(local, remote); + return new RemoteTargetSyncElement(provider, local, (IRemoteTargetResource)base); } /** @@ -125,15 +120,16 @@ progress.beginTask(null, 100); int description = IN_SYNC; IResource local = getLocal(); - boolean isDirty = provider.isDirty(local); - boolean isOutOfDate; - try{ - isOutOfDate = provider.isOutOfDate(local, Policy.subMonitorFor(progress, 10)); - } catch(TeamException e) { - isOutOfDate = true; // who knows? - } - boolean localExists = local.exists(); + boolean hasBase = provider.hasBase(local); + // isDirty and isOutOfDate only have meaning if there is a base + // XXX The defaults should give the same behavior as before + boolean isDirty = localExists; + boolean isOutOfDate = remote != null; + if (hasBase) { + isDirty = provider.isDirty(local); + isOutOfDate = isOutOfDate(Policy.subMonitorFor(progress, 10)); + } if (remote == null) { if (!localExists) { @@ -141,7 +137,7 @@ // Assert.isTrue(false); } else { // no remote but a local - if (!isDirty && isOutOfDate) { + if (!isDirty && hasBase) { description = INCOMING | DELETION; } else if (isDirty && isOutOfDate) { description = CONFLICTING | CHANGE; @@ -179,4 +175,27 @@ } return description; } + /** + * Returns the provider. + * @return TargetProvider + */ + protected TargetProvider getProvider() { + return provider; + } + + /** + * Return true if the resource associated with the receiver is out-of-date + */ + protected boolean isOutOfDate(IProgressMonitor monitor) { + IResource local = getLocal(); + if (provider.hasBase(local)) { + try{ + return provider.isOutOfDate(local, monitor); + } catch(TeamException e) { + return true; // who knows? + } + } + return false; + } + }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/ResourceState.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/ResourceState.java index 71f79de..1795dda 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/ResourceState.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/ResourceState.java
@@ -274,8 +274,8 @@ * @see ITeamProvider#isDirty(IResource) */ public boolean isDirty() { - if (!hasLocal()) - return hasPhantom(); + if (!hasPhantom()) return false; + if (!hasLocal()) return true; if (localBaseTimestamp == EMPTY_LOCALBASETS) return localResource.getType() == IResource.FILE; return localBaseTimestamp != localResource.getModificationStamp(); @@ -286,11 +286,9 @@ * current released state of the resource. */ public boolean isOutOfDate(IProgressMonitor monitor) throws TeamException { - if (remoteBaseIdentifier.equals(EMPTY_REMOTEBASEID)) - return (localResource.getType() == IResource.FILE && hasRemote(monitor)); - - String releasedIdentifier = null; - releasedIdentifier = getReleasedIdentifier(monitor); + if (!hasPhantom()) return false; + if (remoteBaseIdentifier.equals(EMPTY_REMOTEBASEID)) return false; + String releasedIdentifier = getReleasedIdentifier(monitor); return !remoteBaseIdentifier.equals(releasedIdentifier); }
diff --git a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/SynchronizedTargetProvider.java b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/SynchronizedTargetProvider.java index a86e310..cb7e5f2 100644 --- a/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/SynchronizedTargetProvider.java +++ b/bundles/org.eclipse.team.core/src/org/eclipse/team/internal/core/target/SynchronizedTargetProvider.java
@@ -24,6 +24,7 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.team.core.TeamException; +import org.eclipse.team.core.sync.IRemoteSyncElement; import org.eclipse.team.core.target.IRemoteTargetResource; import org.eclipse.team.core.target.ITargetRunnable; import org.eclipse.team.core.target.Site; @@ -208,4 +209,28 @@ TeamPlugin.log(e.getStatus()); } } + + /** + * @see TargetProvider#getRemoteSyncElement(IResource) + */ + public IRemoteSyncElement getRemoteSyncElement(IResource resource) { + return new RemoteTargetSyncElement(this, resource, getRemoteResourceFor(resource)); + } + + + /** + * @see TargetProvider#hasBase(IResource) + */ + public boolean hasBase(IResource resource) { + // the project always has a base + if (resource.getType() == IResource.PROJECT) return true; + try { + return getState(resource).hasPhantom(); + } catch (TeamException e) { + TeamPlugin.log(e.getStatus()); + return true; + } + } + + } \ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/TargetSyncCompareInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/TargetSyncCompareInput.java index 3a34cd9..fbc1d55 100644 --- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/TargetSyncCompareInput.java +++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/target/TargetSyncCompareInput.java
@@ -42,11 +42,11 @@ monitor = Policy.monitorFor(monitor); try { monitor.beginTask(null, resources.length); - RemoteTargetSyncElement[] elements = new RemoteTargetSyncElement[resources.length]; + IRemoteSyncElement[] elements = new IRemoteSyncElement[resources.length]; for (int i = 0; i < resources.length; i++) { IResource resource = resources[i]; TargetProvider provider = TargetManager.getProvider(resource.getProject()); - elements[i] = new RemoteTargetSyncElement(resources[i], provider.getRemoteResourceFor(resource)); + elements[i] = provider.getRemoteSyncElement(resource); monitor.worked(1); } return elements;
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RemoteResourceTests.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RemoteResourceTests.java index 3eef2b1..43f0968 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RemoteResourceTests.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/RemoteResourceTests.java
@@ -70,7 +70,7 @@ IProject project = createAndPut("getname", new String[] { "file1.txt", "folder1/", "folder1/b.txt" }); TargetProvider target = getProvider(project); IRemoteResource remote = target.getRemoteResourceFor(project.getFile("file1.txt")); - InputStream jin = remote.getContents(null); + InputStream jin = remote.getContents(DEFAULT_MONITOR); try { while (jin.available() > 0) { jin.read(); @@ -85,7 +85,7 @@ IProject project = createAndPut("getname", new String[] { "file1.txt", "folder1/", "folder1/b.txt" }); TargetProvider target = getProvider(project); IRemoteResource remote = target.getRemoteResource(); - IRemoteResource[] altResources = remote.members(null); + IRemoteResource[] altResources = remote.members(DEFAULT_MONITOR); for (int i = 0; i < altResources.length; i++) { assertEquals(altResources[i], project.findMember(altResources[i].getName())); }
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/SyncElementTest.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/SyncElementTest.java index 5de7a53..ea37794 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/SyncElementTest.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/SyncElementTest.java
@@ -12,17 +12,27 @@ import java.io.ByteArrayInputStream; import java.io.IOException; -import java.lang.reflect.Member; -import junit.framework.*; -import org.eclipse.core.resources.*; -import org.eclipse.core.runtime.*; +import junit.framework.AssertionFailedError; +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IProjectDescription; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.Path; import org.eclipse.team.core.TeamException; -import org.eclipse.team.core.sync.*; +import org.eclipse.team.core.sync.ILocalSyncElement; +import org.eclipse.team.core.sync.IRemoteSyncElement; +import org.eclipse.team.core.sync.RemoteSyncElement; import org.eclipse.team.core.target.TargetManager; import org.eclipse.team.core.target.TargetProvider; import org.eclipse.team.internal.core.target.UrlUtil; -import org.eclipse.team.internal.ui.target.RemoteTargetSyncElement; public class SyncElementTest extends TeamTest { /* @@ -103,8 +113,7 @@ } IRemoteSyncElement getRemoteSyncTree(IProject project, IProgressMonitor monitor) throws TeamException { - IRemoteSyncElement result = new RemoteTargetSyncElement(project,getProvider(project).getRemoteResource()); - return result; + return getProvider(project).getRemoteSyncElement(project); } protected IProject checkoutCopy(IProject project, String postfix) throws CoreException,TeamException { TargetProvider provider = getProvider(project);
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TargetProviderTests.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TargetProviderTests.java index 46840a7..951f63e 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TargetProviderTests.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TargetProviderTests.java
@@ -75,14 +75,14 @@ IProject project = getUniqueTestProject("get"); IResource[] resources = buildResources(project, new String[] { "file1.txt", "folder1/", "folder1/b.txt" }, false); TargetProvider target = createProvider(project); - target.put(resources, null); + target.put(resources, DEFAULT_MONITOR); assertLocalEqualsRemote(project); // test get on a new project - project.delete(true, true, null); - project.create(null); - project.open(null); + project.delete(true, true, DEFAULT_MONITOR); + project.create(DEFAULT_MONITOR); + project.open(DEFAULT_MONITOR); target = createProvider(project); - target.get(new IResource[] { project }, null); + target.get(new IResource[] { project }, DEFAULT_MONITOR); assertLocalEqualsRemote(project); } /** @@ -97,10 +97,10 @@ for (int i = 0; i < resources.length; i++) { assertTrue(target.canPut(resources[i])); } - target.put(resources, null); - project.delete(true, true, null); - project.create(null); - project.open(null); + target.put(resources, DEFAULT_MONITOR); + project.delete(true, true, DEFAULT_MONITOR); + project.create(DEFAULT_MONITOR); + project.open(DEFAULT_MONITOR); target = createProvider(project); for (int i = 0; i < resources.length; i++) { assertTrue(target.canGet(resources[i]));
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java index 28dec26..f7478e9 100644 --- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java +++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/core/TeamTest.java
@@ -198,9 +198,9 @@ // Ignore .project file if (container2.getName().equals(".project")) return; - assertTrue(compareContent(container1.getContents(null), ((IFile) container2).getContents())); + assertTrue(compareContent(container1.getContents(DEFAULT_MONITOR), ((IFile) container2).getContents())); } else { - IRemoteResource[] remoteResources = container1.members(null); + IRemoteResource[] remoteResources = container1.members(DEFAULT_MONITOR); IResource[] localResources = ((IFolder) container2).members(); for (int i = 0; i < localResources.length; i++) { assertEquals(remoteResources[i], localResources[i]); @@ -211,7 +211,7 @@ IProject project = getUniqueTestProject(projectPrefix); IResource[] resources = buildResources(project, resourceNames, false); TargetProvider target = createProvider(project); - target.put(resources, null); + target.put(resources, DEFAULT_MONITOR); return project; }