From bc883828d20a9c641cf90b182a19e3979fe778b8 Mon Sep 17 00:00:00 2001 From: Brian McNamara Date: Wed, 26 Jul 2023 14:34:07 -0700 Subject: [PATCH 1/4] Add import recommendation --- .../AutoImportProjectOpenProcessor.java | 3 ++- .../ImportFromWorkspaceProjectViewOption.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) 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..12c18247950 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,7 @@ */ public class AutoImportProjectOpenProcessor extends ProjectOpenProcessor { + public static final String MANAGED_PROJECT_RELATIVE_PATH = "tools/intellij/.managed.bazelproject"; static final Key PROJECT_AUTO_IMPORTED = Key.create("bazel.project.auto_imported"); private static final Logger LOG = Logger.getInstance(AutoImportProjectOpenProcessor.class); @@ -225,7 +226,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/ImportFromWorkspaceProjectViewOption.java b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java index 3b9fd193779..b4ccb68c5d0 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java +++ b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java @@ -16,6 +16,8 @@ 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.projectview.ProjectViewStorageManager; import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver; import com.google.idea.blaze.base.ui.UiUtil; @@ -31,6 +33,7 @@ import com.intellij.ui.TextFieldWithStoredHistory; import java.awt.Dimension; import java.io.File; +import java.util.List; import javax.annotation.Nullable; import javax.swing.JButton; import javax.swing.JComponent; @@ -55,6 +58,22 @@ public ImportFromWorkspaceProjectViewOption(BlazeNewProjectBuilder builder) { projectViewPathField.setText(userSettings.get(LAST_WORKSPACE_PATH, "")); projectViewPathField.setMinimumAndPreferredWidth(MINIMUM_FIELD_WIDTH); + WorkspaceRoot workspaceRoot = builder.getWorkspaceData() != null ? builder.getWorkspaceData().workspaceRoot() : null; + //Add managed project view to the list + if (workspaceRoot != null && + workspaceRoot.path().resolve(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile().exists()) { + if (projectViewPathField.getText().isEmpty()) { + projectViewPathField.setText(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); + } else { + List history = projectViewPathField.getHistory(); + if (!history.contains(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH)) { + history.add(0, AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); + projectViewPathField.setHistory(history); + } + } + } + + JButton button = new JButton("..."); button.addActionListener(action -> chooseWorkspacePath()); int buttonSize = projectViewPathField.getPreferredSize().height; From 50a65cf1c1c68b1ad107d2eb2dd1f6cc783405da Mon Sep 17 00:00:00 2001 From: Brian McNamara Date: Thu, 10 Aug 2023 10:30:36 -0700 Subject: [PATCH 2/4] Also check for env var --- .../AutoImportProjectOpenProcessor.java | 5 ++-- .../ImportFromWorkspaceProjectViewOption.java | 23 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 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 12c18247950..bb85f67cfbe 100644 --- a/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java +++ b/base/src/com/google/idea/blaze/base/project/AutoImportProjectOpenProcessor.java @@ -56,6 +56,8 @@ 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); @@ -217,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); diff --git a/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java index b4ccb68c5d0..b1c7c0098fe 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java +++ b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java @@ -58,12 +58,27 @@ public ImportFromWorkspaceProjectViewOption(BlazeNewProjectBuilder builder) { projectViewPathField.setText(userSettings.get(LAST_WORKSPACE_PATH, "")); projectViewPathField.setMinimumAndPreferredWidth(MINIMUM_FIELD_WIDTH); + String projectViewFromEnv = System.getenv(AutoImportProjectOpenProcessor.PROJECT_VIEW_FROM_ENV); WorkspaceRoot workspaceRoot = builder.getWorkspaceData() != null ? builder.getWorkspaceData().workspaceRoot() : null; - //Add managed project view to the list - if (workspaceRoot != null && - workspaceRoot.path().resolve(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile().exists()) { + //Add the project view passed in from the environment and/or managed project view to the projectViewPath field if they exist + if (workspaceRoot != null) { + if (projectViewFromEnv != null) { + File projectViewFromEnvFile = new File(projectViewFromEnv); + if (projectViewFromEnvFile.exists()) { + String relativeProjectViewPath = workspaceRoot.path().relativize(projectViewFromEnvFile.toPath()).toString(); + if (projectViewPathField.getText().isEmpty()) { + projectViewPathField.setTextAndAddToHistory(relativeProjectViewPath); + } else { + List history = projectViewPathField.getHistory(); + if (!history.contains(relativeProjectViewPath)) { + history.add(0, relativeProjectViewPath); + projectViewPathField.setHistory(history); + } + } + } + } if (projectViewPathField.getText().isEmpty()) { - projectViewPathField.setText(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); + projectViewPathField.setTextAndAddToHistory(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); } else { List history = projectViewPathField.getHistory(); if (!history.contains(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH)) { From 26dcf491913aaefa11de180a620c86489923ad4a Mon Sep 17 00:00:00 2001 From: Brian McNamara Date: Mon, 14 Aug 2023 10:23:51 -0700 Subject: [PATCH 3/4] Use dedicated radio buttons for managed and env --- .../wizard2/BazelWizardOptionProvider.java | 32 +++++++-- .../ImportFromWorkspaceProjectViewOption.java | 34 --------- .../wizard2/UseKnownProjectViewOption.java | 70 +++++++++++++++++++ 3 files changed, 97 insertions(+), 39 deletions(-) create mode 100644 base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java 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..034f8ba402e 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<>(); + + 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(projectViewFromEnvFile)); + } + } + if (workspaceRoot.absolutePathFor(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile().exists()) { + options.add(UseKnownProjectViewOption.fromManagedProject(workspaceRoot)); + } + } + + options.add(new CreateFromScratchProjectViewOption()); + options.add(new ImportFromWorkspaceProjectViewOption(builder)); + options.add(new GenerateFromBuildFileSelectProjectViewOption(builder)); + options.add(new CopyExternalProjectViewOption(builder)); + + return options.build(); } } diff --git a/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java index b1c7c0098fe..3b9fd193779 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java +++ b/base/src/com/google/idea/blaze/base/wizard2/ImportFromWorkspaceProjectViewOption.java @@ -16,8 +16,6 @@ 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.projectview.ProjectViewStorageManager; import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver; import com.google.idea.blaze.base.ui.UiUtil; @@ -33,7 +31,6 @@ import com.intellij.ui.TextFieldWithStoredHistory; import java.awt.Dimension; import java.io.File; -import java.util.List; import javax.annotation.Nullable; import javax.swing.JButton; import javax.swing.JComponent; @@ -58,37 +55,6 @@ public ImportFromWorkspaceProjectViewOption(BlazeNewProjectBuilder builder) { projectViewPathField.setText(userSettings.get(LAST_WORKSPACE_PATH, "")); projectViewPathField.setMinimumAndPreferredWidth(MINIMUM_FIELD_WIDTH); - String projectViewFromEnv = System.getenv(AutoImportProjectOpenProcessor.PROJECT_VIEW_FROM_ENV); - WorkspaceRoot workspaceRoot = builder.getWorkspaceData() != null ? builder.getWorkspaceData().workspaceRoot() : null; - //Add the project view passed in from the environment and/or managed project view to the projectViewPath field if they exist - if (workspaceRoot != null) { - if (projectViewFromEnv != null) { - File projectViewFromEnvFile = new File(projectViewFromEnv); - if (projectViewFromEnvFile.exists()) { - String relativeProjectViewPath = workspaceRoot.path().relativize(projectViewFromEnvFile.toPath()).toString(); - if (projectViewPathField.getText().isEmpty()) { - projectViewPathField.setTextAndAddToHistory(relativeProjectViewPath); - } else { - List history = projectViewPathField.getHistory(); - if (!history.contains(relativeProjectViewPath)) { - history.add(0, relativeProjectViewPath); - projectViewPathField.setHistory(history); - } - } - } - } - if (projectViewPathField.getText().isEmpty()) { - projectViewPathField.setTextAndAddToHistory(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); - } else { - List history = projectViewPathField.getHistory(); - if (!history.contains(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH)) { - history.add(0, AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH); - projectViewPathField.setHistory(history); - } - } - } - - JButton button = new JButton("..."); button.addActionListener(action -> chooseWorkspacePath()); int buttonSize = projectViewPathField.getPreferredSize().height; 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..12b16762cb0 --- /dev/null +++ b/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java @@ -0,0 +1,70 @@ +package com.google.idea.blaze.base.wizard2; + +import com.google.idea.blaze.base.model.primitives.WorkspaceRoot; +import com.google.idea.blaze.base.project.AutoImportProjectOpenProcessor; +import com.intellij.openapi.options.ConfigurationException; +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 UseKnownProjectViewOption(String optionName, String description, File projectView) { + this.optionName = optionName; + this.description = description; + this.projectView = projectView; + } + + @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 null; + } + + 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()); + } + + public static UseKnownProjectViewOption fromEnvironmentVariable(File file) { + return new UseKnownProjectViewOption("use-view-from-env", "Clone project view provided from environment", file); + } +} From fc0ef821c6adadf7405cf6976403092a7f9cfec7 Mon Sep 17 00:00:00 2001 From: Brian McNamara Date: Thu, 31 Aug 2023 11:37:30 -0700 Subject: [PATCH 4/4] Add project view path to the options and move to bottom --- .../wizard2/BazelWizardOptionProvider.java | 12 +++++----- .../wizard2/UseKnownProjectViewOption.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 11 deletions(-) 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 034f8ba402e..d4607a4beb7 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java +++ b/base/src/com/google/idea/blaze/base/wizard2/BazelWizardOptionProvider.java @@ -36,6 +36,11 @@ public ImmutableList getSelectProjectViewOptions( BlazeNewProjectBuilder 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; @@ -43,7 +48,7 @@ public ImmutableList getSelectProjectViewOptions( if (projectViewFromEnv != null) { File projectViewFromEnvFile = new File(projectViewFromEnv); if (projectViewFromEnvFile.exists()) { - options.add(UseKnownProjectViewOption.fromEnvironmentVariable(projectViewFromEnvFile)); + options.add(UseKnownProjectViewOption.fromEnvironmentVariable(workspaceRoot, projectViewFromEnvFile)); } } if (workspaceRoot.absolutePathFor(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile().exists()) { @@ -51,11 +56,6 @@ public ImmutableList getSelectProjectViewOptions( } } - options.add(new CreateFromScratchProjectViewOption()); - options.add(new ImportFromWorkspaceProjectViewOption(builder)); - options.add(new GenerateFromBuildFileSelectProjectViewOption(builder)); - options.add(new CopyExternalProjectViewOption(builder)); - 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 index 12b16762cb0..f6c76775f00 100644 --- a/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java +++ b/base/src/com/google/idea/blaze/base/wizard2/UseKnownProjectViewOption.java @@ -1,8 +1,11 @@ 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.*; @@ -16,11 +19,16 @@ 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) { + 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 @@ -57,14 +65,20 @@ public void commit() throws BlazeProjectCommitException { @Nullable @Override public JComponent getUiComponent() { - return null; + 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()); + return new UseKnownProjectViewOption("use-managed-view", + "Clone project's default view", + root.absolutePathFor(AutoImportProjectOpenProcessor.MANAGED_PROJECT_RELATIVE_PATH).toFile(), + root); } - public static UseKnownProjectViewOption fromEnvironmentVariable(File file) { - return new UseKnownProjectViewOption("use-view-from-env", "Clone project view provided from environment", file); + public static UseKnownProjectViewOption fromEnvironmentVariable(WorkspaceRoot root, File file) { + return new UseKnownProjectViewOption("use-view-from-env", + "Clone project view provided from environment", + file, + root); } }