Skip to content

Instantly share code, notes, and snippets.

@hamoid
Created August 29, 2022 16:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hamoid/2438191187526e1c5dabced31bba9b38 to your computer and use it in GitHub Desktop.
Save hamoid/2438191187526e1c5dabced31bba9b38 to your computer and use it in GitHub Desktop.
IntelliJ plugin code to add Gradle dependency sources for snapshot libraries. See https://youtrack.jetbrains.com/issue/IDEA-227215/
package com.hamoid.openrndrThumbnails.action
import com.hamoid.openrndrThumbnails.form.SettingsDialog
import com.intellij.icons.AllIcons
import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.application.WriteAction
import com.intellij.openapi.diagnostic.logger
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
import com.intellij.openapi.vfs.LocalFileSystem
private val LOG = logger<OpenSettingsAction>()
/**
* Wrench tool icon on top of the window to open SettingsDialog.
*/
class OpenSettingsAction : AnAction(
"Settings", // tooltip shown on hover
"Configure the OPENRNDR thumbs plugin", // info shown at window bottom
AllIcons.General.Settings // wrench icon
) {
/**
* Clicking the wrench icon opens the settings dialog
*/
override fun actionPerformed(anActionEvent: AnActionEvent) {
anActionEvent.project?.let { project ->
/**
* Add missing sources to Gradle dependencies.
*
* In this case I wrote an algorithm to convert dependency names,
* which can belong to two different repos, to folders on my disk.
*
* This approach is specific to OPENRNDR and ORX. I took this
* approach to avoid changing the code when new dependencies are
* added. This would work if the new dependencies follow the same
* naming pattern.
*
* A simpler approach would be to just make a table
* listOf("Gradle: ...-SNAPSHOT" to "/path/to/some/src", ...)
* This would get rid of the regex and most if-statements and
* string manipulations: If you find String A, add src B.
* But then you need to update that table when dependencies change
* and rebuild the plugin.
*
* In short, the idea is to go through the project's `.libraries`
* and for those with empty `OrderRootType.SOURCES`, call
* `addRoot()` to add the right path.
*
* To track the log:
* cd /home/funpro/OR/idea-thumbnails/build/idea-sandbox/system/log
* tail -f idea.log
*
* I just threw this code in here as a hack. When I open the
* settings dialog the dependencies are fixed. Better would be
* something like an actual editor with columns and rows...
*/
val version = "0.5.1-SNAPSHOT"
val regex = """org.(.*):(.*):$version""".toRegex()
WriteAction.run<Exception> {
LibraryTablesRegistrar.getInstance().getLibraryTable(project)
.libraries.filter { library ->
(library.name?.endsWith(version) ?: false) &&
library.getUrls(OrderRootType.SOURCES).isEmpty()
}.forEach { library ->
val (secondLevelDomain, lib) =
regex.find(library.name!!)?.groupValues?.drop(1)
?: listOf("", "")
if (!lib.contains("natives") && lib.isNotEmpty()) {
val isJVM = !lib.endsWith("-jvm") ||
lib.contains("-gl3-") ||
lib.contains("-openal-")
val libString = lib.replace("-jvm", "")
val repo =
if (secondLevelDomain == "openrndr") "openrndr" else "orx"
val subFolder = if (isJVM) "$repo-jvm/" else ""
val srcPath =
"/home/funpro/OR/$repo/$subFolder$libString/src"
LocalFileSystem.getInstance()
.findFileByPath(srcPath)
?.let { virtualFile ->
library.modifiableModel.apply {
addRoot(
virtualFile, OrderRootType.SOURCES
)
commit()
}
} ?: LOG.error("$srcPath not found")
}
}
}
/**
* This is the only original code from this file which just opens a
* dialog when clicking an icon.
*/
SettingsDialog(project).show()
}
}
}
/*
This is how `library.name` looks like. I want to make sure that the ones
not containing "natives" do have sources attached:
"Gradle: org.openrndr.extra:orx-color-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-compositor-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-file-watcher:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-fx-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-git-archiver:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-gui:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-hash-grid-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-image-fit-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-kotlin-parser:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-olive:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-panel:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-parameters-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-shade-styles-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-shader-phrases-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-shapes-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr.extra:orx-triangulation:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-animatable-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-application-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-binpack-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-color-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-dds-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-dialogs:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-draw-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-event-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-extensions-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-ffmpeg-natives-linux-x64:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-ffmpeg:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-filter-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-gl3-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-gl3-natives-linux-x64:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-kartifex-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-ktessellation-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-math-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-openal-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-openal-natives-linux-x64:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-shape-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-svg-jvm:0.5.1-SNAPSHOT",
"Gradle: org.openrndr:openrndr-utils-jvm:0.5.1-SNAPSHOT",
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment