mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-04 06:45:43 +02:00
1. Fix for [Bug 191744] Switching build configurations should not save .cproject
2. Fix for [Bug 186380] [New Project Model] Saving project description is slow
This commit is contained in:
parent
c11d44bf9e
commit
d8c16534f0
9 changed files with 155 additions and 82 deletions
|
@ -960,7 +960,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild
|
|||
LanguageSettingEntriesSerializer.serializeEntries(sourceEntries, el);
|
||||
}
|
||||
// I am clean now
|
||||
isDirty = false;
|
||||
setDirty(false);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -100,8 +100,8 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
|
|||
|
||||
}
|
||||
static BuildConfigurationData writeConfiguration(ICConfigurationDescription des,
|
||||
CConfigurationData base) throws CoreException {
|
||||
BuildConfigurationData appliedCfg = (BuildConfigurationData)base;
|
||||
BuildConfigurationData base) throws CoreException {
|
||||
BuildConfigurationData appliedCfg = base;
|
||||
ICStorageElement rootElement = des.getStorage(BUILD_SYSTEM_DATA_MODULE_NAME, true);
|
||||
rootElement.clear();
|
||||
rootElement.setAttribute(VERSION_ATTRIBUTE, ManagedBuildManager.getVersion().toString());
|
||||
|
@ -122,7 +122,7 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
|
|||
protected CConfigurationData applyPreferences(
|
||||
ICConfigurationDescription des, CConfigurationData base) throws CoreException{
|
||||
|
||||
BuildConfigurationData appliedCfg = writeConfiguration(des, base);
|
||||
BuildConfigurationData appliedCfg = writeConfiguration(des, (BuildConfigurationData)base);
|
||||
|
||||
IConfiguration cfg = ((BuildConfigurationData)base).getConfiguration();
|
||||
try {
|
||||
|
@ -144,38 +144,46 @@ public class ConfigurationDataProvider extends CConfigurationDataProvider implem
|
|||
if(des.isPreferenceConfiguration())
|
||||
return applyPreferences(des, base);
|
||||
|
||||
BuildConfigurationData appliedCfg = writeConfiguration(des, base);
|
||||
|
||||
IManagedBuildInfo info = getBuildInfo(des);
|
||||
ManagedProject mProj = (ManagedProject)info.getManagedProject();
|
||||
mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration());
|
||||
writeManagedProjectInfo(des.getProjectDescription(), mProj);
|
||||
try {
|
||||
CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des));
|
||||
} catch (CoreException e){
|
||||
ManagedBuilderCorePlugin.log(e);
|
||||
}
|
||||
info.setValid(true);
|
||||
|
||||
setPersistedFlag(des);
|
||||
cacheNaturesIdsUsedOnCache(des);
|
||||
|
||||
if(des.isActive()){
|
||||
IConfiguration cfg = appliedCfg.getConfiguration();
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
IProject project = context.getProject();
|
||||
IProjectDescription eDes = context.getEclipseProjectDescription();
|
||||
switch(BuilderFactory.applyBuilder(eDes, builder)){
|
||||
case BuilderFactory.CMD_UNDEFINED:
|
||||
IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder);
|
||||
context.addWorkspaceRunnable(applyR);
|
||||
break;
|
||||
case BuilderFactory.CMD_CHANGED:
|
||||
context.setEclipseProjectDescription(eDes);
|
||||
break;
|
||||
BuildConfigurationData baseCfgData = (BuildConfigurationData)base;
|
||||
IConfiguration baseCfg = baseCfgData.getConfiguration();
|
||||
BuildConfigurationData appliedCfg;
|
||||
if(context.getBaseConfigurationDataCacheState() && !baseCfg.isDirty()){
|
||||
appliedCfg = baseCfgData;
|
||||
context.setConfiguratoinDataModifiedState(false);
|
||||
} else {
|
||||
appliedCfg = writeConfiguration(des, baseCfgData);
|
||||
context.setConfiguratoinDataModifiedState(true);
|
||||
|
||||
IManagedBuildInfo info = getBuildInfo(des);
|
||||
ManagedProject mProj = (ManagedProject)info.getManagedProject();
|
||||
mProj.applyConfiguration((Configuration)appliedCfg.getConfiguration());
|
||||
writeManagedProjectInfo(des.getProjectDescription(), mProj);
|
||||
try {
|
||||
CfgScannerConfigInfoFactory2.save(appliedCfg, des.getProjectDescription(), baseDescription.getProjectDescription(), !isPersistedCfg(des));
|
||||
} catch (CoreException e){
|
||||
ManagedBuilderCorePlugin.log(e);
|
||||
}
|
||||
info.setValid(true);
|
||||
|
||||
setPersistedFlag(des);
|
||||
cacheNaturesIdsUsedOnCache(des);
|
||||
|
||||
if(des.isActive()){
|
||||
IConfiguration cfg = appliedCfg.getConfiguration();
|
||||
IBuilder builder = cfg.getEditableBuilder();
|
||||
IProject project = context.getProject();
|
||||
IProjectDescription eDes = context.getEclipseProjectDescription();
|
||||
switch(BuilderFactory.applyBuilder(eDes, builder)){
|
||||
case BuilderFactory.CMD_UNDEFINED:
|
||||
IWorkspaceRunnable applyR = new DesApplyRunnable(project, builder);
|
||||
context.addWorkspaceRunnable(applyR);
|
||||
break;
|
||||
case BuilderFactory.CMD_CHANGED:
|
||||
context.setEclipseProjectDescription(eDes);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return appliedCfg;
|
||||
}
|
||||
|
||||
|
|
|
@ -23,4 +23,14 @@ public interface IModificationContext {
|
|||
void setEclipseProjectDescription(IProjectDescription eDes) throws CoreException;
|
||||
|
||||
void addWorkspaceRunnable(IWorkspaceRunnable runnable);
|
||||
|
||||
/**
|
||||
* the CConfigurationDataProvider can call this method to indicate whether the
|
||||
* ICConfigurationDescription settings were changed
|
||||
* @param modified
|
||||
*/
|
||||
void setConfiguratoinDataModifiedState(boolean modified);
|
||||
|
||||
boolean getBaseConfigurationDataCacheState();
|
||||
|
||||
}
|
||||
|
|
|
@ -32,7 +32,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingObject;
|
|||
import org.eclipse.cdt.core.settings.model.ICSourceEntry;
|
||||
import org.eclipse.cdt.core.settings.model.ICStorageElement;
|
||||
import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting;
|
||||
import org.eclipse.cdt.core.settings.model.IModificationContext;
|
||||
import org.eclipse.cdt.core.settings.model.WriteAccessException;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CBuildData;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
|
||||
|
@ -60,6 +59,7 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
|
|||
private List fChildList = new ArrayList();
|
||||
private CConfigurationSpecSettings fSpecSettings;
|
||||
private CConfigurationData fData;
|
||||
private CConfigurationDescriptionCache fBaseCache;
|
||||
private ICSourceEntry fProjSourceEntries[];
|
||||
private StorableCdtVariables fMacros;
|
||||
private boolean fDataLoadded;
|
||||
|
@ -105,11 +105,12 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
|
|||
// fInitializing = false;
|
||||
}
|
||||
|
||||
CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException {
|
||||
CConfigurationDescriptionCache(ICConfigurationDescription baseDescription, CConfigurationData base, CConfigurationDescriptionCache baseCache, CConfigurationSpecSettings settingsBase, CProjectDescription parent, ICStorageElement rootEl) throws CoreException {
|
||||
super(base.getId(), base.getName(), null);
|
||||
fInitializing = true;
|
||||
fParent = parent;
|
||||
fSpecSettings = new CConfigurationSpecSettings(this, settingsBase, rootEl);
|
||||
fSpecSettings.setModified(settingsBase.isModified());
|
||||
fBaseDescription = baseDescription;
|
||||
if(base instanceof CConfigurationDescriptionCache){
|
||||
fData = ((CConfigurationDescriptionCache)base).getConfigurationData();
|
||||
|
@ -119,41 +120,44 @@ public class CConfigurationDescriptionCache extends CDefaultConfigurationData
|
|||
// base = CProjectDescriptionManager.getInstance().applyData(this, baseDescription, base);
|
||||
// fData = base;
|
||||
}
|
||||
// fDataLoadded = true;
|
||||
// fName = fData.getName();
|
||||
// fId = fData.getId();
|
||||
//
|
||||
// copySettingsFrom(base, true);
|
||||
//
|
||||
// ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this);
|
||||
// fMacros = new StorableCdtVariables(vars, true);
|
||||
// if(saving)
|
||||
// fSpecSettings.serialize();
|
||||
//
|
||||
// fInitializing = false;
|
||||
|
||||
fBaseCache = baseCache;
|
||||
}
|
||||
|
||||
void applyData(CSettingEntryFactory factory, IModificationContext context) throws CoreException{
|
||||
if(fBaseDescription == null)
|
||||
return;
|
||||
CConfigurationDescriptionCache getBaseCache(){
|
||||
return fBaseCache;
|
||||
}
|
||||
|
||||
boolean applyData(CSettingEntryFactory factory, SettingsContext context) throws CoreException{
|
||||
boolean modified = true;
|
||||
if(fBaseDescription != null){
|
||||
|
||||
fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null);
|
||||
fDataLoadded = true;
|
||||
fName = fData.getName();
|
||||
fId = fData.getId();
|
||||
fSettingsFactory = factory;
|
||||
|
||||
copySettingsFrom(fData, true);
|
||||
|
||||
fSettingsFactory = null;
|
||||
|
||||
ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this);
|
||||
fMacros = new StorableCdtVariables(vars, true);
|
||||
// if(saving)
|
||||
fData = CProjectDescriptionManager.getInstance().applyData(this, fBaseDescription, fData, context, null);
|
||||
fDataLoadded = true;
|
||||
fName = fData.getName();
|
||||
fId = fData.getId();
|
||||
fSettingsFactory = factory;
|
||||
|
||||
if(context.getConfiguratoinDataModifiedState() || fBaseCache == null)
|
||||
copySettingsFrom(fData, true);
|
||||
else {
|
||||
copySettingsFrom(fBaseCache, true);
|
||||
modified = fSpecSettings.isModified();
|
||||
}
|
||||
|
||||
fSettingsFactory = null;
|
||||
|
||||
ICdtVariable vars[] = CdtVariableManager.getDefault().getVariables(this);
|
||||
fMacros = new StorableCdtVariables(vars, true);
|
||||
fSpecSettings.serialize();
|
||||
fSpecSettings.setModified(false);
|
||||
|
||||
}
|
||||
|
||||
fBaseDescription = null;
|
||||
// fInitializing = false;
|
||||
fBaseCache = null;
|
||||
|
||||
return modified;
|
||||
}
|
||||
|
||||
CSettingEntryFactory getSettingsFactory(){
|
||||
|
|
|
@ -487,11 +487,14 @@ public class CConfigurationSpecSettings implements ICSettingsStorage{
|
|||
|
||||
return fExtSettingsProvider.isModified();
|
||||
}
|
||||
|
||||
void setModified(){
|
||||
|
||||
void setModified(boolean modified){
|
||||
if(isReadOnly())
|
||||
throw ExceptionFactory.createIsReadOnlyException();
|
||||
fIsModified = true;
|
||||
fIsModified = modified;
|
||||
}
|
||||
void setModified(){
|
||||
setModified(true);
|
||||
}
|
||||
|
||||
private Map getSessionPropertiesMap(boolean create){
|
||||
|
|
|
@ -23,7 +23,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingContainer;
|
|||
import org.eclipse.cdt.core.settings.model.ICSettingObject;
|
||||
import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
|
||||
import org.eclipse.cdt.core.settings.model.ICStorageElement;
|
||||
import org.eclipse.cdt.core.settings.model.IModificationContext;
|
||||
import org.eclipse.cdt.core.settings.model.WriteAccessException;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
|
||||
import org.eclipse.cdt.core.settings.model.util.CSettingEntryFactory;
|
||||
|
@ -206,15 +205,17 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
|
|||
// fIsLoadding = false;
|
||||
}
|
||||
|
||||
void applyDatas(IModificationContext context){
|
||||
boolean applyDatas(SettingsContext context){
|
||||
if(!fIsReadOnly || !fIsApplying)
|
||||
return;
|
||||
return false;
|
||||
|
||||
CSettingEntryFactory factory = new CSettingEntryFactory();
|
||||
boolean modified = false;
|
||||
for(Iterator iter = fCfgMap.values().iterator(); iter.hasNext();){
|
||||
CConfigurationDescriptionCache cache = (CConfigurationDescriptionCache)iter.next();
|
||||
try {
|
||||
cache.applyData(factory, context);
|
||||
if(cache.applyData(factory, context))
|
||||
modified = true;
|
||||
} catch (CoreException e) {
|
||||
CCorePlugin.log(e);
|
||||
e.printStackTrace();
|
||||
|
@ -227,6 +228,8 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
|
|||
factory.clear();
|
||||
|
||||
// fIsApplying = false;
|
||||
|
||||
return modified;
|
||||
}
|
||||
|
||||
|
||||
|
@ -280,10 +283,12 @@ public class CProjectDescription implements ICProjectDescription, ICDataProxyCon
|
|||
IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)iter.next();
|
||||
if(fIsReadOnly){
|
||||
CConfigurationData baseData = cfgDes.getConfigurationData(false);
|
||||
CConfigurationDescriptionCache baseCache = null;
|
||||
if(baseData instanceof CConfigurationDescriptionCache){
|
||||
baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData();
|
||||
baseCache = (CConfigurationDescriptionCache)baseData;
|
||||
baseData = baseCache.getConfigurationData();
|
||||
}
|
||||
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, cfgDes.getSpecSettings(), this, null);
|
||||
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache((ICConfigurationDescription)cfgDes, baseData, baseCache, cfgDes.getSpecSettings(), this, null);
|
||||
configurationCreated(cache);
|
||||
} else {
|
||||
CConfigurationData baseData = cfgDes.getConfigurationData(false);
|
||||
|
|
|
@ -69,7 +69,6 @@ import org.eclipse.cdt.core.settings.model.ICSettingsStorage;
|
|||
import org.eclipse.cdt.core.settings.model.ICSourceEntry;
|
||||
import org.eclipse.cdt.core.settings.model.ICStorageElement;
|
||||
import org.eclipse.cdt.core.settings.model.ICTargetPlatformSetting;
|
||||
import org.eclipse.cdt.core.settings.model.IModificationContext;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationData;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CConfigurationDataProvider;
|
||||
import org.eclipse.cdt.core.settings.model.extension.CFileData;
|
||||
|
@ -1671,11 +1670,12 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
|
|||
return provider.loadConfiguration(des, monitor);
|
||||
}
|
||||
|
||||
CConfigurationData applyData(ICConfigurationDescription des, ICConfigurationDescription baseDescription, CConfigurationData base, IModificationContext context, IProgressMonitor monitor) throws CoreException {
|
||||
CConfigurationData applyData(CConfigurationDescriptionCache des, ICConfigurationDescription baseDescription, CConfigurationData base, SettingsContext context, IProgressMonitor monitor) throws CoreException {
|
||||
if(monitor == null)
|
||||
monitor = new NullProgressMonitor();
|
||||
|
||||
CConfigurationDataProvider provider = getProvider(des);
|
||||
context.init(des);
|
||||
return provider.applyConfiguration(des, baseDescription, base, context, monitor);
|
||||
}
|
||||
|
||||
|
@ -3095,8 +3095,10 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
|
|||
private CConfigurationDescriptionCache createPreferenceCache(ICConfigurationDescription des) throws CoreException{
|
||||
IInternalCCfgInfo cfgDes = (IInternalCCfgInfo)des;
|
||||
CConfigurationData baseData = cfgDes.getConfigurationData(false);
|
||||
CConfigurationDescriptionCache baseCache = null;
|
||||
if(baseData instanceof CConfigurationDescriptionCache){
|
||||
baseData = ((CConfigurationDescriptionCache)baseData).getConfigurationData();
|
||||
baseCache = (CConfigurationDescriptionCache)baseData;
|
||||
baseData = baseCache.getConfigurationData();
|
||||
}
|
||||
CConfigurationSpecSettings settings = cfgDes.getSpecSettings();
|
||||
ICStorageElement rootEl = getBuildSystemConfigPreferenceStorage(des.getBuildSystemId(), true, false);
|
||||
|
@ -3104,7 +3106,7 @@ public class CProjectDescriptionManager implements ICProjectDescriptionManager {
|
|||
rootParent.removeChild(rootEl);
|
||||
ICStorageElement baseRootEl = settings.getRootStorageElement();
|
||||
rootEl = rootParent.importChild(baseRootEl);
|
||||
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, cfgDes.getSpecSettings(), null, rootEl);
|
||||
CConfigurationDescriptionCache cache = new CConfigurationDescriptionCache(des, baseData, baseCache, cfgDes.getSpecSettings(), null, rootEl);
|
||||
CSettingEntryFactory factory = new CSettingEntryFactory();
|
||||
SettingsContext context = new SettingsContext(null);
|
||||
cache.applyData(factory, context);
|
||||
|
|
|
@ -45,7 +45,7 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
|
|||
mngr.notifyListeners(event);
|
||||
CProjectDescription fNewDescriptionCache = null;
|
||||
SettingsContext context = new SettingsContext(project);
|
||||
|
||||
boolean modified;
|
||||
if(fSetDescription != null){
|
||||
InternalXmlStorageElement el = null;
|
||||
try {
|
||||
|
@ -63,10 +63,12 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
|
|||
fNewDescriptionCache = new CProjectDescription(fSetDescription, true, el, creating);
|
||||
try {
|
||||
mngr.setDescriptionApplying(project, fNewDescriptionCache);
|
||||
fNewDescriptionCache.applyDatas(context);
|
||||
modified = fNewDescriptionCache.applyDatas(context);
|
||||
} finally {
|
||||
mngr.clearDescriptionApplying(project);
|
||||
}
|
||||
} else {
|
||||
modified = fOldDescriptionCache != null;
|
||||
}
|
||||
|
||||
ICDescriptionDelta delta = mngr.createDelta(fNewDescriptionCache, fOldDescriptionCache);
|
||||
|
@ -115,8 +117,11 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
|
|||
mngr.notifyListeners(event);
|
||||
|
||||
try {
|
||||
if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE))
|
||||
context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache));
|
||||
if(fNewDescriptionCache != null && !CProjectDescriptionManager.checkFlags(fFlags, ICProjectDescriptionManager.SET_NO_SERIALIZE)){
|
||||
if(modified || isPersistentCoreSettingChanged(event)){
|
||||
context.addWorkspaceRunnable(mngr.createDesSerializationRunnable(fNewDescriptionCache));
|
||||
}
|
||||
}
|
||||
IWorkspaceRunnable toRun = context.createOperationRunnable();
|
||||
|
||||
if(toRun != null)
|
||||
|
@ -126,6 +131,23 @@ public class SetCProjectDescriptionOperation extends CModelOperation {
|
|||
}
|
||||
}
|
||||
|
||||
private static boolean isPersistentCoreSettingChanged(CProjectDescriptionEvent event){
|
||||
ICDescriptionDelta delta = event.getProjectDelta();
|
||||
if(delta == null)
|
||||
return false;
|
||||
if(delta.getDeltaKind() != ICDescriptionDelta.CHANGED)
|
||||
return true;
|
||||
|
||||
if(delta.getChildren().length != 0)
|
||||
return true;
|
||||
|
||||
int flags = delta.getChangeFlags();
|
||||
if(flags != 0 && flags != ICDescriptionDelta.ACTIVE_CFG)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean isReadOnly() {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,8 @@ public final class SettingsContext implements IModificationContext{
|
|||
private IProjectDescription fEDes;
|
||||
private IProject fProject;
|
||||
private CompositeWorkspaceRunnable fRunnable;
|
||||
private boolean fCfgDataModifyState;
|
||||
private boolean fCfgDataCacheState;
|
||||
|
||||
SettingsContext(IProject project){
|
||||
fProject = project;
|
||||
|
@ -31,6 +33,11 @@ public final class SettingsContext implements IModificationContext{
|
|||
return fProject;
|
||||
}
|
||||
|
||||
void init(CConfigurationDescriptionCache cfg){
|
||||
fCfgDataModifyState = true;
|
||||
fCfgDataCacheState = cfg.getBaseCache() != null;
|
||||
}
|
||||
|
||||
IProjectDescription getEclipseProjectDescription(boolean create) throws CoreException{
|
||||
IProjectDescription eDes = fEDes;
|
||||
if(eDes == null && create){
|
||||
|
@ -89,4 +96,16 @@ public final class SettingsContext implements IModificationContext{
|
|||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public boolean getBaseConfigurationDataCacheState() {
|
||||
return fCfgDataCacheState;
|
||||
}
|
||||
|
||||
public void setConfiguratoinDataModifiedState(boolean modified) {
|
||||
fCfgDataModifyState = modified;
|
||||
}
|
||||
|
||||
public boolean getConfiguratoinDataModifiedState(){
|
||||
return fCfgDataModifyState;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue