1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-06 08:35:26 +02:00

Add support to copy header files from Container to Host

- add logic in ContainerPropertyTab to kick off gcc specs discovery
  when the OK button is pressed
- also fix bug in ContainerPropertyTab whereby the image name
  was being reset to blank when a change occurred in connection combo
- add setLanguageSettngEntries method to CommandLauncherFactoryManager
- add registerLanguangeSettingEntries method to ICommandLauncherFactory
  and ContainerCommandLauncherFactory

Change-Id: I22f60a5ff42f9312cba42ca4d3b6f78225783378
This commit is contained in:
Jeff Johnston 2017-03-29 15:19:46 -04:00
parent ed2768aa50
commit e70713966f
7 changed files with 113 additions and 3 deletions

View file

@ -17,6 +17,7 @@ import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CommandLauncherFactoryManager;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.internal.core.XmlUtil;
@ -146,6 +147,7 @@ public class LanguageSettingsSerializableProvider extends LanguageSettingsBasePr
List<? extends ICLanguageSettingEntry> entries) {
String rcProjectPath = rc!=null ? rc.getProjectRelativePath().toString() : null;
fStorage.setSettingEntries(rcProjectPath, languageId, entries);
CommandLauncherFactoryManager.getInstance().setLanguageSettingEntries(cfgDescription.getProjectDescription().getProject(), entries);
}
/**

View file

@ -15,6 +15,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
@ -202,5 +203,15 @@ public class CommandLauncherFactoryManager {
}
}
public void setLanguageSettingEntries(IProject project, List<? extends ICLanguageSettingEntry> entries) {
for (ICommandLauncherFactory factory : factories) {
ICommandLauncher launcher = factory.getCommandLauncher(project);
if (launcher != null) {
factory.registerLanguageSettingEntries(project, entries);
}
}
}
}

View file

@ -10,6 +10,9 @@
*******************************************************************************/
package org.eclipse.cdt.core;
import java.util.List;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.core.resources.IProject;
/**
@ -24,4 +27,11 @@ public interface ICommandLauncherFactory {
*/
public ICommandLauncher getCommandLauncher(IProject project);
/**
* Register language setting entries for a project
* @param project - IProject used in obtaining language setting entries
* @param entries - List of language setting entries
*/
public void registerLanguageSettingEntries(IProject project, List<? extends ICLanguageSettingEntry> entries);
}

View file

@ -10,15 +10,24 @@
*******************************************************************************/
package org.eclipse.cdt.docker.launcher;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.ICommandLauncher;
import org.eclipse.cdt.core.ICommandLauncherFactory;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICIncludePathEntry;
import org.eclipse.cdt.core.settings.model.ICLanguageSettingEntry;
import org.eclipse.cdt.internal.docker.launcher.ContainerCommandLauncher;
import org.eclipse.cdt.internal.docker.launcher.Messages;
import org.eclipse.cdt.managedbuilder.buildproperties.IOptionalBuildProperties;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Platform;
import org.eclipse.linuxtools.docker.ui.launch.ContainerLauncher;
public class ContainerCommandLauncherFactory
implements ICommandLauncherFactory {
@ -47,4 +56,58 @@ public class ContainerCommandLauncherFactory
return null;
}
@Override
public void registerLanguageSettingEntries(IProject project,
List<? extends ICLanguageSettingEntry> entries) {
ICConfigurationDescription cfgd = CoreModel.getDefault()
.getProjectDescription(project).getActiveConfiguration();
IConfiguration cfg = ManagedBuildManager
.getConfigurationForDescription(cfgd);
IOptionalBuildProperties props = cfg.getOptionalBuildProperties();
if (props != null) {
String enablementProperty = props.getProperty(
ContainerCommandLauncher.CONTAINER_BUILD_ENABLED);
if (enablementProperty != null) {
boolean enableContainer = Boolean
.parseBoolean(enablementProperty);
if (enableContainer) {
String connectionName = props.getProperty(
ContainerCommandLauncher.CONNECTION_ID);
String imageName = props
.getProperty(ContainerCommandLauncher.IMAGE_ID);
if (connectionName == null || connectionName.isEmpty()
|| imageName == null || imageName.isEmpty()) {
DockerLaunchUIPlugin.logErrorMessage(
Messages.ContainerCommandLauncher_invalid_values);
return;
}
String prefix = getCleanName(connectionName)
+ IPath.SEPARATOR
+ getCleanName(imageName); //$NON-NLS-1$ //$NON-NLS-2$
ContainerLauncher launcher = new ContainerLauncher();
List<String> paths = new ArrayList<>();
for (ICLanguageSettingEntry entry : entries) {
if (entry instanceof ICIncludePathEntry) {
String path = entry.getValue();
paths.add(path);
}
}
if (paths.size() > 0) {
IPath pluginPath = Platform.getStateLocation(Platform
.getBundle(DockerLaunchUIPlugin.PLUGIN_ID));
IPath hostDir = pluginPath.append(prefix);
int status = launcher.fetchContainerDirs(connectionName,
imageName,
paths, hostDir);
}
}
}
}
}
private String getCleanName(String name) {
return name.replaceAll("[:/]", "_"); //$NON-NLS-1$ //$NON-NLS-2$
}
}

View file

@ -11,14 +11,19 @@
package org.eclipse.cdt.internal.docker.launcher;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider;
import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper;
import org.eclipse.cdt.core.settings.model.ICConfigurationDescription;
import org.eclipse.cdt.core.settings.model.ICMultiConfigDescription;
import org.eclipse.cdt.core.settings.model.ICResourceDescription;
import org.eclipse.cdt.managedbuilder.buildproperties.IOptionalBuildProperties;
import org.eclipse.cdt.managedbuilder.core.IConfiguration;
import org.eclipse.cdt.managedbuilder.core.IMultiConfiguration;
import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager;
import org.eclipse.cdt.managedbuilder.internal.core.Configuration;
import org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuiltinSpecsDetector;
import org.eclipse.cdt.managedbuilder.ui.properties.AbstractCBuildPropertyTab;
import org.eclipse.linuxtools.docker.core.DockerConnectionManager;
import org.eclipse.linuxtools.docker.core.IDockerConnection;
@ -83,8 +88,6 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab
connectionName = connection.getName();
properties.setProperty(ContainerCommandLauncher.CONNECTION_ID,
connectionUri);
properties.setProperty(ContainerCommandLauncher.IMAGE_ID,
imageCombo.getText());
}
};
@ -265,7 +268,6 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab
if (defaultImage != null) {
int index = imageCombo.indexOf(defaultImage);
if (index > -1) {
imageCombo.getItem(index);
imageCombo.select(index);
} else {
}
@ -313,6 +315,25 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab
}
@Override
protected void performOK() {
if (enableButton.getSelection()) {
ICConfigurationDescription cfgd = ManagedBuildManager
.getDescriptionForConfiguration(iCfg);
List<ILanguageSettingsProvider> providers = ((ILanguageSettingsProvidersKeeper) cfgd)
.getLanguageSettingProviders();
for (ILanguageSettingsProvider provider : providers) {
if (provider instanceof GCCBuiltinSpecsDetector) {
GCCBuiltinSpecsDetector d = (GCCBuiltinSpecsDetector) provider;
// force recalculation of gcc include path
d.clear();
d.handleEvent(null);
}
}
}
super.performOK();
}
@Override
protected void performDefaults() {
if (iCfg instanceof IMultiConfiguration) {

View file

@ -96,6 +96,8 @@ public class Messages extends NLS {
public static String ContainerCommandLauncher_image_msg;
public static String CommandLauncher_CommandCancelled;
public static String ContainerCommandLauncher_invalid_values;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);

View file

@ -44,6 +44,7 @@ ContainerPropertyTab_Title=Container Settings
ContainerPropertyTab_Enable_Msg=Build inside Docker Image
ContainerCommandLauncher_image_msg=[Running in image <{0}>]
ContainerCommandLauncher_invalid_values=Invalid values for Connection and/or Image name
CommandLauncher_CommandCancelled=Command cancelled