Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Re-realize aspect files after plugin update #6872

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions .bazelci/clion.yml
Original file line number Diff line number Diff line change
@@ -1,43 +1,5 @@
---
tasks:
CLion-internal-stable:
name: CLion Internal Stable
platform: ubuntu2204
build_flags:
- --define=ij_product=clion-latest
build_targets:
- //clwb/...
test_flags:
- --define=ij_product=clion-latest
- --test_output=errors
test_targets:
- //:clwb_tests
CLion-internal-beta:
name: CLion Internal Beta
platform: ubuntu2204
build_flags:
- --define=ij_product=clion-beta
build_targets:
- //clwb/...
test_flags:
- --define=ij_product=clion-beta
- --test_output=errors
test_targets:
- //:clwb_tests
CLion-internal-under-dev:
name: CLion Internal Under Development
platform: ubuntu2204
build_flags:
- --define=ij_product=clion-under-dev
build_targets:
- //clwb/...
test_flags:
- --define=ij_product=clion-under-dev
- --test_output=errors
test_targets:
- //:clwb_tests
soft_fail:
- exit_status: 1
CLion-OSS-oldest-stable:
name: CLion OSS Oldest Stable
platform: ubuntu2204
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.google.idea.blaze.base.sync.aspects.strategy;

import com.google.common.collect.ImmutableSet;
import com.google.idea.blaze.base.model.primitives.LanguageClass;
import com.google.idea.blaze.base.scope.BlazeContext;
import com.google.idea.blaze.base.sync.SyncListener;
Expand All @@ -23,11 +24,13 @@
import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
import com.google.idea.blaze.base.util.TemplateWriter;
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Map;
import java.util.Optional;

public class SyncAspectTemplateProvider implements SyncListener {
private final Map<LanguageClass, String> supportedLanguageAspectTemplate = Map.of(
Expand All @@ -37,76 +40,43 @@ public class SyncAspectTemplateProvider implements SyncListener {

@Override
public void onSyncStart(Project project, BlazeContext context, SyncMode syncMode) throws SyncFailedException {
copyProjectAspects(project);
prepareProjectAspect(project);
}

private void copyProjectAspects(Project project) throws SyncFailedException {
final var projectAspects = AspectRepositoryProvider.getProjectAspectDirectory(project).orElse(null);
if (projectAspects == null) {
throw new SyncFailedException("Missing project aspect directory");
}

// only copy project aspect once, TODO: do we need versioning here?
if (projectAspects.exists()) return;

final var templateAspects = AspectRepositoryProvider.findAspectTemplateDirectory().orElse(null);
if (templateAspects == null || !templateAspects.isDirectory()) {
throw new SyncFailedException("Missing aspect template directory");
}
private void prepareProjectAspect(Project project) throws SyncFailedException {
var manager = BlazeProjectDataManager.getInstance(project);
if (manager == null) return;
var realizedAspectsPath = AspectRepositoryProvider
.getProjectAspectDirectory(project)
.map(File::toPath)
.orElseThrow(() -> new SyncFailedException("Couldn't find project aspect directory"));

try {
copyFileTree(templateAspects.toPath(), projectAspects.toPath());
Files.createDirectories(realizedAspectsPath);
Files.writeString(realizedAspectsPath.resolve("WORKSPACE"), "");
Files.writeString(realizedAspectsPath.resolve("BUILD"), "");
} catch (IOException e) {
throw new SyncFailedException("Could not copy aspect templates", e);
throw new SyncFailedException("Couldn't create realized aspects", e);
}
}

private void copyFileTree(Path source, Path destination) throws IOException {
try (final var fileStream = Files.walk(source)) {
final var fileIterator = fileStream.iterator();
while (fileIterator.hasNext()) {
copyUsingRelativePath(source, fileIterator.next(), destination);
}
final var templateAspects = AspectRepositoryProvider.findAspectTemplateDirectory()
.orElseThrow(() -> new SyncFailedException("Couldn't find aspect template directory"));
var javaTemplate = "java_info.template.bzl";
var realizedFile = realizedAspectsPath.resolve("java_info.bzl");
var templateWriter = new TemplateWriter(templateAspects.toPath());
LeFrosch marked this conversation as resolved.
Show resolved Hide resolved
var templateVariableMap = getStringStringMap(manager);
if (!templateWriter.writeToFile(javaTemplate, realizedFile, templateVariableMap)) {
throw new SyncFailedException("Could not create template for: ");
}
}

private void copyUsingRelativePath(Path sourcePrefix, Path source, Path destination) throws IOException {
// only interested in bzl files that are templates
if (source.endsWith(".bzl") && !source.endsWith("template.bzl")) return;

final var sourceRelativePath = sourcePrefix.relativize(source).toString();
final var destinationAbsolutePath = Paths.get(destination.toString(), sourceRelativePath);
Files.copy(source, destinationAbsolutePath);
}

private void prepareProjectAspect(Project project) throws SyncFailedException {
var manager = BlazeProjectDataManager.getInstance(project);
if (manager == null) return;

var projectData = manager.getBlazeProjectData();
if (projectData == null) return;
var optionalAspectTemplateDir = AspectRepositoryProvider.getProjectAspectDirectory(project);
if (optionalAspectTemplateDir.isEmpty()) return;
var aspectTemplateDir = optionalAspectTemplateDir.get().toPath();
var templateWriter = new TemplateWriter(aspectTemplateDir);
var activeLanguages = projectData.getWorkspaceLanguageSettings().getActiveLanguages();
var isAtLeastBazel8 = projectData.getBlazeVersionData().bazelIsAtLeastVersion(8, 0, 0);
var templateVariableMap = Map.of(
"bazel8OrAbove", isAtLeastBazel8 ? "true" : "false",
"isJavaEnabled", activeLanguages.contains(LanguageClass.JAVA) || activeLanguages.contains(LanguageClass.GENERIC) ? "true" : "false"
);

for (final var language : activeLanguages) {
var templateFileName = supportedLanguageAspectTemplate.get(language);
if (templateFileName == null) continue;

var realizedFileName = templateFileName.replace(".template.bzl", ".bzl");
var realizedFile = aspectTemplateDir.resolve(realizedFileName);

if (!templateWriter.writeToFile(templateFileName, realizedFile, templateVariableMap)) {
throw new SyncFailedException("Could not create template for: " + language);
}
}
private static @NotNull Map<String, String> getStringStringMap(BlazeProjectDataManager manager) {
var projectData = Optional.ofNullable(manager.getBlazeProjectData()); // It can be empty on intial sync. Fall back to no lauguage support
LeFrosch marked this conversation as resolved.
Show resolved Hide resolved
var activeLanguages = projectData.map(it -> it.getWorkspaceLanguageSettings().getActiveLanguages()).orElse(ImmutableSet.of());
var isAtLeastBazel8 = projectData.map(it -> it.getBlazeVersionData().bazelIsAtLeastVersion(8, 0, 0)).orElse(false);
return Map.of(
"bazel8OrAbove", isAtLeastBazel8 ? "true" : "false",
"isJavaEnabled", activeLanguages.contains(LanguageClass.JAVA) || activeLanguages.contains(LanguageClass.GENERIC) ? "true" : "false"
);
}
}
Loading