diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java index 35f61f93724..cf409be9a5b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Builder.java @@ -787,7 +787,7 @@ public class Builder extends BuildObject implements IBuilder, IMatchKeyProvider if(incrementalBuildTarget != null) element.setAttribute(ATTRIBUTE_TARGET_INCREMENTAL, incrementalBuildTarget); if(incrementalBuildEnabled != null) - element.setAttribute(ATTRIBUTE_AUTO_ENABLED, incrementalBuildEnabled.toString()); + element.setAttribute(ATTRIBUTE_INCREMENTAL_ENABLED, incrementalBuildEnabled.toString()); if(cleanBuildTarget != null) element.setAttribute(ATTRIBUTE_TARGET_CLEAN, cleanBuildTarget); if(cleanBuildEnabled != null) diff --git a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java index 4c4cfa8cf51..f535d65ebd9 100644 --- a/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java +++ b/core/org.eclipse.cdt.core.tests/model/org/eclipse/cdt/core/settings/model/CProjectDescriptionBasicTests.java @@ -14,17 +14,20 @@ import junit.framework.TestSuite; import org.eclipse.cdt.core.CProjectNature; import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.settings.model.util.CDataUtil; import org.eclipse.cdt.core.testplugin.CProjectHelper; +import org.eclipse.cdt.core.testplugin.CTestPlugin; import org.eclipse.cdt.core.testplugin.util.BaseTestCase; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.QualifiedName; public class CProjectDescriptionBasicTests extends BaseTestCase{ private static final String PROJ_NAME_PREFIX = "CProjectDescriptionBasicTests_"; - IProject p1; + IProject p1, p2; public static TestSuite suite() { return suite(CProjectDescriptionBasicTests.class, "_"); @@ -55,10 +58,52 @@ public class CProjectDescriptionBasicTests extends BaseTestCase{ assertTrue(failed); } + + public void remove_prefix_testSetInvalidCreatingDescription() throws Exception { + IWorkspace wsp = ResourcesPlugin.getWorkspace(); + IWorkspaceRoot root = wsp.getRoot(); + + p2 = root.getProject(PROJ_NAME_PREFIX + "2"); + p2.create(null); + p2.open(null); + + CProjectHelper.addNatureToProject(p2, CProjectNature.C_NATURE_ID, null); + + ICProjectDescriptionManager mngr = CoreModel.getDefault().getProjectDescriptionManager(); + + ICProjectDescription des = mngr.createProjectDescription(p2, false, true); + des.setSessionProperty(new QualifiedName(CTestPlugin.PLUGIN_ID, "tmp"), "tmp"); + + assertFalse(des.isValid()); + + boolean failed = false; + try { + mngr.setProjectDescription(p2, des); + } catch (CoreException e){ + failed = true; + } + + assertFalse(failed); + + assertNotNull(mngr.getProjectDescription(p2, false)); + assertNotNull(mngr.getProjectDescription(p2, true)); + + des = mngr.getProjectDescription(p2, true); + ICConfigurationDescription cfg = mngr.getPreferenceConfiguration(TestCfgDataProvider.PROVIDER_ID, true); + cfg = des.createConfiguration(CDataUtil.genId(null), CDataUtil.genId(null), cfg); + mngr.setProjectDescription(p2, des); + + } protected void tearDown() throws Exception { try { - p1.getProject().delete(true, null); + if(p1 != null) + p1.getProject().delete(true, null); + } catch (CoreException e){ + } + try { + if(p2 != null) + p2.getProject().delete(true, null); } catch (CoreException e){ } super.tearDown(); diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java index f618989ca90..0d00eb79fe3 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/settings/model/ICProjectDescriptionManager.java @@ -167,4 +167,10 @@ public interface ICProjectDescriptionManager { * @see ICConfigurationDescription#updateExternalSettingsProviders(String[]) */ void updateExternalSettingsProviders(String[] ids, IProgressMonitor monitor); + + ICConfigurationDescription getPreferenceConfiguration(String buildSystemId) throws CoreException; + + ICConfigurationDescription getPreferenceConfiguration(String buildSystemId, boolean write) throws CoreException; + + void setPreferenceConfiguration(String buildSystemId, ICConfigurationDescription des) throws CoreException; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java index 5362f9ffc70..c97f47d588d 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescription.java @@ -525,7 +525,12 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon } public void setSessionProperty(QualifiedName name, Object value) { - fPropertiesMap.put(name, value); + if(value != null) + fPropertiesMap.put(name, value); + else + fPropertiesMap.remove(name); + + fIsModified = true; } public void removeStorage(String id) throws CoreException { diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java index a818a4a52d7..8d087d8cf3a 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/CProjectDescriptionManager.java @@ -259,6 +259,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { private Map fDescriptionMap = new HashMap(); //calls to this map are "manually" synchronized with the CProjectDescriptionManager object lock; private ResourceChangeHandler fRcChangeHandler; private CProjectDescriptionWorkspacePreferences fPreferences; + private boolean fAllowEmptyCreatingDescription = false; // not allowed by default // private CStorage fPrefCfgStorage; private ICDataProxyContainer fPrefUpdater = new ICDataProxyContainer(){ @@ -1160,7 +1161,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { public void setProjectDescription(IProject project, ICProjectDescription des, int flags, IProgressMonitor monitor) throws CoreException { - if(!des.isValid()) + if(!des.isValid() && (!fAllowEmptyCreatingDescription || !des.isCdtProjectCreating())) throw ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.17") + project.getName()); //$NON-NLS-1$ if(!checkFlags(flags, SET_FORCE) && !des.isModified()) @@ -3442,4 +3443,13 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager { public void updateExternalSettingsProviders(String[] ids, IProgressMonitor monitor){ ExtensionContainerFactory.updateReferencedProviderIds(ids, monitor); } + + boolean isEmptyCreatingDescriptionAllowed(){ + return fAllowEmptyCreatingDescription; + } + + void setEmptyCreatingDescriptionAllowed(boolean allow){ + fAllowEmptyCreatingDescription = allow; + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java index 00f3ad5b235..02b83ed7ca0 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/settings/model/SetCProjectDescriptionOperation.java @@ -42,9 +42,6 @@ public class SetCProjectDescriptionOperation extends CModelOperation { ICProject cProject = (ICProject)getElementToProcess(); final IProject project = cProject.getProject(); - if(!fSetDescription.isValid()) - throw new CModelException(ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.17") + project.getName())); //$NON-NLS-1$ - CProjectDescription fOldDescriptionCache = (CProjectDescription)mngr.getProjectDescription(project, false); CProjectDescriptionEvent event = mngr.createAboutToApplyEvent(fSetDescription, fOldDescriptionCache); @@ -59,7 +56,10 @@ public class SetCProjectDescriptionOperation extends CModelOperation { boolean creating = fOldDescriptionCache != null ? fOldDescriptionCache.isCdtProjectCreating() : true; if(creating) creating = fSetDescription.isCdtProjectCreating(); - + + if(!fSetDescription.isValid() && (!mngr.isEmptyCreatingDescriptionAllowed() || !creating)) + throw new CModelException(ExceptionFactory.createCoreException(SettingsModelMessages.getString("CProjectDescriptionManager.17") + project.getName())); //$NON-NLS-1$ + CProjectDescription fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating); try { mngr.setDescriptionApplying(project, fNewDescriptionCache); diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java index ee05fffefcd..1ae3900b844 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/core/CConfigBasedDescriptorManager.java @@ -442,13 +442,15 @@ public class CConfigBasedDescriptorManager implements ICDescriptorManager { ICConfigurationDescription newCfg = newDes.getDefaultSettingConfiguration(); ICConfigurationDescription oldCfg = oldDes.getDefaultSettingConfiguration(); int flags = 0; - if(newCfg.getId().equals(oldCfg.getId())){ - ICDescriptionDelta cfgDelta = findCfgDelta(event.getProjectDelta(), newCfg.getId()); - if(cfgDelta != null){ - flags = cfgDelta.getChangeFlags() & (ICDescriptionDelta.EXT_REF | ICDescriptionDelta.OWNER); + if(oldCfg != null && newCfg != null){ + if(newCfg.getId().equals(oldCfg.getId())){ + ICDescriptionDelta cfgDelta = findCfgDelta(event.getProjectDelta(), newCfg.getId()); + if(cfgDelta != null){ + flags = cfgDelta.getChangeFlags() & (ICDescriptionDelta.EXT_REF | ICDescriptionDelta.OWNER); + } + } else { + flags = CProjectDescriptionManager.getInstance().calculateDescriptorFlags(newCfg, oldCfg); } - } else { - flags = CProjectDescriptionManager.getInstance().calculateDescriptorFlags(newCfg, oldCfg); } int drEventFlags = descriptionFlagsToDescriptorFlags(flags);