Bug 267173 [Linked Resources] Data loss when replacing one linked resource with another using drag and drop
Build ID: HEAD Steps To Reproduce: I've got a Group with some links to folders. If I drag and drop a linked folder from another workspace path, into the group, I get the dialog saying: "project/group/linked_folder" already exists. Do you wish to overwrite? Folder contents will be merged existing files will be overwritten. In my case I had selected a bunch of linked resources to drag into the group, (some of which are identical to the links already in the group). So I pressed "Yes To All". The result is an error: "Resource is out of sync with the filesystem: ..." The move operation has actually tried to replace a file with itself, and this fails (and the resulting file is empty...). I find this completely counter-intuitive. If I'm replacing a linked resource with another, I don't want a recursive merge. I want to replace the link, just like aliases in a filesystem...
bundles/org.eclipse.ui.ide/src/org/eclipse/ui/ide/undo/WorkspaceUndoUtil.java
static ResourceDescription delete(IResource resourceToDelete,
			IProgressMonitor monitor, IAdaptable uiInfo,
			boolean forceOutOfSyncDelete, boolean deleteContent)
			throws CoreException {
		ResourceDescription resourceDescription = ResourceDescription
				.fromResource(resourceToDelete);
		if (resourceToDelete.getType() == IResource.PROJECT) {
			
			monitor
					.setTaskName(UndoMessages.AbstractResourcesOperation_DeleteResourcesProgress);
			IProject project = (IProject) resourceToDelete;
			project.delete(deleteContent, forceOutOfSyncDelete, monitor);
		} else {
			
			monitor.beginTask("", 2); 
			monitor
					.setTaskName(UndoMessages.AbstractResourcesOperation_DeleteResourcesProgress);
			int updateFlags;
			if (forceOutOfSyncDelete) {
				updateFlags = IResource.KEEP_HISTORY | IResource.FORCE;
			} else {
				updateFlags = IResource.KEEP_HISTORY;
			}
			resourceToDelete.delete(updateFlags, new SubProgressMonitor(
					monitor, 1));
			resourceDescription.recordStateFromHistory(resourceToDelete,
					new SubProgressMonitor(monitor, 1));
			monitor.done();
		}
		return resourceDescription;