diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java index 931d1bb22b8..e0c991f874a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuildMessages.java @@ -20,12 +20,14 @@ public class HeadlessBuildMessages extends NLS { public static String HeadlessBuilder_cant_be_found; public static String HeadlessBuilder_clean_failed; public static String HeadlessBuilder_cleaning_all_projects; + public static String HeadlessBuilder_CouldntLockWorkspace; public static String HeadlessBuilder_Directory; public static String HeadlessBuilder_Error; public static String HeadlessBuilder_importAll; public static String HeadlessBuilder_invalid_argument; public static String HeadlessBuilder_is_not_accessible; public static String HeadlessBuilder_is_not_valid_in_workspace; + public static String HeadlessBuilder_MustSpecifyWorkspace; public static String HeadlessBuilder_no_arguments; public static String HeadlessBuilder_NoConfigMatched; public static String HeadlessBuilder_NoProjectMatched; @@ -40,8 +42,10 @@ public class HeadlessBuildMessages extends NLS { public static String HeadlessBuilder_usage; public static String HeadlessBuilder_usage_build; public static String HeadlessBuilder_usage_clean_build; + public static String HeadlessBuilder_invalid_uri; public static String HeadlessBuilder_usage_import; public static String HeadlessBuilder_Workspace; + public static String HeadlessBuilder_WorkspaceInUse; static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, HeadlessBuildMessages.class); diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java index 4c23178d202..0a96d86fed1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/HeadlessBuilder.java @@ -8,6 +8,8 @@ * Contributors: * Broadcom Corporation - initial API and implementation * Clare Richardson (Motorola) - Bug 281397 building specific configs + * Dmitry Kozlov (CodeSourcery) - Bug 309909 Headless build import fails + * silently with relative pathname *******************************************************************************/ package org.eclipse.cdt.managedbuilder.internal.core; @@ -46,11 +48,13 @@ import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.core.runtime.jobs.Job; import org.eclipse.equinox.app.IApplication; import org.eclipse.equinox.app.IApplicationContext; +import org.eclipse.osgi.service.datalocation.Location; /** * A headless builder for CDT with additional features. @@ -58,7 +62,7 @@ import org.eclipse.equinox.app.IApplicationContext; * IApplication ID: org.eclipse.cdt.managedbuilder.core.headlessbuild * Provides: * - Import projects : -import {[uri:/]/path/to/project} - * - Import all projects in the tree : -importAll {[uri:/]/path/to/projectTreeURI} + * - Import all projects in the tree : -importAll {[uri:/]/path/to/projectTreeURI} * - Build projects / the workspace : -build {project_name_reg_ex/config_name_reg_ex | all} * - Clean build projects / the workspace : -cleanBuild {project_name_reg_ex/config_name_reg_ex | all} * @@ -218,6 +222,18 @@ public class HeadlessBuilder implements IApplication { if (project_uri == null || project_uri.getScheme() == null) { IPath p = new Path(projURIStr).addTrailingSeparator(); project_uri = URIUtil.toURI(p); + + // Handle relative paths as relative to cwd + if (project_uri.getScheme() == null) { + String cwd = System.getProperty("user.dir"); //$NON-NLS-1$ + p = new Path(cwd).addTrailingSeparator(); + p = p.append(projURIStr); + project_uri = URIUtil.toURI(p); + } + if (project_uri.getScheme() == null) { + System.err.println(HeadlessBuildMessages.HeadlessBuilder_invalid_uri + project_uri); + return ERROR; + } } if (recurse) { @@ -285,6 +301,10 @@ public class HeadlessBuilder implements IApplication { } public Object start(IApplicationContext context) throws Exception { + // Check its OK to use this workspace as IDEApplication does + if (!checkInstanceLocation()) + return ERROR; + IProgressMonitor monitor = new PrintingProgressMonitor(); IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); @@ -384,6 +404,38 @@ public class HeadlessBuilder implements IApplication { return OK; } + /** + * Verify that it's safe to use the specified workspace. i.e. that + * we can write to it and that it's not already locked / in-use. + * + * Return true if a valid workspace path has been set and false otherwise. + * + * @return true if a valid instance location has been set and false + * otherwise + */ + private boolean checkInstanceLocation() { + // -data @none was specified but an ide requires workspace + Location instanceLoc = Platform.getInstanceLocation(); + if (instanceLoc == null || !instanceLoc.isSet()) { + System.err.println(HeadlessBuildMessages.HeadlessBuilder_MustSpecifyWorkspace); + return false; + } + + // -data "/valid/path", workspace already set + try { + // at this point its valid, so try to lock it to prevent concurrent use + if (!instanceLoc.lock()) { + System.err.println(HeadlessBuildMessages.HeadlessBuilder_WorkspaceInUse); + return false; + } + return true; + } catch (IOException e) { + System.err.println(HeadlessBuildMessages.HeadlessBuilder_CouldntLockWorkspace); + } + return false; + } + + /** * Helper method to process expected arguments * diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties index 283f38e9362..f08762cb4d3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/PluginResources.properties @@ -166,6 +166,7 @@ HeadlessBuilder_building_all=Building All Projects... HeadlessBuilder_cant_be_found=\ can't be found\! HeadlessBuilder_clean_failed=Couldn't CLEAN project HeadlessBuilder_cleaning_all_projects=Cleaning All Projects... +HeadlessBuilder_CouldntLockWorkspace=Could not obtain lock for workspace location HeadlessBuilder_Directory=Directory: HeadlessBuilder_Error=Error: HeadlessBuilder_invalid_argument=Invalid Arguments: @@ -187,7 +188,10 @@ HeadlessBuilder_usage_build=\ \ \ -build {project_name_reg_ex{/config_reg_e HeadlessBuilder_usage_clean_build=\ \ \ -cleanBuild {project_name_reg_ex{/config_reg_ex} | all} HeadlessBuilder_usage_import=\ \ \ -import {[uri:/]/path/to/project} HeadlessBuilder_importAll=\ \ \ -importAll {[uri:/]/path/to/projectTreeURI} Import all projects under URI +HeadlessBuilder_invalid_uri=Invalid project URI: +HeadlessBuilder_MustSpecifyWorkspace=Must specify a location for the workspace. Restart with the '-data' switch. HeadlessBuilder_Workspace=Workspace +HeadlessBuilder_WorkspaceInUse=Workspace already in use\! MakeBuilder.buildError= MultiResourceInfo.MultiResourceInfo.UnhandledIHoldsOptionsType=Unhandled parent type: not ITool nor IToolChain