28170: [CVS Sync View] Dirty flag from CVS decorator does not go away
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java
index a22d00b..c74f245 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Session.java
@@ -111,6 +111,9 @@
 	private Collection /* of ICVSFile */ textTransferOverrideSet = null;
 	private boolean hasBeenConnected = false;
 	private Map caseMappings;
+	
+	// state need to indicate whether 
+	private boolean ignoringLocalChanges = false;
 
 	// The resource bundle key that provides the file sending message
 	private String sendFileTitleKey;
@@ -1122,4 +1125,19 @@
 		}
 		return globalOptions;
 	}
+	/**
+	 * Method setIgnoringLocalChanges.
+	 * @param b
+	 */
+	protected void setIgnoringLocalChanges(boolean b) {
+		ignoringLocalChanges = b;
+	}
+	/**
+	 * Returns the ignoringLocalChanges.
+	 * @return boolean
+	 */
+	protected boolean isIgnoringLocalChanges() {
+		return ignoringLocalChanges;
+	}
+
 }
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java
index 7222d68..9971058 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/Update.java
@@ -194,4 +194,31 @@
 		}
 	}
 
+	/**
+	 * @see org.eclipse.team.internal.ccvs.core.client.Command#doExecute(org.eclipse.team.internal.ccvs.core.client.Session, org.eclipse.team.internal.ccvs.core.client.Command.GlobalOption, org.eclipse.team.internal.ccvs.core.client.Command.LocalOption, java.lang.String, org.eclipse.team.internal.ccvs.core.client.listeners.ICommandOutputListener, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	protected IStatus doExecute(
+			Session session,
+			GlobalOption[] globalOptions,
+			LocalOption[] localOptions,
+			String[] arguments,
+			ICommandOutputListener listener,
+			IProgressMonitor monitor)
+			throws CVSException {
+			
+		session.setIgnoringLocalChanges(IGNORE_LOCAL_CHANGES.isElementOf(localOptions));
+		try {
+			return super.doExecute(
+				session,
+				globalOptions,
+				localOptions,
+				arguments,
+				listener,
+				monitor);
+		} finally {
+			session.setIgnoringLocalChanges(false);
+		}
+
+	}
+
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java
index 763ca80..9da88b7 100644
--- a/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java
+++ b/bundles/org.eclipse.team.cvs.core/src/org/eclipse/team/internal/ccvs/core/client/UpdatedHandler.java
@@ -125,7 +125,7 @@
 		newInfoWithTimestamp.setTimeStamp(modTime);
 		if(handlerType==HANDLE_MERGED) {
 			newInfoWithTimestamp.setMerged();
-		} else if(handlerType==HANDLE_UPDATE_EXISTING || handlerType==HANDLE_CREATED) {
+		} else if (!session.isIgnoringLocalChanges() && (handlerType==HANDLE_UPDATE_EXISTING || handlerType==HANDLE_CREATED)) {
 			// both these cases result in an unmodified file.
 			// reporting is handled by the FileModificationManager
 			newInfoWithTimestamp.reported();
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/IsModifiedTests.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/IsModifiedTests.java
index 6a1a4fa..909a644 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/IsModifiedTests.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/provider/IsModifiedTests.java
@@ -37,6 +37,7 @@
 import org.eclipse.team.internal.ccvs.core.ICVSResourceVisitor;
 import org.eclipse.team.internal.ccvs.core.IResourceStateChangeListener;
 import org.eclipse.team.internal.ccvs.core.client.Command;
+import org.eclipse.team.internal.ccvs.core.client.Update;
 import org.eclipse.team.internal.ccvs.core.resources.CVSWorkspaceRoot;
 import org.eclipse.team.tests.ccvs.core.CVSTestSetup;
 import org.eclipse.team.tests.ccvs.core.EclipseTest;
@@ -125,7 +126,7 @@
 	public static Test suite() {
 		TestSuite suite = new TestSuite(IsModifiedTests.class);
 		return new CVSTestSetup(suite);
-		//return new CVSTestSetup(new IsModifiedTests("testFileAdditions"));
+		//return new CVSTestSetup(new IsModifiedTests("testUpdateIgnoreLocal"));
 	}
 
 	/**
@@ -506,6 +507,19 @@
 		// assertModificationState(project, null, false);
 	}
 	
+	public void testUpdateIgnoreLocal() throws TeamException, CoreException, IOException {
+		// Create a test project, import it into cvs and check it out
+		IProject project = createProject("testUpdateIgnoreLocal", new String[] { "changed.txt", "merged.txt", "deleted.txt", "folder1/", "folder1/a.txt" });
+
+		// modifiy a file
+		setContentsAndEnsureModified(project.getFile("changed.txt"));
+		assertModificationState(project, new String[] {".", "changed.txt"}, true);
+		
+		// peform un update -C
+		getProvider(project).update(new IResource[] {project}, new Command.LocalOption[] {Update.IGNORE_LOCAL_CHANGES}, null, true /*createBackups*/, DEFAULT_MONITOR);
+		assertModificationState(project, null, false);
+	}
+	
 	public void testExternalModifications() {
 	}