1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-03 22:35: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:
Mikhail Sennikovsky 2007-08-09 14:11:53 +00:00
parent c11d44bf9e
commit d8c16534f0
9 changed files with 155 additions and 82 deletions

View file

@ -960,7 +960,7 @@ public class Configuration extends BuildObject implements IConfiguration, IBuild
LanguageSettingEntriesSerializer.serializeEntries(sourceEntries, el);
}
// I am clean now
isDirty = false;
setDirty(false);
}
/*

View file

@ -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;
}

View file

@ -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();
}

View file

@ -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(){

View file

@ -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){

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}
}