Created
August 29, 2022 16:53
-
-
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/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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