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 d7fc32ae2fa..bb85f67cfbe 100644 --- a/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java +++ b/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java @@ -55,6 +55,9 @@ */ public class AutoImportProjectOpenProcessor extends ProjectOpenProcessor { + public static final String MANAGED_PROJECT_RELATIVE_PATH = "tools/intellij/.managed.bazelproject"; + public static final String PROJECT_VIEW_FROM_ENV = "INTELLIJ_BAZEL_PROJECT_VIEW_TEMPLATE"; + static final Key PROJECT_AUTO_IMPORTED = Key.create("bazel.project.auto_imported"); private static final Logger LOG = Logger.getInstance(AutoImportProjectOpenProcessor.class); @@ -216,8 +219,7 @@ private ProjectView createProjectView(VirtualFile workspaceRoot, WorkspacePathResolver pathResolver) { // first check env for project view template - String projectViewFileFromEnv = System.getenv( - "INTELLIJ_BAZEL_PROJECT_VIEW_TEMPLATE"); + String projectViewFileFromEnv = System.getenv(PROJECT_VIEW_FROM_ENV); if (projectViewFileFromEnv != null) { return fromFileProjectView(Paths.get(projectViewFileFromEnv), pathResolver); @@ -225,7 +227,7 @@ private ProjectView createProjectView(VirtualFile workspaceRoot, // second check managed project view template Path managedProjectViewFilePath = workspaceRoot.toNioPath() - .resolve("tools/intellij/.managed.bazelproject"); + .resolve(MANAGED_PROJECT_RELATIVE_PATH); if (managedProjectViewFilePath.toFile().exists()) { return fromFileProjectView(managedProjectViewFilePath, pathResolver); } diff --git a/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java b/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java index 3cdb9ee0615..d4607a4beb7 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java +++ b/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java @@ -16,8 +16,12 @@ package com.google.idea.blaze.base.wizard2; import com.google.common.collect.ImmutableList; +import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; +import com.google.idea.blaze.base.project.AutoImportProjectOpenProcessor; import com.intellij.openapi.Disposable; +import java.io.File; + /** Provides bazel options for the wizard. */ public class BazelWizardOptionProvider implements BlazeWizardOptionProvider { @@ -30,10 +34,28 @@ public ImmutableList getSelectWorkspaceOptions( @Override public ImmutableList getSelectProjectViewOptions( BlazeNewProjectBuilder builder) { - return ImmutableList.of( - new CreateFromScratchProjectViewOption(), - new ImportFromWorkspaceProjectViewOption(builder), - new GenerateFromBuildFileSelectProjectViewOption(builder), - new CopyExternalProjectViewOption(builder)); + ImmutableList.Builder options = new ImmutableList.Builder<>(); + + options.add(new CreateFromScratchProjectViewOption()); + options.add(new ImportFromWorkspaceProjectViewOption(builder)); + options.add(new GenerateFromBuildFileSelectProjectViewOption(builder)); + options.add(new CopyExternalProjectViewOption(builder)); + + String projectViewFromEnv = System.getenv(AutoImportProjectOpenProcessor.PROJECT_VIEW_FROM_ENV); + WorkspaceRoot workspaceRoot = builder.getWorkspaceData() != null ? builder.getWorkspaceData().workspaceRoot() : null; + + if (workspaceRoot != null) { + if (projectViewFromEnv != null) { + File projectViewFromEnvFile = new File(projectViewFromEnv); + if (projectViewFromEnvFile.exists()) { + options.add(UseKnownProjectViewOption.fromEnvironmentVariable(workspaceRoot, projectViewFromEnvFile)); + } + } + if (workspaceRoot.absolutePathFor(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile().exists()) { + options.add(UseKnownProjectViewOption.fromManagedProject(workspaceRoot)); + } + } + + return options.build(); } } diff --git a/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java b/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java new file mode 100644 index 00000000000..f6c76775f00 --- /dev/null +++ b/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java @@ -0,0 +1,84 @@ +package com.google.idea.blaze.base.wizard2; + +import com.google.idea.blaze.base.model.primitives.WorkspacePath; +import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; +import com.google.idea.blaze.base.project.AutoImportProjectOpenProcessor; +import com.google.idea.blaze.base.ui.UiUtil; +import com.intellij.openapi.options.ConfigurationException; +import com.intellij.ui.components.JBLabel; +import org.jetbrains.annotations.Nullable; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; + +public class UseKnownProjectViewOption implements BlazeSelectProjectViewOption { + + private final String optionName; + private final String description; + private final File projectView; + private final JComponent component; + + private UseKnownProjectViewOption(String optionName, String description, File projectView, WorkspaceRoot workspaceRoot) { + this.optionName = optionName; + this.description = description; + this.projectView = projectView; + WorkspacePath workspacePath = workspaceRoot.workspacePathForSafe(projectView); + this.component = UiUtil.createHorizontalBox( + HORIZONTAL_LAYOUT_GAP, new JBLabel("Project view:"), + new JBLabel(workspacePath != null ? workspacePath.relativePath() : projectView.getAbsolutePath())); + } + + @Override + public String getOptionName() { + return optionName; + } + + @Override + public String getDescription() { + return description; + } + + @Nullable + @Override + public String getInitialProjectViewText() { + try { + byte[] bytes = Files.readAllBytes(projectView.toPath()); + return new String(bytes, StandardCharsets.UTF_8); + } catch (IOException e) { + return null; + } + } + + @Override + public void validateAndUpdateBuilder(BlazeNewProjectBuilder builder) throws ConfigurationException { + + } + + @Override + public void commit() throws BlazeProjectCommitException { + + } + + @Nullable + @Override + public JComponent getUiComponent() { + return component; + } + + public static UseKnownProjectViewOption fromManagedProject(WorkspaceRoot root) { + return new UseKnownProjectViewOption("use-managed-view", + "Clone project's default view", + root.absolutePathFor(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile(), + root); + } + + public static UseKnownProjectViewOption fromEnvironmentVariable(WorkspaceRoot root, File file) { + return new UseKnownProjectViewOption("use-view-from-env", + "Clone project view provided from environment", + file, + root); + } +}