diff --git a/launch/org.eclipse.cdt.docker.launcher/META-INF/MANIFEST.MF b/launch/org.eclipse.cdt.docker.launcher/META-INF/MANIFEST.MF index 2f27aba1f8d..c6eed08bace 100644 --- a/launch/org.eclipse.cdt.docker.launcher/META-INF/MANIFEST.MF +++ b/launch/org.eclipse.cdt.docker.launcher/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.cdt.docker.launcher;singleton:=true -Bundle-Version: 1.3.400.qualifier +Bundle-Version: 2.0.0.qualifier Bundle-Activator: org.eclipse.cdt.docker.launcher.DockerLaunchUIPlugin Bundle-Vendor: %Plugin.vendor Bundle-Localization: plugin diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncher.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncher.java index cae5dadc7e5..86dbfffaf7c 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncher.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/docker/launcher/ContainerCommandLauncher.java @@ -62,6 +62,8 @@ public class ContainerCommandLauncher implements ICommandLauncher, ICBuildComman public final static String VOLUMES_ID = DockerLaunchUIPlugin.PLUGIN_ID + ".containerbuild.property.volumes"; //$NON-NLS-1$ public final static String SELECTED_VOLUMES_ID = DockerLaunchUIPlugin.PLUGIN_ID + ".containerbuild.property.selectedvolumes"; //$NON-NLS-1$ + /** @since 2.0 */ + public final static String DOCKERD_PATH = DockerLaunchUIPlugin.PLUGIN_ID + ".containerbuild.property.dockerdpath"; //$NON-NLS-1$ public final static String VOLUME_SEPARATOR_REGEX = "[|]"; //$NON-NLS-1$ @@ -253,14 +255,16 @@ public Process execute(IPath commandPath, String[] args, String[] env, IPath wor boolean keepContainer = prefs.getBoolean(PreferenceConstants.KEEP_CONTAINER_AFTER_LAUNCH, false); ICBuildConfiguration buildCfg = getBuildConfiguration(); - String selectedVolumeString = null; - String connectionName = null; - String imageName = null; + final String selectedVolumeString; + final String connectionName; + final String imageName; + final String pathMapProperty; if (buildCfg != null) { IToolChain toolChain = buildCfg.getToolChain(); selectedVolumeString = toolChain.getProperty(SELECTED_VOLUMES_ID); connectionName = toolChain.getProperty(IContainerLaunchTarget.ATTR_CONNECTION_URI); imageName = toolChain.getProperty(IContainerLaunchTarget.ATTR_IMAGE_ID); + pathMapProperty = toolChain.getProperty(DOCKERD_PATH); } else { ICConfigurationDescription cfgd = CoreModel.getDefault().getProjectDescription(fProject) .getActiveConfiguration(); @@ -272,6 +276,7 @@ public Process execute(IPath commandPath, String[] args, String[] env, IPath wor selectedVolumeString = props.getProperty(SELECTED_VOLUMES_ID); connectionName = props.getProperty(ContainerCommandLauncher.CONNECTION_ID); imageName = props.getProperty(ContainerCommandLauncher.IMAGE_ID); + pathMapProperty = props.getProperty(DOCKERD_PATH); } // Add any specified volumes to additional dir list @@ -288,8 +293,20 @@ public Process execute(IPath commandPath, String[] args, String[] env, IPath wor } setImageName(imageName); - additionalDirs.addAll( - additionalPaths.stream().map(p -> ContainerLaunchUtils.toDockerVolume(p)).collect(Collectors.toList())); + final Map pathMap = new HashMap<>(); + + if (pathMapProperty != null && !pathMapProperty.isEmpty()) { + final var entries = pathMapProperty.split(";"); //$NON-NLS-1$ + for (var e : entries) { + final var spl = e.split("\\|"); //$NON-NLS-1$ + if (spl.length == 2) { + pathMap.put(spl[0], spl[1]); + } + } + } + + additionalDirs.addAll(additionalPaths.stream().map(p -> ContainerLaunchUtils.toDockerVolume(pathMap, p)) + .collect(Collectors.toList())); fProcess = launcher.runCommand(connectionName, imageName, fProject, this, cmdList, workingDir, additionalDirs, origEnv, fEnvironment, supportStdin, privilegedMode, labels, keepContainer); diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchUtils.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchUtils.java index ff55ba042b9..db0f3ea1496 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchUtils.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerLaunchUtils.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.cdt.internal.docker.launcher; +import java.util.Map; + import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; @@ -59,11 +61,23 @@ public static final String toDockerPath(String path) { * @param path The path on the hose * @return The string to be passed to the docker daemon */ - public static final String toDockerVolume(IPath path) { - IPath p = path.makeAbsolute(); - String rv = toDockerPath(p); + public static final String toDockerVolume(Map pMap, IPath path) { + // The path on the Docker host + var dhPath = path.makeAbsolute().toString(); + + for (var me : pMap.entrySet()) { + var elp = me.getKey(); + var edhp = me.getValue(); + if (dhPath.startsWith(elp)) { + dhPath = edhp + dhPath.substring(elp.length()); + break; + } + } + + // docker-path first, docker-host-path third + String rv = toDockerPath(path.makeAbsolute()); rv += ":HOST_FILE_SYSTEM:"; //$NON-NLS-1$ - rv += p.toOSString(); + rv += dhPath; rv += ":false:true"; //$NON-NLS-1$ RO=false, selected = true return rv; } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java index 9f66f2fa11d..60e7cf50032 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyTab.java @@ -22,6 +22,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvider; import org.eclipse.cdt.core.language.settings.providers.ILanguageSettingsProvidersKeeper; @@ -86,6 +87,7 @@ import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; +import org.eclipse.swt.widgets.Text; @SuppressWarnings("restriction") public class ContainerPropertyTab extends AbstractCBuildPropertyTab @@ -102,6 +104,7 @@ public class ContainerPropertyTab extends AbstractCBuildPropertyTab private Button enableButton; private Button launchAutotoolsButton; private Button addButton; + private Text dockerDPath; private IDockerConnection connection; private IDockerConnection[] connections; private IDockerImageListener containerTab; @@ -214,6 +217,49 @@ public void verifyText(VerifyEvent e) { gd.grabExcessHorizontalSpace = false; label1.setLayoutData(gd); } + // DockerDPath + { + Label label = new Label(usercomp, SWT.NULL); + label.setText(Messages.ContainerPropertyTab_dockerDPath); + gd = new GridData(GridData.FILL_HORIZONTAL); + label.setLayoutData(gd); + + dockerDPath = new Text(usercomp, SWT.BORDER); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 3; + dockerDPath.setLayoutData(gd); + dockerDPath.setToolTipText(Messages.ContainerPropertyTab_dockerDPath_Tooltip); + dockerDPath.addModifyListener(new ModifyListener() { + @Override + public void modifyText(ModifyEvent e) { + setDockerDPath(dockerDPath.getText()); + + } + }); + + label = new Label(usercomp, SWT.NULL); + gd = new GridData(); + gd.grabExcessHorizontalSpace = false; + label.setLayoutData(gd); + + label = new Label(usercomp, SWT.NULL); + gd = new GridData(); + gd.grabExcessHorizontalSpace = false; + label.setLayoutData(gd); + + label = new Label(usercomp, SWT.NULL); + label.setText(Messages.ContainerPropertyTab_dockerDPath_Instruction); + gd = new GridData(); + gd.horizontalSpan = 3; + gd.grabExcessHorizontalSpace = false; + label.setLayoutData(gd); + + label = new Label(usercomp, SWT.NULL); + gd = new GridData(); + gd.grabExcessHorizontalSpace = false; + label.setLayoutData(gd); + + } // Image selector { Label imageSelectorLabel = new Label(usercomp, SWT.NULL); @@ -602,6 +648,20 @@ private void setLaunchAutotoolsEnablement(boolean enabled) { } } + private void setDockerDPath(String ddPath) { + if (iCfg instanceof IMultiConfiguration) { + IConfiguration[] cfs = (IConfiguration[]) ((IMultiConfiguration) iCfg).getItems(); + for (int i = 0; i < cfs.length; i++) { + IConfiguration cfg = cfs[i]; + IOptionalBuildProperties p = cfg.getOptionalBuildProperties(); + p.setProperty(ContainerCommandLauncher.DOCKERD_PATH, ddPath); + } + } else { + IOptionalBuildProperties p = iCfg.getOptionalBuildProperties(); + p.setProperty(ContainerCommandLauncher.DOCKERD_PATH, ddPath); + } + } + private void setImageId(String imageId) { if (iCfg instanceof IMultiConfiguration) { IConfiguration[] cfs = (IConfiguration[]) ((IMultiConfiguration) iCfg).getItems(); @@ -730,6 +790,12 @@ private void refreshImages() { } + private void initializeDockerDPath() { + IOptionalBuildProperties properties = iCfg.getOptionalBuildProperties(); + var path = properties.getProperty(ContainerCommandLauncher.DOCKERD_PATH); + dockerDPath.setText(path == null ? "" : path); //$NON-NLS-1$ + } + private void initializeImageCombo() { initialImageId = null; IOptionalBuildProperties properties = iCfg.getOptionalBuildProperties(); @@ -893,22 +959,8 @@ protected void performOK() { @Override protected void performDefaults() { - if (iCfg instanceof IMultiConfiguration) { - IConfiguration[] cfs = (IConfiguration[]) ((IMultiConfiguration) iCfg).getItems(); - for (int i = 0; i < cfs.length; i++) { - IOptionalBuildProperties props = cfs[i].getOptionalBuildProperties(); - props.setProperty(ContainerCommandLauncher.CONTAINER_BUILD_ENABLED, Boolean.toString(false)); - if (connections.length > 0) { - props.setProperty(ContainerCommandLauncher.CONNECTION_ID, connections[0].getUri()); - } else { - props.setProperty(ContainerCommandLauncher.CONNECTION_ID, null); - } - props.setProperty(ContainerCommandLauncher.IMAGE_ID, null); - props.setProperty(ContainerCommandLauncher.VOLUMES_ID, null); - props.setProperty(ContainerCommandLauncher.SELECTED_VOLUMES_ID, null); - } - } else { - IOptionalBuildProperties props = iCfg.getOptionalBuildProperties(); + + Consumer setProps = (IOptionalBuildProperties props) -> { props.setProperty(ContainerCommandLauncher.CONTAINER_BUILD_ENABLED, Boolean.toString(false)); if (connections.length > 0) { props.setProperty(ContainerCommandLauncher.CONNECTION_ID, connections[0].getUri()); @@ -916,6 +968,20 @@ protected void performDefaults() { props.setProperty(ContainerCommandLauncher.CONNECTION_ID, null); } props.setProperty(ContainerCommandLauncher.IMAGE_ID, null); + props.setProperty(ContainerCommandLauncher.VOLUMES_ID, null); + props.setProperty(ContainerCommandLauncher.SELECTED_VOLUMES_ID, null); + props.setProperty(ContainerCommandLauncher.DOCKERD_PATH, null); + }; + + if (iCfg instanceof IMultiConfiguration) { + IConfiguration[] cfs = (IConfiguration[]) ((IMultiConfiguration) iCfg).getItems(); + for (int i = 0; i < cfs.length; i++) { + IOptionalBuildProperties props = cfs[i].getOptionalBuildProperties(); + setProps.accept(props); + } + } else { + IOptionalBuildProperties props = iCfg.getOptionalBuildProperties(); + setProps.accept(props); } initialEnabled = false; initialConnection = null; @@ -926,6 +992,7 @@ protected void performDefaults() { connectionSelector.select(0); } imageCombo.setText(""); //$NON-NLS-1$ + dockerDPath.setText(""); //$NON-NLS-1$ model.setDataVolumes(null); model.setSelectedDataVolumes(new HashSet<>()); enableButton.setSelection(false); @@ -943,6 +1010,7 @@ public void updateData(ICResourceDescription cfgd) { initializeConnectionSelector(); initializeImageCombo(); + initializeDockerDPath(); initializeEnablementButton(); initializeVolumesTable(); } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyVolumesModel.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyVolumesModel.java index b520dcdd557..9ce0b5f6a0b 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyVolumesModel.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/ContainerPropertyVolumesModel.java @@ -53,6 +53,16 @@ public enum MountType { private IDockerImage selectedImage; + private String dockerDPath; + + public String getDockerDPath() { + return dockerDPath; + } + + public void setDockerDPath(String dockerDPath) { + this.dockerDPath = dockerDPath; + } + public ContainerPropertyVolumesModel(final IDockerConnection connection) { this.connection = connection; } diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/Messages.java b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/Messages.java index ebe386b5df4..ec95df07249 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/Messages.java +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/Messages.java @@ -112,6 +112,9 @@ public class Messages extends NLS { public static String StandardGDBDebuggerPage14; + public static String ContainerPropertyTab_dockerDPath; + public static String ContainerPropertyTab_dockerDPath_Instruction; + public static String ContainerPropertyTab_dockerDPath_Tooltip; public static String ContainerPropertyTab_Title; public static String ContainerPropertyTab_Enable_Msg; public static String ContainerPropertyTab_Run_Autotools_In_Container_Msg; diff --git a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/messages.properties b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/messages.properties index c2542845474..e9bc73acf70 100644 --- a/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/messages.properties +++ b/launch/org.eclipse.cdt.docker.launcher/src/org/eclipse/cdt/internal/docker/launcher/messages.properties @@ -61,6 +61,9 @@ ContainerPortDialog_containerLabel=Container port: ContainerPortDialog_hostAddressLabel=Host address: ContainerPortDialog_hostPortLabel=Host port: +ContainerPropertyTab_dockerDPath=Path mapping: +ContainerPropertyTab_dockerDPath_Instruction="|;[..]" - e.g "C:|/mnt/c;D:|/mnt/d" +ContainerPropertyTab_dockerDPath_Tooltip=Leave empty when in doubt. Mapping is done using string replacement. ContainerPropertyTab_Title=Container Settings ContainerPropertyTab_Enable_Msg=Build inside Docker Image ContainerPropertyTab_Run_Autotools_In_Container_Msg=Run all Autotools in Container