Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
f9faef9
Update IntelliJ versions: kotlinVersion to 2.2.0-RC2 (#2238)
git-machete-bot Feb 12, 2026
d294104
Tidy up GradleKotlinVersion import
PawelLipski Feb 12, 2026
bfaefd0
Update IntelliJ versions: upcomingMajorEap to 261.20869.38 (#2239)
git-machete-bot Feb 14, 2026
5a612ed
Bump the deps group in /buildSrc with 4 updates (#2240)
dependabot[bot] Feb 16, 2026
c3b0e9e
Bump the deps group with 8 updates (#2241)
dependabot[bot] Feb 16, 2026
a81c65a
Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in the deps gr…
dependabot[bot] Feb 23, 2026
5df6186
Update IntelliJ versions: latestStable to 2025.3.3 (#2242)
git-machete-bot Feb 23, 2026
a942349
Bump the deps group with 2 updates (#2246)
dependabot[bot] Mar 4, 2026
799d45a
Bump org.jetbrains.grammarkit to 2023.3.0.3 (#2247)
PawelLipski Mar 4, 2026
d29465d
Update Gradle wrapper to 9.4.0 (#2248)
git-machete-bot Mar 5, 2026
d8f4521
Update IntelliJ versions: upcomingMajorEap to 261.21849.20 (#2245)
git-machete-bot Mar 5, 2026
1650608
Update IntelliJ versions: upcomingMajorEap to 261.22158.46 (#2249)
git-machete-bot Mar 6, 2026
93dcae7
Bump the deps group in /buildSrc with 2 updates (#2251)
dependabot[bot] Mar 9, 2026
bc01881
Bump the deps group with 3 updates (#2252)
dependabot[bot] Mar 9, 2026
17fd2ad
Bump intellij-platform-gradle-plugin to 2.13.0 (#2250)
PawelLipski Mar 12, 2026
fcee0ba
Update IntelliJ versions: upcomingMajorEap to 261.22158.121 (#2253)
git-machete-bot Mar 15, 2026
84d6383
Bump the deps group with 3 updates (#2254)
dependabot[bot] Mar 16, 2026
262071d
Update IntelliJ versions: latestStable to 2025.3.4 (#2255)
git-machete-bot Mar 18, 2026
c520a1f
Update Gradle wrapper to 9.4.1 (#2256)
git-machete-bot Mar 20, 2026
052ef12
Bump the deps group in /buildSrc with 2 updates (#2257)
dependabot[bot] Mar 23, 2026
d09e129
Update IntelliJ versions: latestMinorsOfOldSupportedMajors, latestSta…
git-machete-bot Mar 26, 2026
4f1b620
Bump the deps group with 2 updates (#2259)
dependabot[bot] Apr 7, 2026
473ec6b
Fix Squash action incorrectly remaining visible (fixes #2260)
mkondratek Apr 8, 2026
ca33181
Fix branch layout issues when switching git modules (fixes #2260)
mkondratek Apr 8, 2026
fc14336
Auto-discover branch layout when machete file is empty (fixes #2260)
mkondratek Apr 8, 2026
ff34fcd
Update CHANGE-NOTES.md
mkondratek Apr 9, 2026
6bf48a2
Bump org.jetbrains.kotlinx:kotlinx-serialization-json from 1.10.0 to …
dependabot[bot] Apr 13, 2026
0fd7de9
Bump the deps group with 4 updates (#2263)
dependabot[bot] Apr 13, 2026
bbed748
Fix freezes on `VirtualFile.getFileType()` (fixes #2264)
PawelLipski Apr 14, 2026
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
5 changes: 5 additions & 0 deletions CHANGE-NOTES.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## v7.0.1
- Added: auto-discovery of the branch layout in case of multiple repositories (contributed by @mkondratek)
- Fixed: branch layout and actions availability in case of multiple repositories (contributed by @mkondratek)
- Fixed: a rare freeze of IntelliJ UI after changing machete file (reported by @mikechristiansenvae)

## v7.0.0
- Added: support for IntelliJ 2026.1.
- Dropped: support for IntelliJ 2024.2 to 2025.1.
Expand Down
11 changes: 6 additions & 5 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ import org.gradle.jvm.tasks.Jar
import org.jetbrains.changelog.Changelog
import org.jetbrains.intellij.platform.gradle.TestFrameworkType
import org.jetbrains.intellij.platform.gradle.tasks.BuildPluginTask
import org.jetbrains.intellij.platform.gradle.tasks.RunIdeTask
import org.jetbrains.intellij.platform.gradle.tasks.SignPluginTask
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import java.net.URI
import java.util.Base64
import java.util.zip.ZipEntry
import java.util.zip.ZipFile
import org.jetbrains.kotlin.gradle.dsl.KotlinVersion as GradleKotlinVersion

plugins {
checkstyle
Expand Down Expand Up @@ -142,10 +142,11 @@ allprojects {
configurations.runtimeClasspath { exclude(group = "org.slf4j", module = "slf4j-api") }

tasks.withType<KotlinCompile> {
val kotlinLanguageVersion = intellijVersions.kotlinVersion.replace("""^(\d+\.\d+).*""".toRegex(), "$1")
kotlinOptions {
apiVersion = kotlinLanguageVersion
languageVersion = kotlinLanguageVersion
val kotlinVersionStr = intellijVersions.kotlinVersion.replace("""^(\d+\.\d+).*""".toRegex(), "$1")
val kotlinVersion = GradleKotlinVersion.fromVersion(kotlinVersionStr)
compilerOptions {
apiVersion.set(kotlinVersion)
languageVersion.set(kotlinVersion)
}
}
}
Expand Down
6 changes: 3 additions & 3 deletions buildSrc/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
[versions]
junit = "6.0.2"
spotless = "8.2.1"
junit = "6.0.3"
spotless = "8.4.0"

[libraries]
junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" }
junit-platformLauncher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit" }
kotlinxSerializationJson = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0"
kotlinxSerializationJson = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0"
# Plugin packages
# This way of applying the plugins is needed for the build-related code in buildSrc/src/main/,
# see https://docs.gradle.org/current/samples/sample_convention_plugins.html#things_to_note.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,15 @@ import org.gradle.api.provider.Provider
import org.gradle.api.tasks.compile.JavaCompile
import org.gradle.api.tasks.testing.Test
import org.gradle.kotlin.dsl.*
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginWrapper
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

fun Project.applyKotlinConfig() {
apply<KotlinPluginWrapper>()

tasks.withType<KotlinCompile> {
kotlinOptions {
compilerOptions {
allWarningsAsErrors = true

// Suppress the warnings about different version of Kotlin used for compilation
Expand All @@ -25,10 +26,10 @@ fun Project.applyKotlinConfig() {
// and as per https://kotlinlang.org/docs/components-stability.html,
// code compiled against an older version of kotlin-stdlib should work
// when a newer version of kotlin-stdlib is provided as a drop-in replacement.
freeCompilerArgs += listOf("-Xskip-metadata-version-check")
freeCompilerArgs.add("-Xskip-metadata-version-check")

val targetJavaVersion: JavaVersion by rootProject.extra
jvmTarget = targetJavaVersion.toString()
jvmTarget.set(JvmTarget.fromTarget(targetJavaVersion.toString()))
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ fun Project.configureSpotless() {
// and exporting settings from Eclipse
eclipse().configFile("$rootDir/config/spotless/formatting-rules.xml")
removeUnusedImports()
targetExclude("**/build/generated/**/*.*")
targetExclude("**/build/generated/**/*.*", "**/.intellijPlatform/**")
}

val ktlintEditorConfig = mapOf(
Expand All @@ -33,11 +33,15 @@ fun Project.configureSpotless() {
kotlin {
ktlint().editorConfigOverride(ktlintEditorConfig)
target("**/*.kt")
// Workaround for JetBrains/intellij-platform-gradle-plugin#2096: exclude plugin sandbox so Spotless
// doesn't touch outputs of prepareTestSandbox (previously under build/idea-sandbox, now under .intellijPlatform).
targetExclude("**/.intellijPlatform/**")
}

kotlinGradle {
ktlint().editorConfigOverride(ktlintEditorConfig)
target("**/*.gradle.kts")
targetExclude("**/.intellijPlatform/**")
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ fun Project.configureUiTests() {
// TODO (#2146): drop support for IntelliJ Community
systemProperty("intellij.product", version.productCode())

systemProperty("ide.instance-per", "class")
systemProperty("ide.instance-per", "class") // a slower alternative: "method"

testClassesDirs = uiTest.output.classesDirs
classpath = configurations.getByName("uiTestRuntimeClasspath") + uiTest.output
Expand All @@ -62,10 +62,14 @@ fun Project.configureUiTests() {

useJUnitPlatform()

// Here, add-opens is needed to avoid
// IllegalArgumentException: Unable to create converter for class com.intellij.remoterobot.client.ExecuteResponse
// in com.intellij.remoterobot.RemoteRobot.runJs
jvmArgs(getFlagsForAddOpens("java.lang", module = "java.base"))
// Since 2026.1 EAP:
// InaccessibleObjectException: Unable to make public static
// javax.swing.TimerQueue javax.swing.TimerQueue.sharedInstance() accessible:
// module java.desktop does not "opens javax.swing" to unnamed module
jvmArgs(getFlagsForAddOpens("javax.swing", module = "java.desktop"))
testLogging.showStandardStreams = true
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ protected void onUpdate(AnActionEvent anActionEvent) {
}
}
}
} else {
presentation.setVisible(false);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ protected void onUpdate(AnActionEvent anActionEvent) {
presentation.setDescription(getNonHtmlString("action.GitMachete.SquashCurrentAction.description"));
}
}
} else {
presentation.setVisible(false);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
@Slf4j
public final class GitVfsUtils {

private static final String MACHETE_FILE_NAME = "machete";
public static final String MACHETE_FILE_NAME = "machete";

private GitVfsUtils() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,6 @@ string.GitMachete.EnhancedGraphTable.duplicated-branches-text=The following bran
string.GitMachete.EnhancedGraphTable.empty-table-text.cannot-discover-layout=Provided machete file ({0}) is empty and branch layout can''t be automatically detected
string.GitMachete.EnhancedGraphTable.empty-table-text.loading=Loading\u2026
string.GitMachete.EnhancedGraphTable.empty-table-text.only-skipped-in-machete-file=None of the branches provided by machete file ({0}) exists within the local repository
string.GitMachete.EnhancedGraphTable.empty-table-text.try-running-discover=Provided machete file ({0}) is empty, try running ''Discover Branch Layout''
string.GitMachete.EnhancedGraphTable.skipped-branches-text=Some branches listed in machete file do not exist: {0}

action.GitMachete.EnhancedGraphTable.unmanaged-branch-notification.action.slide-in=Slide in under ''{0}''
Expand Down
10 changes: 1 addition & 9 deletions frontend/file/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import com.virtuslab.gitmachete.buildsrc.*

plugins {
alias(libs.plugins.jetbrains.grammarkit)
id("org.jetbrains.intellij.platform.grammarkit")
}

dependencies {
Expand Down Expand Up @@ -29,21 +29,13 @@ val additionalSourceDirs = listOf(generatedParserJavaSourcesRoot, generatedLexer

sourceSets["main"].java { srcDir(additionalSourceDirs) }

// FIXME (JetBrains/gradle-grammar-kit-plugin#224): required to avoid a fallback to JavaHelper.ReflectionHelper and a ClassCastException
val grammarKitMissingDependencies by configurations.creating
dependencies {
grammarKitMissingDependencies("org.jetbrains.intellij.deps:asm-all:9.6.1")
}

tasks {
generateParser {
sourceFile.set(file("$grammarSourcesRoot/Machete.bnf"))
targetRootOutputDir.set(file(generatedParserJavaSourcesRoot))
pathToParser.set("/$grammarJavaPackagePath/MacheteGeneratedParser.java")
pathToPsiRoot.set("/$grammarJavaPackagePath/")
purgeOldFiles.set(false)

classpath += files(grammarKitMissingDependencies)
}

generateLexer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ public static void saveDocument(PsiFile file) {
public static @Nullable VirtualFile getMacheteVirtualFileIfSelected(Project project) {
val fileEditorManager = FileEditorManager.getInstance(project);
return List.of(fileEditorManager.getSelectedFiles())
.find(virtualFile -> virtualFile.getFileType().equals(MacheteFileType.instance)).getOrNull();
.find(virtualFile -> virtualFile.getName().equals(GitVfsUtils.MACHETE_FILE_NAME)).getOrNull();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@
import com.virtuslab.gitmachete.frontend.common.WriteActionUtils;
import com.virtuslab.gitmachete.frontend.datakeys.DataKeys;
import com.virtuslab.gitmachete.frontend.defs.ActionPlaces;
import com.virtuslab.gitmachete.frontend.defs.FileTypeIds;
import com.virtuslab.gitmachete.frontend.file.MacheteFileWriter;
import com.virtuslab.gitmachete.frontend.graph.api.repository.IRepositoryGraph;
import com.virtuslab.gitmachete.frontend.graph.api.repository.IRepositoryGraphCache;
Expand Down Expand Up @@ -201,16 +200,20 @@ private void subscribeToMacheteFileChange() {
@ContinuesInBackground
@UIEffect
public void after(java.util.List<? extends VFileEvent> events) {
boolean macheteFileChanged = false;
for (val event : events) {
if (event instanceof VFileContentChangeEvent vfccEvent) {
if (vfccEvent.getFile().getFileType().getName().equals(FileTypeIds.NAME)) {
if (unmanagedBranchNotification != null && !unmanagedBranchNotification.isExpired()) {
unmanagedBranchNotification.expire();
}
queueRepositoryUpdateAndModelRefresh();
}
if (event instanceof VFileContentChangeEvent vfccEvent
&& vfccEvent.getFile().getName().equals(GitVfsUtils.MACHETE_FILE_NAME)) {
macheteFileChanged = true;
break;
}
}
if (macheteFileChanged) {
if (unmanagedBranchNotification != null && !unmanagedBranchNotification.isExpired()) {
unmanagedBranchNotification.expire();
}
queueRepositoryUpdateAndModelRefresh();
}
}

});
Expand Down Expand Up @@ -357,14 +360,15 @@ private void refreshModel(
val snapshot = gitMacheteRepositorySnapshot;
if (snapshot == null) {
repositoryGraph = NullRepositoryGraph.getInstance();
selectedBranchName = null;
} else {
repositoryGraph = repositoryGraphCache.getRepositoryGraph(snapshot, isListingCommits);
if (snapshot.getRootBranches().isEmpty()) {
if (snapshot.getSkippedBranchNames().isEmpty()) {
LOG.info("Machete file (${macheteFilePath}) is empty");
setTextForEmptyTable(
getString("string.GitMachete.EnhancedGraphTable.empty-table-text.try-running-discover")
.fmt(macheteFilePath.toString()));
LOG.info("Machete file (${macheteFilePath}) is empty, so auto discover is running");
setModel(new GraphTableModel(repositoryGraph));
selectedBranchName = null;
queueDiscover(macheteFilePath, doOnUIThreadWhenReady);
return;
} else {
setTextForEmptyTable(
Expand All @@ -376,6 +380,8 @@ private void refreshModel(

if (!isMacheteFilePresent) {
LOG.info("Machete file (${macheteFilePath}) is absent, so auto discover is running");
setModel(new GraphTableModel(repositoryGraph));
selectedBranchName = null;
// The `doOnUIThreadWhenReady` callback must be executed once the discover task is *complete*,
// and not just when the discover task is *enqueued*.
// Otherwise, it'll most likely happen that the callback executes before the discover task is complete,
Expand Down
21 changes: 10 additions & 11 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[versions]
checker = "3.53.0"
junit = "6.0.2"
checker = "4.0.0"
junit = "6.0.3"
remoteRobot = "0.11.23"

[libraries]
Expand All @@ -11,31 +11,30 @@ betterStrings = "com.antkorwin:better-strings:0.5"
checker = { module = "org.checkerframework:checker", version.ref = "checker" }
checker-qual = { module = "org.checkerframework:checker-qual", version.ref = "checker" }
commonsIO = "commons-io:commons-io:2.21.0"
jetbrains-annotations = "org.jetbrains:annotations:26.0.2-1"
jgit = "org.eclipse.jgit:org.eclipse.jgit:7.5.0.202512021534-r"
jetbrains-annotations = "org.jetbrains:annotations:26.1.0"
jgit = "org.eclipse.jgit:org.eclipse.jgit:7.6.0.202603022253-r"
junit4 = "junit:junit:4.13.2"
junit-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "junit" }
junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" }
junit-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "junit" }
junit-platformLauncher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "junit" }
kodein = "org.kodein.di:kodein-di-jvm:7.30.0"
kodein = "org.kodein.di:kodein-di-jvm:7.31.0"
kotlin-coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2"
kotlinxSerializationJson = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0"
lombok = "org.projectlombok:lombok:1.18.42"
mockito = "org.mockito:mockito-junit-jupiter:5.21.0"
kotlinxSerializationJson = "org.jetbrains.kotlinx:kotlinx-serialization-json:1.11.0"
lombok = "org.projectlombok:lombok:1.18.44"
mockito = "org.mockito:mockito-junit-jupiter:5.23.0"
okhttp = "com.squareup.okhttp3:okhttp:5.3.2"
remoteRobot-client = { module = "com.intellij.remoterobot:remote-robot", version.ref = "remoteRobot" }
remoteRobot-serverPlugin = { module = "com.intellij.remoterobot:robot-server-plugin", version.ref = "remoteRobot" }
slf4j-lambda = "kr.pe.kwonnam.slf4j-lambda:slf4j-lambda-core:0.1"
slf4j-mock = "org.simplify4u:slf4j-mock:2.4.0"
slf4j-simple = "org.slf4j:slf4j-simple:2.0.17"
vavr = "io.vavr:vavr:0.11.0"
vavr = "io.vavr:vavr:1.0.1"

# Note that certain plugins are also pulled in via buildSrc,
# where they aren't really `apply`-ed as plugins, but rather added to classpath as plugin packages;
# see https://docs.gradle.org/current/samples/sample_convention_plugins.html#things_to_note.
[plugins]
jetbrains-changelog = "org.jetbrains.changelog:2.5.0"
jetbrains-grammarkit = "org.jetbrains.grammarkit:2023.3.0.2"
jetbrains-intellij = "org.jetbrains.intellij.platform:2.11.0"
jetbrains-intellij = "org.jetbrains.intellij.platform:2.13.1"
taskTree = "com.dorongold.task-tree:4.0.1"
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
2 changes: 1 addition & 1 deletion gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions intellij-versions.properties
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
earliestSupportedMajor=2025.2
kotlinVersion=2.0.21-RC
latestMinorsOfOldSupportedMajors=2025.2.6.1
latestStable=2025.3.2
upcomingMajorEap=261.20362.25
kotlinVersion=2.2.0-RC2
latestMinorsOfOldSupportedMajors=2025.2.6.1,2025.3.4
latestStable=2026.1
upcomingMajorEap=
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,10 @@ public void only_ui_thread_unsafe_code_units_should_call_other_ui_thread_unsafe_
.check(productionClasses);
}

private static final String[] knownBlockingCodeUnits = {
private static final String[] uiThreadUnsafeCodeUnits = {
"com.intellij.dvcs.push.PushController.push(boolean)",
"com.intellij.openapi.vcs.changes.VcsFreezingProcess.execute()",
"com.intellij.openapi.vfs.VirtualFile.getFileType()",
"java.lang.Process.waitFor(long, java.util.concurrent.TimeUnit)",
"java.lang.Thread.sleep(long)",
};
Expand Down Expand Up @@ -219,7 +220,7 @@ private static boolean isUIThreadUnsafe(AccessTarget.CodeUnitCallTarget codeUnit

return uiThreadUnsafePackagePrefixes.stream().anyMatch(prefix -> packageName.startsWith(prefix))
&& !uiThreadSafeCodeUnitsInUnsafePackages.asList().contains(fullName)
|| knownBlockingCodeUnits.asList().contains(fullName)
|| uiThreadUnsafeCodeUnits.asList().contains(fullName)
|| codeUnit.isAnnotatedWith(UIThreadUnsafe.class);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,10 @@ abstract class BaseUITestSuite : TestGitRepository(SetupScripts.SETUP_WITH_SINGL
extend(di)
bindSingleton<CIServer>(overrides = true) {
object : CIServer by NoCIServer {
// For some reason, the actual arguments are passed in message-then-testName order,
// unlike testName-then-message order indicated by the superclass method.
@Suppress("PARAMETER_NAME_CHANGED_ON_OVERRIDE")
override fun reportTestFailure(
// For some reason, the actual arguments are passed in message-then-testName order,
// unlike testName-then-message order indicated by the superclass method.
message: String,
testName: String,
details: String,
Expand All @@ -110,7 +111,7 @@ abstract class BaseUITestSuite : TestGitRepository(SetupScripts.SETUP_WITH_SINGL
// which interferes with automatic UI tests since 2025.3
applyVMOptionsPatch { addSystemProperty("llm.show.ai.promotion.window.on.start", "false") }
}
val backgroundRun = ideStarter.runIdeWithDriver { }
val backgroundRun = ideStarter.runIdeWithDriver()
println("IDE instance started")

println("Rhino project initializing...")
Expand Down
Loading