From ca45367b3e1084f2ee5f0ba2a94e0e88d5175abc Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Wed, 6 Jan 2021 21:00:37 +0100 Subject: [PATCH 01/18] (GH-41) modified the footer in GitReleaseManager.yaml --- GitReleaseManager.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/GitReleaseManager.yaml b/GitReleaseManager.yaml index 2c325c05..ff139ac9 100644 --- a/GitReleaseManager.yaml +++ b/GitReleaseManager.yaml @@ -3,7 +3,7 @@ create: footer-heading: Where to get it footer-content: > You can download this release from the - [marketplace](https://plugins.jetbrains.com/plugin/15729-cake-rider/versions/). + [marketplace](https://plugins.jetbrains.com/plugin/15729-cake-rider/versions/), after it has been released. footer-includes-milestone: true milestone-replace-text: "{milestone}" export: From 4b517ef9338c1bfe4f3acf9dcaf2b358b8ffb477 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 21:00:10 +0100 Subject: [PATCH 02/18] (GH-39) removed all documentation everything is available at https://cakebuild.net/docs/integrations/editors/rider/ we'll track only changes here and PR them into cake-build/webiste on release. --- README.md | 50 +++-------------------------- images/cake-run.png | Bin 13637 -> 0 bytes images/runConfiguration-editor.png | Bin 19143 -> 0 bytes images/runConfigurations.png | Bin 4589 -> 0 bytes images/toolWindow.png | Bin 6970 -> 0 bytes 5 files changed, 5 insertions(+), 45 deletions(-) delete mode 100644 images/cake-run.png delete mode 100644 images/runConfiguration-editor.png delete mode 100644 images/runConfigurations.png delete mode 100644 images/toolWindow.png diff --git a/README.md b/README.md index ef817fcf..22227cd6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ typing the following in an elevated command prompt: ## Install Cake for Rider -Go to File -> Settings -> Plugins -> Marketplace and search for *Cake Rider* +Go to File -> Settings -> Plugins -> Marketplace and search for *Cake for Rider* ![Cake Rider Plugin](./images/riderPlugin.png) @@ -29,53 +29,13 @@ however, Cake for Rider might make use of two other channels: To use one of the channels open the [plugin page in the JetBrains Marketplace](https://plugins.jetbrains.com/plugin/15729-cake-rider/) select *Versions* and switch the channel on the left side of the page. Download the desired version and install it manually. -## Build scripts tool window +## Documentation -Cake files in the project are automatically found by extension and their tasks are displayed in a tool window: +The full documentation of the latest release of Cake for Rider can be found at [https://cakebuild.net/](https://cakebuild.net/docs/integrations/editors/rider/) -![Cake tasks tool window](./images/toolWindow.png) +### Documentation changes in the upcoming release -Here, a double click on the task will run the task immediately: - -![Running a Cake task](./images/cake-run.png) - -Alternatively, the buttons at the top of the tool window can be used to either run the task directly, -or create a new run configuration. - -## Run configurations: - -It is possible to have Cake tasks as run configurations: - -![Run configurations](./images/runConfigurations.png) - -The configurations can either be created from an existing Cake task, using the tool window or -created manually using the run configuration editor: - -![Run configuration editor](./images/runConfiguration-editor.png) - -## Settings - -There are multiple configuration settings available under File -> Settings -> Build, Execution, Deployment -> Cake. - -All settings are project - specific and stored in the `.idea` folder. To share settings between project members, make sure to include `CakeRider.xml` in your source control. - -### Generic settings - -* *Cake file extension* - This setting is used to find all Cake files and display them in the tool window. - Default: `cake` -* *Task Regex* - This regex is used to parse tasks from the Cake files. - Default: `Task\s*?\(\s*?"(.*?)"\s*?\)` -* *Verbosity* - This is the default verbosity to use, when running a task directly from the tool window or when creating a new run configuration. - Default: `normal` - -### Runner settings - -This window contains the runner to use when starting Cake. Additionally, a set of overrides can be added: Here, a regular expression is matched against the system property `os.name` and, if it matches, the runner is overridden. - -Default value is `dotnet-cake` and default override is `dotnet-cake.exe` for the regex `^.*windows.*$`. This default requires the [Cake .NET tool](https://cakebuild.net/docs/running-builds/runners/dotnet-tool) being globally installed. +None. ## Contribute diff --git a/images/cake-run.png b/images/cake-run.png deleted file mode 100644 index e3e1ef66e1c208457dfe3964f8043bc9558a842d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13637 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 From 701b594b2ce94448a888b1ac145d6e3266100e2e Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Fri, 8 Jan 2021 23:38:50 +0100 Subject: [PATCH 03/18] (GH-50) fixed storing of the script path In essence: Do not use "file" as a stored property. --- .../main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt index 10f2d90e..00b907bd 100644 --- a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt +++ b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt @@ -11,7 +11,7 @@ class CakeConfigurationOptions : RunConfigurationOptions() { set(v) { storedTaskName.setValue(this, v) } private val storedScriptPath: StoredProperty = - string("build.cake").provideDelegate(this, "file") + string("build.cake").provideDelegate(this, "scriptPath") var scriptPath: String? get() = storedScriptPath.getValue(this) set(v) { storedScriptPath.setValue(this, v) } From 3c66c6f0241352bf94c2c0df78dad223ca75538a Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Sat, 9 Jan 2021 23:29:14 +0100 Subject: [PATCH 04/18] (GH-30) added icons for Cake files I switched from using the png file to using the svg file, as providing different icon sizes is much easier here. --- README.md | 4 +- rider/src/main/kotlin/icons/CakeIcons.kt | 3 +- .../net/cakebuild/fileTypes/CakeFileType.kt | 30 +++++++ .../net/cakebuild/fileTypes/CakeLanguage.kt | 7 ++ .../cakebuild/run/CakeConfigurationType.kt | 2 +- rider/src/main/resources/META-INF/plugin.xml | 3 +- rider/src/main/resources/icons/CakeIcon.png | Bin 693 -> 0 bytes rider/src/main/resources/icons/CakeIcon13.svg | 76 ++++++++++++++++++ rider/src/main/resources/icons/CakeIcon16.svg | 76 ++++++++++++++++++ rider/src/main/resources/icons/CakeIcon@2.png | Bin 2131 -> 0 bytes 10 files changed, 197 insertions(+), 4 deletions(-) create mode 100644 rider/src/main/kotlin/net/cakebuild/fileTypes/CakeFileType.kt create mode 100644 rider/src/main/kotlin/net/cakebuild/fileTypes/CakeLanguage.kt delete mode 100644 rider/src/main/resources/icons/CakeIcon.png create mode 100644 rider/src/main/resources/icons/CakeIcon13.svg create mode 100644 rider/src/main/resources/icons/CakeIcon16.svg delete mode 100644 rider/src/main/resources/icons/CakeIcon@2.png diff --git a/README.md b/README.md index 22227cd6..a2d721b5 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,9 @@ The full documentation of the latest release of Cake for Rider can be found at [ ### Documentation changes in the upcoming release -None. +#### File icons + +Files with the extension `.cake` have the Cake logo as file icons now. ## Contribute diff --git a/rider/src/main/kotlin/icons/CakeIcons.kt b/rider/src/main/kotlin/icons/CakeIcons.kt index 22661208..87b86d88 100644 --- a/rider/src/main/kotlin/icons/CakeIcons.kt +++ b/rider/src/main/kotlin/icons/CakeIcons.kt @@ -3,5 +3,6 @@ package icons import com.intellij.openapi.util.IconLoader object CakeIcons { - val Cake = IconLoader.getIcon("/icons/CakeIcon.png") + val CakeAction = IconLoader.getIcon("/icons/CakeIcon16.svg") + val CakeFileType = IconLoader.getIcon("/icons/CakeIcon16.svg") } diff --git a/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeFileType.kt b/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeFileType.kt new file mode 100644 index 00000000..40dac0ff --- /dev/null +++ b/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeFileType.kt @@ -0,0 +1,30 @@ +package net.cakebuild.fileTypes + +import com.intellij.openapi.fileTypes.LanguageFileType +import com.intellij.openapi.fileTypes.ex.FileTypeIdentifiableByVirtualFile +import com.intellij.openapi.project.ProjectLocator +import com.intellij.openapi.vfs.VirtualFile +import icons.CakeIcons +import net.cakebuild.settings.CakeSettings + +class CakeFileType : LanguageFileType(CakeLanguage), FileTypeIdentifiableByVirtualFile { + override fun getName() = CakeLanguage.displayName + override fun getDescription() = "Cake scripts" + override fun getIcon() = CakeIcons.CakeFileType + override fun getDefaultExtension() = "cake" + + override fun isMyFileType(file: VirtualFile): Boolean { + val extension = file.extension?.toLowerCase() ?: "" + + if (extension.equals(defaultExtension, true)) { + return true + } + + val projects = ProjectLocator.getInstance().getProjectsForFile(file) + val extensions = projects.map { + CakeSettings.getInstance(it).cakeFileExtension.toLowerCase() + }.distinct() + + return extensions.contains(extension.toLowerCase()) + } +} diff --git a/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeLanguage.kt b/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeLanguage.kt new file mode 100644 index 00000000..87de23ce --- /dev/null +++ b/rider/src/main/kotlin/net/cakebuild/fileTypes/CakeLanguage.kt @@ -0,0 +1,7 @@ +package net.cakebuild.fileTypes + +import com.intellij.lang.Language + +object CakeLanguage : Language("Cake") { + override fun isCaseSensitive() = true +} diff --git a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationType.kt b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationType.kt index 495df5e6..a46dafb7 100644 --- a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationType.kt +++ b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationType.kt @@ -4,7 +4,7 @@ import com.intellij.execution.configurations.ConfigurationTypeBase import icons.CakeIcons class CakeConfigurationType : - ConfigurationTypeBase("CAKE_CONFIGURATION", "Cake", "Cake", CakeIcons.Cake) { + ConfigurationTypeBase("CAKE_CONFIGURATION", "Cake", "Cake", CakeIcons.CakeAction) { val cakeFactory = CakeConfigurationFactory(this) diff --git a/rider/src/main/resources/META-INF/plugin.xml b/rider/src/main/resources/META-INF/plugin.xml index 7184d8c8..35ff5132 100644 --- a/rider/src/main/resources/META-INF/plugin.xml +++ b/rider/src/main/resources/META-INF/plugin.xml @@ -9,8 +9,9 @@ com.intellij.modules.rider + - + _6vuz}ZoAj%oKB}9Ybs{Wv{ou88Wc$cML|#$7`;SK zJ`_aMgU~|+Jw;IT5EcYcLLhA!kxvURIl}FYb-1^U+w+7y^vHesLwhEel5^d#2#@ zcoqP27$@LsZHj9fIR=XX0ZXUX> zBkCHJwGFggxlz$^r@cEv#J?0l0O#T6ru&^wU!2B5uSFWtKRX<%OGofY8hvAW(1ms_`_q7R5h!erRyXslFetc13U8gaoz@0*|0 zH}+ux91e47Z7aa`TI&Xf@od$dQ;8I+q9D0ke4EYX?$sWol!AMG{&Ik-EHFMeNhGWi z2}g;{szk#o3y~Pp{h1Usc#z}_-VZydc24qrI)Ren!xEtH0FYx7_HFj$-)pKWd+W}U bj{^Jx;V|-qZ2+=S00000NkvXXu0mjf&D}Zg diff --git a/rider/src/main/resources/icons/CakeIcon13.svg b/rider/src/main/resources/icons/CakeIcon13.svg new file mode 100644 index 00000000..720c9189 --- /dev/null +++ b/rider/src/main/resources/icons/CakeIcon13.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rider/src/main/resources/icons/CakeIcon16.svg b/rider/src/main/resources/icons/CakeIcon16.svg new file mode 100644 index 00000000..cb5d5099 --- /dev/null +++ b/rider/src/main/resources/icons/CakeIcon16.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rider/src/main/resources/icons/CakeIcon@2.png b/rider/src/main/resources/icons/CakeIcon@2.png deleted file mode 100644 index b6d13627eee86325247d438853dc60b0c6710319..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2131 zcmZ{lc{J4BAIGnKnL?KA*-})PF@`ZJyP7mH!c$Sx7{d(4ItV=sB~c-gC67pmY*Pr+ zXe6Npp=?o#7=&z3l;-#K`{&pBJ?FXS-1|P~eqNu?=bpQL5*?2n+A6Lj4glDSJ#6Cy zsrqIY6^6!;$jD_#1idYBmH;qQU_XgMn?}-MCmaBgy8vKZ1YjMSVoU)L3I|~NEC84+ z0OSL68}a)ggRqDFAsa}cwr0(WfkcFk#o3CC35dwcYMoI=LXfZ=*2dELL<{>S&Cl(v zVjJ)8yr@4nqzPupG{3g6z?@xsL&b}hh01E^j2<<`?#FdiZP^S(k?l@qK)I==YEJV8VuWC9D1z>SxZgn^8gFwvtfHcXYioU z8D`zE-05ZR&CAQZ_xV4fjSYa^;81r`t=Z`}@7U%(p%?iWiynDs&vV0>M`Fo)d0`Ia zV{2bkcW{p=ei7oxScT#ecE8idzlatB#W^urw_o#t+*mIg*Q%(2@s8_Jq}BEekheO>Qh@%b4wz4IXzihDOL{n{Jc$+D=e=ur{*Z?rX-Y4roy|+co)eF;tm3?X(Q==S%pMSmNJEaWkok zoEZP1*rzcq;kPA;nrUd`dF*CKYg0Q+4E&Abx~@KAIRWTsw-jW zo)#_hAf@EC?5i*~?`6S8qy6Z?SNs&;j2Irve3XI+W?A}@ZDuvm!xJ)D#in0xjf>ZQ z3QPuevnA=E@%c&M4JO6bso_G3D;tOZk)Cy7jXtofcc!=Y*L@ z6%A-kMv{{-s_IUf;>Ax3Ei*e-2XoBGc9pWb=fVd80H(5K zlaTJv#X>lW#dQW1Y*%4$UB-K{-HQ4~HlN$az2^ym0CXp;X=4Eq>^%`H?pY?*0vV4rwD4(Tg!`wq?ZJ%5l?BC5AuX7DR5l=TcejT0ff8p{>xS ztx!LzbVxdaK4euY8!3QerRf{xA^1_F_6cVyLvZ0b>jPg+F%f>Zr@_bL2iR2 z=SnZIdokYN;1D#a>mYrJ;!u6FGqxo`va6mg%!oA|iCmiTkl=Jy;JNd~#Gmm_jdsdM zHI+pROFOnkt5})na+*=!R1)SbQr^FBmMrRe?|@qmIks9}El8@ykm2c8xR{D`r`0cW z<5S)r6gkc`xAEET`x&o4#-j^s_DTK9xKKL%Epa6P#1Aoad~!|}KqsM1w>?4kB+|(k zQZN}3U z`V>0NukrS>H55i+GmJAOl;(lK*aVP5X=Hyo2IB}hhX6zgk7WQc^1m_vjf=q?CR4pB zbbvI}S^mCRaku{y`Ge|7r$9uv8#)3a6n`UdR2rEc5l9Bq%~cvuNdcK~bm#wN!Z||} zKp3IXMo1JIVNw}ro(&-qzr{IDjU)rORY!orSIDySH;aoC7I;A$fiW=9cP9~j$$C%{ ae|>0hL!3UPf!};B0Bd{9rqb$c+ Date: Thu, 7 Jan 2021 20:17:43 +0100 Subject: [PATCH 05/18] (GH-44) fixed the warning by adding a workaround for https://youtrack.jetbrains.com/issue/IDEA-210683 --- rider/build.gradle.kts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/rider/build.gradle.kts b/rider/build.gradle.kts index 0c3df9f9..b2479656 100644 --- a/rider/build.gradle.kts +++ b/rider/build.gradle.kts @@ -1,4 +1,5 @@ import io.gitlab.arturbosch.detekt.Detekt +import org.gradle.internal.os.OperatingSystem import org.jetbrains.changelog.closure import org.jetbrains.changelog.markdownToHTML import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -83,10 +84,26 @@ tasks { kotlinOptions.jvmTarget = "1.8" } } - withType { jvmTarget = "1.8" } + // workaround for https://youtrack.jetbrains.com/issue/IDEA-210683 + getByName("buildSearchableOptions") { + jvmArgs( + "--illegal-access=deny", + "--add-opens=java.desktop/sun.awt=ALL-UNNAMED", + "--add-opens=java.desktop/java.awt=ALL-UNNAMED", + "--add-opens=java.base/java.lang=ALL-UNNAMED", + "--add-opens=java.desktop/javax.swing=ALL-UNNAMED", + "--add-opens=java.desktop/javax.swing.plaf.basic=ALL-UNNAMED", + "--add-opens=java.desktop/sun.font=ALL-UNNAMED", + "--add-opens=java.desktop/sun.swing=ALL-UNNAMED" + ) + + if (OperatingSystem.current() == OperatingSystem.MAC_OS) { + jvmArgs("--add-opens=java.desktop/com.apple.eawt.event=ALL-UNNAMED") + } + } patchPluginXml { version(pluginVersion) From 55cd61169d33ce0f1981d50ddabaabc58207ae51 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Sat, 9 Jan 2021 00:16:43 +0100 Subject: [PATCH 06/18] (GH-49) custom arguments in run configurations --- README.md | 7 ++++++ images/runConfiguration-editor.png | Bin 0 -> 15474 bytes .../run/CakeConfigurationEditor.form | 20 ++++++++++++++++-- .../run/CakeConfigurationEditor.java | 7 +++++- .../net/cakebuild/run/CakeConfiguration.kt | 14 +++++++----- .../cakebuild/run/CakeConfigurationOptions.kt | 6 ++++++ 6 files changed, 46 insertions(+), 8 deletions(-) create mode 100644 images/runConfiguration-editor.png diff --git a/README.md b/README.md index a2d721b5..a7644990 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,13 @@ The full documentation of the latest release of Cake for Rider can be found at [ Files with the extension `.cake` have the Cake logo as file icons now. + +#### Custom arguments in run configurations + +A new setting has been added to run configuration: *Arguments*. It can be used to supply custom arguments when running that configuration. + +![arguments](./images/runConfiguration-editor.png) + ## Contribute Check out the [Cake contribution guidelines](https://cakebuild.net/docs/contributing/contribution-guidelines) diff --git a/images/runConfiguration-editor.png b/images/runConfiguration-editor.png new file mode 100644 index 0000000000000000000000000000000000000000..6b13af6a16af7d70b0df6abb665afca83ac98021 GIT binary patch literal 15474 zcmeHuc{r5s+xPTsQ3)+1OH@+G5;Arwp=75}n6e}p#**EbN>tVq#x7(l+mNx(B#mt_ zw(Lx@8)F*=Gt9g<^?iQ7@AJIRyBx>+=j%8)X2yMA_jR4;b$!my`8m&dW2mpqc9{1t z2n1rgb@PTX2(%9jyq-CD0Qk$9YX|%V?eQ?yz78sE=br`M>~pxLcMSwWMX_!@+z-4z z0|a8P-}&9s2-~?uh2_?bYoc0|sz04TP8p4QRjo!v(S0gL zX+F@Tk<$Y73e|oVvEpYTmyyj^n^r)je;vLCg$*xj2_2l#;ndQ?74y7a0&&_Obk$<3 zZryK`a5emy(%FaKimv?Szh|Ge=}ILn@H6%f@e`xB{PX9}4pon=7aPYno1U8eDF5_X zS=DOM)bp;TYu)~pR$0Q%YCs^<(77ujJF5hNt_mALcV9ef$>`sG0gBZ`?b&@L7G|?| z_l4<6+>SLspxpdnT*Gq&HvLke^zUn`I*m{$zqPsRe~%~i)D)T=u+kiC_oHJpYuF<@bt@ZIPalw-CbHim?2JKo|CZlFD3a-4uTWue3 zc@#7F^JVLms{1*9^N;fB4j1fP_XxbYZF{VbZD#>9s&}4jsawXZGnVB}@ zGnrAnriC>tIs+AMnXT>ZE%KOUwt?b@K^Uxc5nfxJX5>p9aF~p{@6t(`mID6@vbMU> zqh9A#G+SopLaMfh9Nn7n)PO^Kb%4&zk%8#PJJ85O<8KFny2s!H8jh!zYlF=Hk*k{vN(@>o?M>6dbJ(X#`DmBC3JRO@`HwJSryPk&T z+}`go^%4`1Y2kANuZQby^$Qq63cy?gGVHgPRh(P6ocOaQrL(Bld=M�`ZgqI!Yi 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 literal 0 HcmV?d00001 diff --git a/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.form b/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.form index 04dde4d3..4e039bb4 100644 --- a/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.form +++ b/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.form @@ -1,6 +1,6 @@

- + @@ -56,9 +56,25 @@ - + + + + + + + + + + + + + + + + + diff --git a/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.java b/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.java index bd891e00..fd0d642e 100644 --- a/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.java +++ b/rider/src/main/java/net/cakebuild/run/CakeConfigurationEditor.java @@ -2,6 +2,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; +import com.intellij.ui.components.fields.ExpandableTextField; import net.cakebuild.shared.ui.VerbosityComboBox; import org.jetbrains.annotations.NotNull; @@ -15,6 +16,7 @@ public class CakeConfigurationEditor extends SettingsEditor { private JTextField scriptPathField; private JTextField taskField; private JComboBox verbosityBox; + private JTextField argumentsField; @Override protected void resetEditorFrom(@NotNull CakeConfiguration configuration) { @@ -25,18 +27,20 @@ protected void resetEditorFrom(@NotNull CakeConfiguration configuration) { scriptPathField.setText(state.getScriptPath()); taskField.setText(state.getTaskName()); ((VerbosityComboBox)verbosityBox).setVerbosity(state.getVerbosity()); + argumentsField.setText((state.getAdditionalArguments())); } @Override protected void applyEditorTo(@NotNull CakeConfiguration configuration) throws ConfigurationException { CakeConfigurationOptions state = configuration.getState(); if(state == null) { - throw new ConfigurationException("state is null: Can not set state."); + throw new ConfigurationException("State is null: can not set state."); } state.setScriptPath(scriptPathField.getText()); state.setTaskName(taskField.getText()); state.setVerbosity(((VerbosityComboBox)verbosityBox).getVerbosity()); + state.setAdditionalArguments(argumentsField.getText()); } @NotNull @@ -47,5 +51,6 @@ protected JComponent createEditor() { private void createUIComponents() { verbosityBox = new VerbosityComboBox(); + argumentsField = new ExpandableTextField(); } } diff --git a/rider/src/main/kotlin/net/cakebuild/run/CakeConfiguration.kt b/rider/src/main/kotlin/net/cakebuild/run/CakeConfiguration.kt index 7bfff6e9..092d23d6 100644 --- a/rider/src/main/kotlin/net/cakebuild/run/CakeConfiguration.kt +++ b/rider/src/main/kotlin/net/cakebuild/run/CakeConfiguration.kt @@ -13,6 +13,7 @@ import com.intellij.execution.runners.ExecutionEnvironment import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.options.SettingsEditor import com.intellij.openapi.project.Project +import com.intellij.util.execution.ParametersListUtil import net.cakebuild.settings.CakeSettings import java.nio.file.FileSystems @@ -49,15 +50,18 @@ class CakeConfiguration(project: Project, factory: CakeConfigurationFactory) : val scriptPath = fileSystems .getPath(project.basePath!!) .resolve(fileSystems.getPath(options.scriptPath!!)) + val arguments = mutableListOf() + arguments.add(scriptPath.toString()) + arguments.add("--target=${options.taskName}") + arguments.add("--verbosity=${options.verbosity}") + if (!options.additionalArguments.isNullOrEmpty()) { + arguments.addAll(ParametersListUtil.parseToArray(options.additionalArguments!!)) + } val commandLine = GeneralCommandLine() .withParentEnvironmentType(GeneralCommandLine.ParentEnvironmentType.CONSOLE) .withWorkDirectory(scriptPath.parent.toString()) .withExePath(exe) - .withParameters( - scriptPath.toString(), - "--target=${options.taskName}", - "--verbosity=${options.verbosity}" - ) + .withParameters(arguments) val processHandler = ProcessHandlerFactory.getInstance().createColoredProcessHandler(commandLine) ProcessTerminatedListener.attach(processHandler) return processHandler diff --git a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt index 00b907bd..635c54c3 100644 --- a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt +++ b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationOptions.kt @@ -21,4 +21,10 @@ class CakeConfigurationOptions : RunConfigurationOptions() { var verbosity: String? get() = storedVerbosity.getValue(this) set(v) { storedVerbosity.setValue(this, v) } + + private val storedAdditionalArguments: StoredProperty = + string("").provideDelegate(this, "additionalArguments") + var additionalArguments: String? + get() = storedAdditionalArguments.getValue(this) + set(v) { storedAdditionalArguments.setValue(this, v) } } From b689c1f09e4856f4f73d12416f415553b46bb422 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Jan 2021 07:08:32 +0000 Subject: [PATCH 07/18] (maint): Bump org.jetbrains.changelog from 0.6.2 to 1.0.0 in /rider Bumps org.jetbrains.changelog from 0.6.2 to 1.0.0. Signed-off-by: dependabot[bot] --- rider/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rider/build.gradle.kts b/rider/build.gradle.kts index b2479656..ea782b2a 100644 --- a/rider/build.gradle.kts +++ b/rider/build.gradle.kts @@ -12,7 +12,7 @@ plugins { // gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin id("org.jetbrains.intellij") version "0.6.5" // gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin - id("org.jetbrains.changelog") version "0.6.2" + id("org.jetbrains.changelog") version "1.0.0" // detekt linter - read more: https://detekt.github.io/detekt/gradle.html id("io.gitlab.arturbosch.detekt") version "1.15.0" // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle From a958e0adfc59ddef5f88abd6dada2414bbcba6d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Jan 2021 07:10:51 +0000 Subject: [PATCH 08/18] (maint): Bump org.jetbrains.changelog from 1.0.0 to 1.0.1 in /rider Bumps org.jetbrains.changelog from 1.0.0 to 1.0.1. Signed-off-by: dependabot[bot] --- rider/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rider/build.gradle.kts b/rider/build.gradle.kts index ea782b2a..4aaa62a1 100644 --- a/rider/build.gradle.kts +++ b/rider/build.gradle.kts @@ -12,7 +12,7 @@ plugins { // gradle-intellij-plugin - read more: https://github.com/JetBrains/gradle-intellij-plugin id("org.jetbrains.intellij") version "0.6.5" // gradle-changelog-plugin - read more: https://github.com/JetBrains/gradle-changelog-plugin - id("org.jetbrains.changelog") version "1.0.0" + id("org.jetbrains.changelog") version "1.0.1" // detekt linter - read more: https://detekt.github.io/detekt/gradle.html id("io.gitlab.arturbosch.detekt") version "1.15.0" // ktlint linter - read more: https://github.com/JLLeitschuh/ktlint-gradle From 04a1c8d3afab1f9886ce4168734c85bd57c85690 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 14:58:51 +0100 Subject: [PATCH 09/18] (GH-28) CakeBalloonNotifications not fixed Added a comment on why we can not remove the ``` Deprecated constructor NotificationGroup.(...) is invoked in CakeBalloonNotifications.() ``` warning. --- .../kotlin/net/cakebuild/shared/CakeBalloonNotifications.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/shared/CakeBalloonNotifications.kt b/rider/src/main/kotlin/net/cakebuild/shared/CakeBalloonNotifications.kt index deca1bf0..cb97c12b 100644 --- a/rider/src/main/kotlin/net/cakebuild/shared/CakeBalloonNotifications.kt +++ b/rider/src/main/kotlin/net/cakebuild/shared/CakeBalloonNotifications.kt @@ -6,7 +6,9 @@ import com.intellij.notification.NotificationType import com.intellij.openapi.project.Project object CakeBalloonNotifications { - // after 2020.03 this can be done in pluxin.xml, see https://jetbrains.org/intellij/sdk/docs/user_interface_components/notifications.html + // this will raise a deprecation notice. Sadly that's unavoidable until + // we drop support for all versions < 2020.3. + // after 2020.3 this should be done in pluxin.xml, see https://jetbrains.org/intellij/sdk/docs/user_interface_components/notifications.html private val notificationGroup = NotificationGroup("Cake", NotificationDisplayType.BALLOON, true) From 906e017f5846f20061107479d70933df2a1ab7a5 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 15:02:35 +0100 Subject: [PATCH 10/18] (GH-28) fixed IconLoader.getIcon fixed ``` Deprecated method IconLoader.getIcon(String) is invoked in CakeIcons.() ``` also followed https://jetbrains.org/intellij/sdk/docs/reference_guide/work_with_icons_and_images.html and added `@JvmField` to get access to the property from plugin.xml. --- rider/build.gradle.kts | 1 + rider/src/main/kotlin/icons/CakeIcons.kt | 3 +++ rider/src/main/resources/META-INF/plugin.xml | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/rider/build.gradle.kts b/rider/build.gradle.kts index 4aaa62a1..4b9cb21c 100644 --- a/rider/build.gradle.kts +++ b/rider/build.gradle.kts @@ -142,6 +142,7 @@ tasks { runPluginVerifier { ideVersions(pluginVerifierIdeVersions) + // reports are in ${project.buildDir}/reports/pluginVerifier - or set verificationReportsDirectory() } publishPlugin { diff --git a/rider/src/main/kotlin/icons/CakeIcons.kt b/rider/src/main/kotlin/icons/CakeIcons.kt index 87b86d88..c0de673e 100644 --- a/rider/src/main/kotlin/icons/CakeIcons.kt +++ b/rider/src/main/kotlin/icons/CakeIcons.kt @@ -3,6 +3,9 @@ package icons import com.intellij.openapi.util.IconLoader object CakeIcons { + @JvmField val CakeAction = IconLoader.getIcon("/icons/CakeIcon16.svg") + + @JvmField val CakeFileType = IconLoader.getIcon("/icons/CakeIcon16.svg") } diff --git a/rider/src/main/resources/META-INF/plugin.xml b/rider/src/main/resources/META-INF/plugin.xml index 35ff5132..e9eb6437 100644 --- a/rider/src/main/resources/META-INF/plugin.xml +++ b/rider/src/main/resources/META-INF/plugin.xml @@ -11,7 +11,7 @@ - + Date: Thu, 7 Jan 2021 19:40:02 +0100 Subject: [PATCH 11/18] (GH-28) fixed RunManager.addConfiguration ``` Deprecated method RunManager.addConfiguration(...) is invoked in CakeProject.CakeTask.run(...) ``` This introduces a new deprecation warning: ``` Deprecated method com.intellij.execution.RunnerAndConfigurationSettings.setShared(boolean value) ``` This is unavoidable. If we drop support for versions < 2020.1 we can replace the deprecated call wih a call to `runConfiguration.storeInDotIdeaFolder()` --- rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt index 9969d852..1540cc57 100644 --- a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt +++ b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt @@ -80,7 +80,10 @@ class CakeProject(private val project: Project) { CakeTaskRunMode.Debug -> DefaultDebugExecutor.getDebugExecutorInstance() CakeTaskRunMode.Run -> DefaultRunExecutor.getRunExecutorInstance() else -> { - runManager.addConfiguration(runConfiguration, true) + // this line will cause a deprecation warning. + // when we drop support for versions < 2020.1 we can call the new runConfiguration.storeInDotIdeaFolder() + runConfiguration.isShared = true + runManager.addConfiguration(runConfiguration) runManager.selectedConfiguration = runConfiguration null } From 7aee7463aae00a473e6db0e24673c94377b97a34 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 19:41:20 +0100 Subject: [PATCH 12/18] (GH-28) fixed isConfigurationSingletonByDefault() by using the replacement `RunConfigurationSingletonPolicy.SINGLE_INSTANCE` --- .../main/kotlin/net/cakebuild/run/CakeConfigurationFactory.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationFactory.kt b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationFactory.kt index 2b67af2e..423bc821 100644 --- a/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationFactory.kt +++ b/rider/src/main/kotlin/net/cakebuild/run/CakeConfigurationFactory.kt @@ -2,6 +2,7 @@ package net.cakebuild.run import com.intellij.execution.BeforeRunTask import com.intellij.execution.configurations.ConfigurationFactory +import com.intellij.execution.configurations.RunConfigurationSingletonPolicy import com.intellij.openapi.components.BaseState import com.intellij.openapi.project.Project import com.intellij.openapi.util.Key @@ -11,7 +12,7 @@ import com.jetbrains.rider.build.tasks.BuildProjectBeforeRunTaskProvider class CakeConfigurationFactory(cakeConfigurationType: CakeConfigurationType) : ConfigurationFactory(cakeConfigurationType) { - override fun isConfigurationSingletonByDefault() = true + override fun getSingletonPolicy() = RunConfigurationSingletonPolicy.SINGLE_INSTANCE override fun createTemplateConfiguration(project: Project): CakeConfiguration { return CakeConfiguration(project, this) From b0937547828523af91cd6019b8808c97389e3878 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 19:43:57 +0100 Subject: [PATCH 13/18] (maint) fixed local warnings from pluginVerifier There were warnings that showed up only locally: `module com.intellij.modules.rider: Module 'com.intellij.modules.rider' is not found` This was due to the fact that the wrong `pluginVerifierIdeVersions` were used during verification. --- rider/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rider/gradle.properties b/rider/gradle.properties index 88395cd0..077233ff 100644 --- a/rider/gradle.properties +++ b/rider/gradle.properties @@ -8,7 +8,7 @@ pluginSinceBuild = 193 pluginUntilBuild = 203.* # Plugin Verifier integration -> https://github.com/JetBrains/gradle-intellij-plugin#plugin-verifier-dsl # See https://jb.gg/intellij-platform-builds-list for available build versions -pluginVerifierIdeVersions = 2019.3.5, 2020.1.4, 2020.2.3, 2020.3 +pluginVerifierIdeVersions = RD-2019.3.4, RD-2020.1.4, RD-2020.2.3, RD-2020.3.2 platformType = RD platformVersion = 2019.3 From 8d5c0f660be83401603a9478ba72320a1739b200 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Thu, 7 Jan 2021 20:22:27 +0100 Subject: [PATCH 14/18] (maint) fixed detekt warning --- rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt index 1540cc57..632fe408 100644 --- a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt +++ b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt @@ -81,7 +81,8 @@ class CakeProject(private val project: Project) { CakeTaskRunMode.Run -> DefaultRunExecutor.getRunExecutorInstance() else -> { // this line will cause a deprecation warning. - // when we drop support for versions < 2020.1 we can call the new runConfiguration.storeInDotIdeaFolder() + // when we drop support for versions < 2020.1 + // we can call the new runConfiguration.storeInDotIdeaFolder() runConfiguration.isShared = true runManager.addConfiguration(runConfiguration) runManager.selectedConfiguration = runConfiguration From d7dfb808d82bb36cc342c218423b767f42db8221 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Sat, 16 Jan 2021 20:19:27 +0100 Subject: [PATCH 15/18] (GH-60) added a link to Cake Discussions --- .gitignore | 1 + README.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/.gitignore b/.gitignore index 2f27b49e..fac87f98 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ Desktop.ini .DS_Store /tools/ /BuildArtifacts/ +.history/ diff --git a/README.md b/README.md index a7644990..b846e273 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,12 @@ A new setting has been added to run configuration: *Arguments*. It can be used t ![arguments](./images/runConfiguration-editor.png) +## Discussion + +If you have questions, search for an existing one, or create a new discussion on the Cake GitHub repository. + +[![Join in the discussion on the Cake repository](https://img.shields.io/badge/GitHub-Discussions-green?logo=github)](https://github.com/cake-build/cake/discussions) + ## Contribute Check out the [Cake contribution guidelines](https://cakebuild.net/docs/contributing/contribution-guidelines) From 0e028cb871fa9e5258bd82e92f67d276f1665e43 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Wed, 13 Jan 2021 23:10:02 +0100 Subject: [PATCH 16/18] (maint) added tooltip for cake files in toolWindow having multiple files with the same name show up in the tool window is rather irritating therefore a tooltip with the full filename was implemented for tree nodes that represent a cake file --- .../net/cakebuild/shared/CakeProject.kt | 5 -- .../cakebuild/toolwindow/CakeTasksWindow.kt | 48 ++++++++++++++++++- 2 files changed, 47 insertions(+), 6 deletions(-) diff --git a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt index 632fe408..de953745 100644 --- a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt +++ b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt @@ -59,11 +59,6 @@ class CakeProject(private val project: Project) { data class CakeTask(private val project: Project, val file: VirtualFile, val taskName: String) { - // to make the task look good when placed in a tree-node. - override fun toString(): String { - return taskName - } - fun run(mode: CakeTaskRunMode) { val runManager = project.getService(RunManager::class.java) val configurationType = ConfigurationTypeUtil.findConfigurationType(CakeConfigurationType::class.java) diff --git a/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt b/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt index 3e97a75c..6bb8db64 100644 --- a/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt +++ b/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt @@ -8,9 +8,15 @@ import com.intellij.ui.ScrollPaneFactory import com.intellij.ui.treeStructure.Tree import net.cakebuild.shared.CakeDataKeys import net.cakebuild.shared.CakeProject +import java.awt.Component import java.awt.event.MouseAdapter import java.awt.event.MouseEvent +import javax.swing.JComponent +import javax.swing.JLabel +import javax.swing.JTree +import javax.swing.ToolTipManager import javax.swing.tree.DefaultMutableTreeNode +import javax.swing.tree.DefaultTreeCellRenderer import javax.swing.tree.DefaultTreeModel import javax.swing.tree.TreeNode import javax.swing.tree.TreePath @@ -23,6 +29,8 @@ class CakeTasksWindow(private val project: Project) : SimpleToolWindowPanel(true init { val scrollPane = ScrollPaneFactory.createScrollPane(tree) setContent(scrollPane) + ToolTipManager.sharedInstance().registerComponent(tree) + tree.cellRenderer = MyTreeCellRenderer() tree.selectionModel.selectionMode = TreeSelectionModel.SINGLE_TREE_SELECTION refreshTree() initToolbar() @@ -106,7 +114,7 @@ class CakeTasksWindow(private val project: Project) : SimpleToolWindowPanel(true val cakeProject = CakeProject(project) for (cakeFile in cakeProject.getCakeFiles()) { - val fileNode = DefaultMutableTreeNode(cakeFile.file.name) + val fileNode = DefaultMutableTreeNode(cakeFile) rootNode.add(fileNode) for (task in cakeFile.getTasks()) { @@ -122,4 +130,42 @@ class CakeTasksWindow(private val project: Project) : SimpleToolWindowPanel(true if (CakeDataKeys.TASKS_WINDOW.`is`(dataId)) return this return super.getData(dataId) } + + class MyTreeCellRenderer : DefaultTreeCellRenderer() { + + init { + setClosedIcon(null) + setOpenIcon(null) + setLeafIcon(null) + } + + override fun getTreeCellRendererComponent( + tree: JTree, + value: Any, + sel: Boolean, + expanded: Boolean, + leaf: Boolean, + row: Int, + hasFocus: Boolean + ): Component { + val cell: Component = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus) + if (cell is JComponent) { + val label = cell as JLabel + cell.toolTipText = null + when (val data = (value as DefaultMutableTreeNode).userObject) { + is CakeProject.CakeTask -> { + label.text = data.taskName + } + is CakeProject.CakeFile -> { + cell.toolTipText = data.file.path + label.text = data.file.nameWithoutExtension + } + else -> { + label.text = data.toString() + } + } + } + return cell + } + } } From c022eaa7e4e3048a73822bb8bd838143675e3463 Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Wed, 13 Jan 2021 23:12:23 +0100 Subject: [PATCH 17/18] (maint) fix error for cake files without tasks when cake files without tasks were rendered in the tree in the toolwindow exceptions would occur when the node would be clicked. This was due to the fact initially the code assumed leafes in the tree would always be "tasks" and never "files". --- .../main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt b/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt index 6bb8db64..7f4da680 100644 --- a/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt +++ b/rider/src/main/kotlin/net/cakebuild/toolwindow/CakeTasksWindow.kt @@ -92,7 +92,10 @@ class CakeTasksWindow(private val project: Project) : SimpleToolWindowPanel(true private fun getSelectedTask(): CakeProject.CakeTask? { val selected = tree.getSelectedNodes(DefaultMutableTreeNode::class.java) { it.isLeaf }.firstOrNull() ?: return null - return selected.userObject as CakeProject.CakeTask + return when (selected.userObject) { + is CakeProject.CakeTask -> selected.userObject as CakeProject.CakeTask + else -> null + } } fun isTaskSelected(): Boolean { From c0ac193475e701f371a6568d66690feb09fe8e2d Mon Sep 17 00:00:00 2001 From: Nils Andresen Date: Wed, 13 Jan 2021 23:47:36 +0100 Subject: [PATCH 18/18] (GH-31) (GH-42) added searchPaths and excludes a new settings page was introduced: "Search paths". This page contains two settings: The search paths to start the search for Cake files and excludes for paths that should not be searched. Default search paths is ["."], which correlates to the "old" functionality. Default exclude is [".*/tools/.*"] to exclude the tools folder and thereby excluding Cake files that were added from NuGet packages. --- README.md | 14 ++- images/searchPathsSettings.png | Bin 0 -> 29594 bytes rider/detekt-config.yml | 2 + .../CakeSearchPathSettingsEditor.form | 57 +++++++++++ .../CakeSearchPathSettingsEditor.java | 46 +++++++++ .../controls/SimpleAddEditControl.form | 67 +++++++++++++ .../controls/SimpleAddEditControl.java | 90 ++++++++++++++++++ .../CakeSearchPathSettingsConfigurable.kt | 49 ++++++++++ .../net/cakebuild/settings/CakeSettings.kt | 2 + .../net/cakebuild/shared/CakeProject.kt | 65 ++++++++++++- rider/src/main/resources/META-INF/plugin.xml | 2 + 11 files changed, 388 insertions(+), 6 deletions(-) create mode 100644 images/searchPathsSettings.png create mode 100644 rider/src/main/java/net/cakebuild/settings/CakeSearchPathSettingsEditor.form create mode 100644 rider/src/main/java/net/cakebuild/settings/CakeSearchPathSettingsEditor.java create mode 100644 rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.form create mode 100644 rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.java create mode 100644 rider/src/main/kotlin/net/cakebuild/settings/CakeSearchPathSettingsConfigurable.kt diff --git a/README.md b/README.md index b846e273..f0d471a2 100644 --- a/README.md +++ b/README.md @@ -39,13 +39,25 @@ The full documentation of the latest release of Cake for Rider can be found at [ Files with the extension `.cake` have the Cake logo as file icons now. - #### Custom arguments in run configurations A new setting has been added to run configuration: *Arguments*. It can be used to supply custom arguments when running that configuration. ![arguments](./images/runConfiguration-editor.png) +#### Search path and excludes + +The search path for where Cake files are searched to populate the Cake Tasks Window are now +configurable. Additionally excludes can be defined. + +The Paths are relative to the project root and should use "/" as separator between directories. +(e.g.`../build`.) Default is `.`. + +Excludes are regular expressions that each path is match against. Paths that match one of the expressions will be excluded. +Default: `.*/tools/.*`. + +![Search paths settings](./images/searchPathsSettings.png) + ## Discussion If you have questions, search for an existing one, or create a new discussion on the Cake GitHub repository. diff --git a/images/searchPathsSettings.png b/images/searchPathsSettings.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3109e1683c2ed11250f73c9a5262748fc77c72 GIT binary patch literal 29594 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�MkANw{VR@LOGm1q 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 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/rider/src/main/java/net/cakebuild/settings/CakeSearchPathSettingsEditor.java b/rider/src/main/java/net/cakebuild/settings/CakeSearchPathSettingsEditor.java new file mode 100644 index 00000000..4de2f178 --- /dev/null +++ b/rider/src/main/java/net/cakebuild/settings/CakeSearchPathSettingsEditor.java @@ -0,0 +1,46 @@ +package net.cakebuild.settings; + +import net.cakebuild.settings.controls.SimpleAddEditControl; +import net.cakebuild.shared.ui.RegexCellEditor; +import org.jetbrains.annotations.NotNull; + +import javax.swing.*; +import java.util.Collection; + +public class CakeSearchPathSettingsEditor { + private JPanel content; + private JPanel searchPathsPanel; + private JPanel excludesPanel; + private SimpleAddEditControl mySearchPathsPanel; + private SimpleAddEditControl myExcludesPanel; + + public JPanel getContent() { return content; } + + public void setScriptSearchPaths(@NotNull Collection paths){ + mySearchPathsPanel.setData(paths); + } + + public Collection getScriptSearchPaths() { + return mySearchPathsPanel.getData(); + } + + public void setScriptSearchIgnores(@NotNull Collection expressions) { + myExcludesPanel.setData(expressions); + } + + public Collection getScriptSearchIgnores() { + return myExcludesPanel.getData(); + } + + private void createUIComponents() { + mySearchPathsPanel = new SimpleAddEditControl(new String[] { "Path" }, () -> new String[] { "" } ); + searchPathsPanel = mySearchPathsPanel.getContent(); + + myExcludesPanel = new SimpleAddEditControl(new String[] { "Exclude Regex" }, () -> new String[] { "" }); + excludesPanel = myExcludesPanel.getContent(); + RegexCellEditor regexCellEditor = new RegexCellEditor(); + regexCellEditor.setOnValidationError(s -> { myExcludesPanel.setValidationError(s); return null; }); + regexCellEditor.setOnValidationSuccess(() -> { myExcludesPanel.setValidationError(null); return null; }); + myExcludesPanel.setCellEditor(0, regexCellEditor); + } +} diff --git a/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.form b/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.form new file mode 100644 index 00000000..784f0f53 --- /dev/null +++ b/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.form @@ -0,0 +1,67 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.java b/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.java new file mode 100644 index 00000000..47a5a418 --- /dev/null +++ b/rider/src/main/java/net/cakebuild/settings/controls/SimpleAddEditControl.java @@ -0,0 +1,90 @@ +package net.cakebuild.settings.controls; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableCellEditor; +import javax.swing.table.TableColumnModel; +import java.awt.*; +import java.util.Collection; +import java.util.HashSet; +import java.util.function.Supplier; + +public class SimpleAddEditControl { + private JTable table; + private JButton addItem; + private JButton removeItem; + private JPanel panel; + private JLabel errorText; + private final DefaultTableModel model; + + public SimpleAddEditControl(String[] headers, Supplier newItemGenerator){ + model = (DefaultTableModel) table.getModel(); + for(int i = 0; i< headers.length; i++){ + model.addColumn("col"+i); + } + TableColumnModel columnModel = table.getColumnModel(); + for(int i = 0; i< headers.length; i++){ + columnModel.getColumn(i).setHeaderValue(headers[i]); + } + table.putClientProperty("terminateEditOnFocusLost", true); + table.setCellSelectionEnabled(false); + table.setRowSelectionAllowed(true); + table.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + table.getSelectionModel().addListSelectionListener(e -> { + int row = table.getSelectedRow(); + removeItem.setEnabled(row >= 0); + }); + addItem.addActionListener(e -> { + model.addRow(newItemGenerator.get()); + int row = model.getRowCount()-1; + table.editCellAt(row, 0); + table.changeSelection(row, 0, false, false); + TableCellEditor editor = table.getCellEditor(row, 0); + Component textEdit = table.prepareEditor(editor, row, 0); + textEdit.requestFocus(); + }); + removeItem.setEnabled(false); + removeItem.addActionListener(e -> { + int row = table.getSelectedRow(); + if(row < 0) { + return; + } + + model.removeRow(row); + }); + } + + public void setCellEditor(int columnIndex, TableCellEditor cellEditor){ + table.getColumnModel().getColumn(columnIndex).setCellEditor(cellEditor); + } + + public Collection getData() { + Collection items = new HashSet<>(); + int rows = model.getRowCount(); + for(int i =0; i < rows; i++) { + String item = (String)model.getValueAt(i, 0); + + items.add(item); + } + + return items; + } + + public void setData(Collection data) { + while (model.getRowCount() > 0){ + model.removeRow(0); + } + data.forEach(it -> model.addRow(new Object[]{ it })); + } + + public void setValidationError(String error) { + if(error == null) { + errorText.setText(""); + return; + } + + errorText.setText(error); + } + + public JPanel getContent() { return panel; } +} diff --git a/rider/src/main/kotlin/net/cakebuild/settings/CakeSearchPathSettingsConfigurable.kt b/rider/src/main/kotlin/net/cakebuild/settings/CakeSearchPathSettingsConfigurable.kt new file mode 100644 index 00000000..b4180c4d --- /dev/null +++ b/rider/src/main/kotlin/net/cakebuild/settings/CakeSearchPathSettingsConfigurable.kt @@ -0,0 +1,49 @@ +package net.cakebuild.settings + +import com.intellij.openapi.options.Configurable +import com.intellij.openapi.project.Project +import javax.swing.JComponent + +class CakeSearchPathSettingsConfigurable(private val project: Project) : Configurable { + private val editor = CakeSearchPathSettingsEditor() + + override fun createComponent(): JComponent? { + return editor.content + } + + override fun getDisplayName(): String { + return "Search Paths" + } + + override fun apply() { + val settings = CakeSettings.getInstance(project) + settings.cakeScriptSearchPaths = editor.scriptSearchPaths.toList() + settings.cakeScriptSearchIgnores = editor.scriptSearchIgnores.toList() + } + + override fun reset() { + val settings = CakeSettings.getInstance(project) + editor.scriptSearchPaths = settings.cakeScriptSearchPaths.toMutableList() + editor.scriptSearchIgnores = settings.cakeScriptSearchIgnores.toMutableList() + } + + override fun isModified(): Boolean { + val settings = CakeSettings.getInstance(project) + return isModified(editor.scriptSearchPaths, settings.cakeScriptSearchPaths) || + isModified(editor.scriptSearchIgnores, settings.cakeScriptSearchIgnores) + } + + private fun isModified(left: Collection, right: Collection): Boolean { + if (left.size != right.size) { + return true + } + + left.forEach { + if (!right.contains(it)) { + return true + } + } + + return false + } +} diff --git a/rider/src/main/kotlin/net/cakebuild/settings/CakeSettings.kt b/rider/src/main/kotlin/net/cakebuild/settings/CakeSettings.kt index 603bf817..e9d2b0d4 100644 --- a/rider/src/main/kotlin/net/cakebuild/settings/CakeSettings.kt +++ b/rider/src/main/kotlin/net/cakebuild/settings/CakeSettings.kt @@ -24,6 +24,8 @@ class CakeSettings : PersistentStateComponent { var cakeVerbosity = "normal" var cakeRunner = "dotnet-cake" var cakeRunnerOverrides = mapOf(Pair("^.*windows.*$", "dotnet-cake.exe")) + var cakeScriptSearchPaths: Collection = mutableListOf(".") + var cakeScriptSearchIgnores: Collection = mutableListOf(".*/tools/.*") override fun getState(): CakeSettings { return this diff --git a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt index de953745..c1dcc5b1 100644 --- a/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt +++ b/rider/src/main/kotlin/net/cakebuild/shared/CakeProject.kt @@ -8,8 +8,11 @@ import com.intellij.execution.executors.DefaultRunExecutor import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.project.guessProjectDir +import com.intellij.openapi.vfs.LocalFileSystem import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile +import com.jetbrains.rider.projectView.hasSolution +import com.jetbrains.rider.projectView.solutionDirectory import net.cakebuild.run.CakeConfiguration import net.cakebuild.run.CakeConfigurationType import net.cakebuild.settings.CakeSettings @@ -20,18 +23,70 @@ class CakeProject(private val project: Project) { private val log = Logger.getInstance(CakeProject::class.java) + private fun getProjectDir(): VirtualFile? { + var projectDir = project.guessProjectDir() + if (project.hasSolution) { + // projectDir is weird, if a solution is loaded (probably because + // guessProjectDir is intellij-code and does not know about rider and solutions) + projectDir = LocalFileSystem.getInstance().findFileByIoFile(project.solutionDirectory) + } + return projectDir + } + + private fun getSearchPaths(settings: CakeSettings, projectDir: VirtualFile): Collection { + return settings.cakeScriptSearchPaths.mapNotNull { + // VfsUtil.findRelativeFile does not work for "./foo" or "../foo" + val parts = it.split("/", "\\") + var path: VirtualFile? = projectDir + for (p in parts) { + if (path == null) { + break + } + if (p == ".") { + continue + } + if (p == "..") { + path = path.parent + continue + } + + val child = path.findChild(p) + path = if (child == null) { + log.warn("could not access $p as child of ${path.path}") + null + } else { + child + } + } + path + } + } + fun getCakeFiles() = sequence { - val extension = CakeSettings.getInstance(project).cakeFileExtension - val projectDir: VirtualFile? = project.guessProjectDir() - val bucket = Stack() + val settings = CakeSettings.getInstance(project) + val extension = settings.cakeFileExtension + val projectDir = getProjectDir() if (projectDir == null) { + log.warn("Unable to find a folder to search for cake files.") return@sequence } - bucket.add(projectDir) + val searchPaths = getSearchPaths(settings, projectDir) + val bucket = Stack() + bucket.addAll(searchPaths) + val excludePatterns = settings.cakeScriptSearchIgnores.map { + Regex(it) + } while (!bucket.isEmpty()) { val folder = bucket.pop() log.trace("searching for *.$extension in folder ${folder.path}") - for (child in folder.children) { + children@ for (child in folder.children) { + val normalizedPath = child.path.replace("\\", "/") + for (exclude in excludePatterns) { + if (normalizedPath.matches(exclude)) { + log.trace("$normalizedPath excluded by pattern ${exclude.pattern}") + continue@children + } + } if (child.isDirectory) { bucket.push(child) continue diff --git a/rider/src/main/resources/META-INF/plugin.xml b/rider/src/main/resources/META-INF/plugin.xml index e9eb6437..5610f82c 100644 --- a/rider/src/main/resources/META-INF/plugin.xml +++ b/rider/src/main/resources/META-INF/plugin.xml @@ -14,6 +14,8 @@ +