Skip to content

Commit

Permalink
Use workspace root .idea as template during project import
Browse files Browse the repository at this point in the history
  • Loading branch information
brian-mcnamara committed Aug 30, 2023
1 parent 6065dea commit f205c9b
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -109,23 +110,21 @@ Project doOpenProject(
return ProgressManager.getInstance().run(new Task.WithResult<Project, Exception>(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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
}
Expand Down
2 changes: 1 addition & 1 deletion version.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -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"

0 comments on commit f205c9b

Please sign in to comment.