diff options
author | Greg Watson | 2014-05-13 16:56:51 +0000 |
---|---|---|
committer | Jeff Johnston | 2014-05-20 16:01:40 +0000 |
commit | 009a3a7d5f835b2aedf62424dd3929c229d10559 (patch) | |
tree | 7183d0faa9b20974bc6452c5f63e3453a256146f | |
parent | 5806deb5b87f75a5b5f2da5344705aa24eefd513 (diff) | |
download | org.eclipse.cdt-009a3a7d5f835b2aedf62424dd3929c229d10559.tar.gz org.eclipse.cdt-009a3a7d5f835b2aedf62424dd3929c229d10559.tar.xz org.eclipse.cdt-009a3a7d5f835b2aedf62424dd3929c229d10559.zip |
[autotools] Prevent MalformedURLException when setting remote working
directory.
Change-Id: Ib8a6a7d4df09a1f73a533db0a3821fcdb8cecdcb
Signed-off-by: Greg Watson <g.watson@computer.org>
Reviewed-on: https://git.eclipse.org/r/26428
Tested-by: Hudson CI
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
Tested-by: Jeff Johnston <jjohnstn@redhat.com>
2 files changed, 80 insertions, 41 deletions
diff --git a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/AutotoolsNewMakeGenerator.java b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/AutotoolsNewMakeGenerator.java index 80b0e119aab..6367da4e916 100644 --- a/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/AutotoolsNewMakeGenerator.java +++ b/build/org.eclipse.cdt.autotools.core/src/org/eclipse/cdt/internal/autotools/core/AutotoolsNewMakeGenerator.java @@ -84,6 +84,7 @@ import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.core.IRemoteResource; import org.eclipse.remote.core.IRemoteServices; import org.eclipse.remote.core.RemoteServices; +import org.eclipse.remote.core.exception.RemoteConnectionException; @SuppressWarnings("deprecation") @@ -220,12 +221,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { newFile.setDerived(true); } // if successful, refresh any remote projects to notify them of the new file - IRemoteResource remRes = - (IRemoteResource)getProject().getAdapter(IRemoteResource.class); - if (remRes != null) { - remRes.refresh(new NullProgressMonitor()); - } - + refresh(); } catch (CoreException e) { // If the file already existed locally, just refresh to get contents if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) @@ -253,17 +249,20 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { rc = f.mkdirs(); if (rc) { // if successful, refresh any remote projects to notify them of the new directory - IRemoteResource remRes = - (IRemoteResource)project.getAdapter(IRemoteResource.class); - if (remRes != null) { - remRes.refresh(new NullProgressMonitor()); - } - + refresh(); } } return rc; } + + private void refresh() throws CoreException{ + IRemoteResource remRes = + (IRemoteResource)getProject().getAdapter(IRemoteResource.class); + if (remRes != null) { + remRes.refresh(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + } + } /* * (non-Javadoc) @@ -537,6 +536,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { errMsg, console, autogenEnvs, consoleStart); consoleStart = false; if (rc != IStatus.ERROR) { + refresh(); configStatus = configfile.toFile(); // Check for config.status. If it is created, then // autogen.sh ran configure and we should not run it @@ -556,6 +556,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { AutotoolsPlugin.getFormattedString("MakeGenerator.autoreconf", new String[]{buildDir}), //$NON-NLS-1$ errMsg, console, null, consoleStart); consoleStart = false; + refresh(); } // Check if configure generated and if yes, run it. if (rc != IStatus.ERROR && configurePath.toFile().exists()) { @@ -611,6 +612,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { consoleStart = false; // Check if configure generated and if yes, run it. if (rc != IStatus.ERROR) { + refresh(); if (configurePath.toFile().exists()) { rc = runScript(configurePath, buildLocation, @@ -926,7 +928,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { launcher.showCommand(true); Process proc = launcher.execute(commandPath, configTargets, env, - runPath, new NullProgressMonitor()); + runPath, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); int exitValue = 0; if (proc != null) { try { @@ -1036,15 +1038,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { private IPath getRemotePath(IPath path) { IRemoteResource remRes = (IRemoteResource) getProject().getAdapter(IRemoteResource.class); if (remRes != null) { - IPath relativePath = path.makeRelativeTo(getProject().getLocation()); - try { - IPath remotePath = - new Path(remRes.getActiveLocationURI().toURL().getPath()).append(relativePath); - return remotePath; - } catch (MalformedURLException e) { - // fall-through to default action - } - + return RemoteCommandLauncher.makeRemote(path, remRes); } return path; } @@ -1075,7 +1069,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { new String[] { "-c", "echo $OSTYPE" }, //$NON-NLS-1$ //$NON-NLS-2$ env, new Path("."), //$NON-NLS-1$ - new NullProgressMonitor()); + new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); if (launcher.waitAndRead(out, out) == ICommandLauncher.OK) winOSType = out.toString().trim(); } catch (CoreException e) { @@ -1096,7 +1090,16 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { IRemoteConnection conn = remServices.getConnectionManager().getConnection(uri); if (conn != null) { - return conn.getProperty(IRemoteConnection.OS_NAME_PROPERTY); + if (!conn.isOpen()) { + try { + conn.open(new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); + if (conn.isOpen()) { + return conn.getProperty(IRemoteConnection.OS_NAME_PROPERTY); + } + } catch (RemoteConnectionException e) { + // Ignore and return platform OS + } + } } } } @@ -1282,7 +1285,7 @@ public class AutotoolsNewMakeGenerator extends MarkerGenerator { launcher.showCommand(true); // Run the shell script via shell command. Process proc = launcher.execute(new Path(SHELL_COMMAND), configTargets, env, - runPath, new NullProgressMonitor()); + runPath, new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN)); int exitValue = 0; if (proc != null) { diff --git a/remote/org.eclipse.cdt.remote.core/src/org/eclipse/cdt/remote/core/RemoteCommandLauncher.java b/remote/org.eclipse.cdt.remote.core/src/org/eclipse/cdt/remote/core/RemoteCommandLauncher.java index 222d40f6d3d..b8b85e35655 100644 --- a/remote/org.eclipse.cdt.remote.core/src/org/eclipse/cdt/remote/core/RemoteCommandLauncher.java +++ b/remote/org.eclipse.cdt.remote.core/src/org/eclipse/cdt/remote/core/RemoteCommandLauncher.java @@ -35,6 +35,47 @@ import org.eclipse.remote.core.RemoteProcessAdapter; import org.eclipse.remote.core.RemoteServices; public class RemoteCommandLauncher implements ICommandLauncher { + + /** + * Convert a local (workspace) path into the remote equivalent. If the local path is not + * absolute, then do nothing. + * + * e.g. Suppose the local path is /u/local_user/workspace/local_project/subdir1/subdir2 + * Suppose the remote project location is /home/remote_user/remote_project + * Then the resulting path will be /home/remote_user/remote_project/subdir1/subdir2 + * + * @param localPath absolute local path in the workspace + * @param remote remote project + * @return remote path that is the equivalent of the local path + */ + public static String makeRemote(String local, IRemoteResource remote) { + return makeRemote(new Path(local), remote).toString(); + } + + /** + * Convert a local (workspace) path into the remote equivalent. If the local path is not + * absolute, then do nothing. + * + * e.g. Suppose the local path is /u/local_user/workspace/local_project/subdir1/subdir2 + * Suppose the remote project location is /home/remote_user/remote_project + * Then the resulting path will be /home/remote_user/remote_project/subdir1/subdir2 + * + * @param localPath absolute local path in the workspace + * @param remote remote project + * @return remote path that is the equivalent of the local path + */ + public static IPath makeRemote(IPath localPath, IRemoteResource remote) { + if (!localPath.isAbsolute()) { + return localPath; + } + IPath relativePath = localPath.makeRelativeTo(remote.getResource().getLocation()); + IPath remotePath = new Path(remote.getActiveLocationURI().getPath()); + if (!relativePath.isEmpty()) { + remotePath = remotePath.append(relativePath); + } + return remotePath; + } + private final ICommandLauncher fLocalLauncher = new CommandLauncher(); private boolean fShowCommand; private String[] fCommandArgs; @@ -50,18 +91,20 @@ public class RemoteCommandLauncher implements ICommandLauncher { /** * Constructs a command array that will be passed to the process */ - private String[] constructCommandArray(String command, String[] commandArgs) { + private String[] constructCommandArray(String command, String[] commandArgs, IRemoteResource remote) { String[] args = new String[1 + commandArgs.length]; - args[0] = command; - System.arraycopy(commandArgs, 0, args, 1, commandArgs.length); + args[0] = makeRemote(command, remote); + for (int i = 0; i < commandArgs.length; i++) { + args[i + 1] = makeRemote(commandArgs[i], remote); + } return args; } @Override public Process execute(IPath commandPath, String[] args, String[] env, IPath workingDirectory, IProgressMonitor monitor) throws CoreException { - if (fLocalLauncher.getProject() != null) { - IRemoteResource remRes = (IRemoteResource) fLocalLauncher.getProject().getAdapter(IRemoteResource.class); + if (getProject() != null) { + IRemoteResource remRes = (IRemoteResource) getProject().getAdapter(IRemoteResource.class); if (remRes != null) { URI uri = remRes.getActiveLocationURI(); IRemoteServices remServices = RemoteServices.getRemoteServices(uri); @@ -69,19 +112,12 @@ public class RemoteCommandLauncher implements ICommandLauncher { fConnection = remServices.getConnectionManager().getConnection(uri); if (fConnection != null) { parseEnvironment(env); - fCommandArgs = constructCommandArray(commandPath.toOSString(), args); + fCommandArgs = constructCommandArray(commandPath.toString(), args, remRes); IRemoteProcessBuilder processBuilder = fConnection.getProcessBuilder(fCommandArgs); if (workingDirectory != null) { - IPath relativePath = workingDirectory.makeRelativeTo(getProject().getLocation()); - try { - IPath remoteWorkingPath = - new Path(remRes.getActiveLocationURI().toURL().getPath()).append(relativePath); - IFileStore wd = fConnection.getFileManager().getResource(remoteWorkingPath.toString()); - processBuilder.directory(wd); - } catch (MalformedURLException e) { - fLocalLauncher.setErrorMessage(e.getMessage()); - return null; - } + String remoteWorkingPath = makeRemote(workingDirectory.toString(), remRes); + IFileStore wd = fConnection.getFileManager().getResource(remoteWorkingPath); + processBuilder.directory(wd); } Map<String, String> processEnv = processBuilder.environment(); for (String key : fEnvironment.stringPropertyNames()) { |