From f205c9b6c47313d076b1bfca2248a40401823f36 Mon Sep 17 00:00:00 2001 From: Brian McNamara Date: Wed, 30 Aug 2023 15:41:03 -0700 Subject: [PATCH] Use workspace root .idea as template during project import --- .../AutoImportProjectOpenProcessor.java | 11 +++--- .../base/wizard2/BlazeProjectCreator.java | 3 +- .../wizard2/BlazeProjectImportBuilder.java | 35 +++++++++++++++++-- version.bzl | 2 +- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java b/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java index ff336883ba8..639e367bd24 100644 --- a/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java +++ b/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java @@ -21,6 +21,7 @@ import com.google.idea.sdkcompat.general.BaseSdkCompat; import com.intellij.ide.SaveAndSyncHandler; import com.intellij.ide.impl.ProjectUtil; +import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; @@ -109,23 +110,21 @@ Project doOpenProject( return ProgressManager.getInstance().run(new Task.WithResult(null, "Importing Project...", true) { @Override protected Project compute(@NotNull ProgressIndicator progressIndicator) { - ProjectManager pm = ProjectManager.getInstance(); - if (projectToClose != null) { - pm.closeAndDispose(projectToClose); - } - Project newProject = createProject(virtualFile); Objects.requireNonNull(newProject); newProject.putUserData(PROJECT_AUTO_IMPORTED, true); - Path projectFilePath = Paths.get(Objects.requireNonNull(newProject.getProjectFilePath())); + Path projectFilePath = Paths.get(Objects.requireNonNull(newProject.getBasePath())); ProjectUtil.updateLastProjectLocation(projectFilePath); ProjectManagerEx.getInstanceEx() .openProject( projectFilePath, BaseSdkCompat.createOpenProjectTask(newProject) + .asNewProject() + .withProjectToClose(projectToClose) + .withForceOpenInNewFrame(forceOpenInNewFrame) ); SaveAndSyncHandler.getInstance().scheduleProjectSave(newProject); return newProject; diff --git a/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectCreator.java b/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectCreator.java index f1ef9f9e7e5..85e0aef6963 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectCreator.java +++ b/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectCreator.java @@ -64,7 +64,8 @@ public CreatedProjectDescriptor(Path ideaProjectPath, Project project) { @VisibleForTesting public void openProject() { ProjectManagerEx.getInstanceEx() - .openProject(ideaProjectPath, BaseSdkCompat.createOpenProjectTask(project)); + .openProject(ideaProjectPath, BaseSdkCompat.createOpenProjectTask(project) + .asNewProject()); if (!ApplicationManager.getApplication().isUnitTestMode()) { SaveAndSyncHandler.getInstance().scheduleProjectSave(project); diff --git a/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectImportBuilder.java b/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectImportBuilder.java index d1f8256cddc..7448fe54eb4 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectImportBuilder.java +++ b/base/src/com/google/idea/blaze/base/wizard2/BlazeProjectImportBuilder.java @@ -17,20 +17,31 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; +import com.intellij.ide.impl.ProjectUtil; import com.intellij.ide.util.projectWizard.ProjectBuilder; +import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectManagerEx; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.openapi.util.io.FileUtil; + import java.io.File; +import java.io.IOException; +import java.nio.file.CopyOption; +import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Iterator; import java.util.List; +import java.util.stream.Stream; import javax.annotation.Nullable; /** Wrapper around a {@link BlazeNewProjectBuilder} to fit into IntelliJ's import framework. */ @VisibleForTesting public class BlazeProjectImportBuilder extends ProjectBuilder { + private static final Logger LOG = Logger.getInstance(BlazeProjectImportBuilder.class); private BlazeNewProjectBuilder builder = new BlazeNewProjectBuilder(); @Nullable @@ -49,9 +60,27 @@ public BlazeNewProjectBuilder builder() { @Override public @Nullable Project createProject(String name, String path) { - //Allows checked in files to be used. createProject deletes the directory. - if (new File(path, Project.DIRECTORY_STORE_FOLDER).exists()) { - return ProjectManagerEx.getInstanceEx().loadProject(Path.of(path)); + Path currentPath = Path.of(path); + Path workspacePath = currentPath.getParent(); + Path workspaceIdeaPath = workspacePath.resolve(Project.DIRECTORY_STORE_FOLDER); + File workspaceIdeaDir = workspaceIdeaPath.toFile(); + // Allows checked in files to be used either using .idea under workspace root or checked in. + // createProject would delete the directory if it exists, so using loadProject instead. + if (workspaceIdeaDir.exists() && workspaceIdeaDir.isDirectory()) { + Path bazelProjectPath = currentPath.resolve(Project.DIRECTORY_STORE_FOLDER); + try { + FileUtil.copyDirContent(workspaceIdeaDir, bazelProjectPath.toFile()); + return ProjectManagerEx.getInstanceEx().loadProject(currentPath); + } catch (IOException e) { + LOG.error("Failed copying content of workspace .idea directory to bazel project", e); + try { + FileUtil.deleteRecursively(bazelProjectPath); + FileUtil.ensureExists(bazelProjectPath.toFile()); + } catch (IOException ex) { + //I tried... + throw new RuntimeException("Project creation failed and was unrecoverable", ex); + } + } } return super.createProject(name, path); } diff --git a/version.bzl b/version.bzl index d3dddd780cc..14e3cad5c41 100644 --- a/version.bzl +++ b/version.bzl @@ -4,4 +4,4 @@ # default version to 9999 so that a dev plugin built from Piper HEAD will override any production # plugin (because IntelliJ will choose the highest version when it sees two conflicting plugins, so # 9999 > 2017.06.05.0.1). -VERSION = "9999" +VERSION = "9999-9999"