11package com.dashwave.plugin
22
3+ import com.dashwave.plugin.actions.BuildAction
34import com.dashwave.plugin.dialogbox.CreateProjectDialog
5+ import com.dashwave.plugin.dialogbox.GitNotConfiguredDialog
46import com.dashwave.plugin.dialogbox.ReadyForBuildDialog
57import com.dashwave.plugin.messages.Messages
8+ import com.dashwave.plugin.notif.BalloonNotif
69import com.dashwave.plugin.utils.DwCmds
710import com.dashwave.plugin.utils.Process
811import com.dashwave.plugin.windows.DashwaveWindow
912import com.intellij.execution.filters.HyperlinkInfo
1013import com.intellij.execution.ui.ConsoleViewContentType
1114import com.intellij.notification.*
15+ import com.intellij.openapi.application.ApplicationManager
1216import com.intellij.openapi.editor.markup.TextAttributes
1317import com.intellij.openapi.project.Project
1418import com.intellij.openapi.startup.StartupActivity
1519import com.intellij.openapi.ui.DialogWrapper
1620import kotlinx.serialization.json.*
21+ import com.intellij.openapi.wm.ToolWindowManager
1722import java.awt.Color
1823import java.io.File
1924import java.io.IOException
2025import okhttp3.OkHttpClient
2126import okhttp3.Request
27+ import com.intellij.openapi.actionSystem.ActionManager
28+ import com.intellij.openapi.actionSystem.Anchor
29+ import com.intellij.openapi.actionSystem.Constraints
30+ import com.intellij.openapi.actionSystem.DefaultActionGroup
31+ import io.ktor.util.*
2232import java.awt.Font
2333
2434class PluginStartup : StartupActivity {
35+ companion object {
36+ var dwWindows: HashMap <String , DashwaveWindow > = HashMap ()
37+ }
2538
2639 override fun runActivity (project : Project ) {
27- DashwaveWindow .p = project
28- DashwaveWindow .show()
29- checkDW(project)
40+ val dwWindow = DashwaveWindow (project)
41+ dwWindow.show()
42+ dwWindows[project.name] = dwWindow
43+ checkDW(project, dwWindow)
3044 }
3145}
3246
33- fun checkDW (project : Project ) {
34- val dwCmd = DwCmds (" check-update" , " " , true )
47+ fun checkDW (project : Project , dwWindow : DashwaveWindow ) {
48+ val dwCmd = DwCmds (" check-update" , project.basePath , true , dwWindow )
3549 val exitCode = dwCmd.executeWithExitCode()
3650 if (exitCode == 0 ) {
37- DashwaveWindow .displayInfo(Messages .DW_INSTALLED_ALREADY )
38- verifyLogin(project?.basePath)
51+ dwWindow .displayInfo(Messages .DW_INSTALLED_ALREADY )
52+ verifyLogin(project?.basePath, dwWindow )
3953 }else if (exitCode == 11 ){
4054 }else {
41- DashwaveWindow .displayInfo(Messages .DW_NOT_INSTALLED )
55+ dwWindow .displayInfo(Messages .DW_NOT_INSTALLED )
4256 showInstallDW(project)
43- installDW(project?.basePath)
57+ installDW(project?.basePath, dwWindow )
4458 }
4559}
4660
@@ -55,61 +69,76 @@ fun showInstallDW(project: Project){
5569 notification.notify(project)
5670}
5771
58- fun installDW (pwd : String? ){
59- DashwaveWindow .displayOutput(" 🔨 Setting up plugin...\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
72+ fun installDW (pwd : String? , dwWindow : DashwaveWindow ){
73+ dwWindow .displayOutput(" 🔨 Setting up plugin...\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
6074
6175 // Execute the script
62- val process = Process (" curl -sSL https://cli.dashwave.io | bash" , pwd, true )
76+ val process = Process (" curl -sSL https://cli.dashwave.io | bash" , pwd, true , dwWindow )
6377 process.start(false )
6478 Thread {
6579 val exitCode = process.wait()
6680 if (exitCode == 0 ) {
67- DashwaveWindow .displayInfo(Messages .DW_DEPS_INSTALL_SUCCESS )
68- DashwaveWindow .displayInfo(Messages .DW_DEPS_CONFIGURING )
69- val configCmd = DwCmds (" config" , pwd, true )
81+ dwWindow .displayInfo(Messages .DW_DEPS_INSTALL_SUCCESS )
82+ dwWindow .displayInfo(Messages .DW_DEPS_CONFIGURING )
83+ val configCmd = DwCmds (" config" , pwd, true , dwWindow )
7084 val exitcode = configCmd.executeWithExitCode()
7185 if (exitcode == 0 ){
72- DashwaveWindow .displayInfo(Messages .DW_DEPS_CONFIGURE_SUCCESS )
73- verifyLogin(pwd)
86+ dwWindow .displayInfo(Messages .DW_DEPS_CONFIGURE_SUCCESS )
87+ verifyLogin(pwd, dwWindow )
7488 }else {
75- DashwaveWindow .displayError(Messages .DW_DEPS_CONFIGURE_FAILED )
89+ dwWindow .displayError(Messages .DW_DEPS_CONFIGURE_FAILED )
7690 }
7791 } else {
78- DashwaveWindow .displayError(Messages .DW_DEPS_INSTALL_FAILED )
92+ dwWindow .displayError(Messages .DW_DEPS_INSTALL_FAILED )
7993 }
8094 }.start()
8195}
8296
83- fun verifyLogin (pwd : String? ){
84- listUsers(pwd)
85- DashwaveWindow .addModulesAndVariants(HashMap <String ,List <String >>(), " " , " " )
86- val currentUserLoginCmd = DwCmds (" user" , " " , true )
97+ fun verifyLogin (pwd : String? , dwWindow : DashwaveWindow ){
98+ listUsers(pwd, dwWindow )
99+ dwWindow .addModulesAndVariants(HashMap <String ,List <String >>(), " " , " " )
100+ val currentUserLoginCmd = DwCmds (" user" , pwd , true , dwWindow )
87101 val exitCode = currentUserLoginCmd.executeWithExitCode()
88102 if (exitCode == 0 ){
89- DashwaveWindow .enableRunButton()
90- checkProjectConnected(pwd)
103+ dwWindow .enableRunButton()
104+ checkProjectConnected(pwd, dwWindow )
91105 }else {
92- loginUser(pwd)
106+ loginUser(pwd, dwWindow )
93107 }
94108}
95109
96- fun checkProjectConnected (pwd : String? ){
97- listUsers(pwd)
98- if (doesFileExist(" $pwd /dashwave.yml" )){
99- DashwaveWindow .enableRunButton()
110+ fun checkProjectConnected (pwd : String? , dwWindow : DashwaveWindow ){
111+ listUsers(pwd, dwWindow)
112+ // check if .git folder exists
113+ val gitConfigFilepath = " $pwd /.git"
114+ if (! doesFileExist(gitConfigFilepath)){
115+ dwWindow.displayOutput(" ❌ ${Messages .GIT_NOT_CONFIGURED } " , ConsoleViewContentType .ERROR_OUTPUT )
116+ val notif = BalloonNotif (
117+ " Could not find .git folder" ,
118+ " " ,
119+ " This is not a git repository, initialise git and push codebase to proceed " ,
120+ NotificationType .ERROR ,
121+ ){}
122+ notif.show(dwWindow.p)
100123
101- listModulesAndVariants(pwd)
124+ val dialog = GitNotConfiguredDialog ()
125+ dialog.show()
126+ return
127+ }
102128
103- DashwaveWindow .displayOutput(" ✅ Project is successfully connected to dashwave. Run a cloud build using dashwave icon on toolbar\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
129+ if (doesFileExist(" $pwd /dashwave.yml" )){
130+ dwWindow.enableRunButton()
131+ listModulesAndVariants(pwd, dwWindow)
132+ dwWindow.displayOutput(" ✅ Project is successfully connected to dashwave. Run a cloud build using dashwave icon on toolbar\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
104133 val dd = ReadyForBuildDialog ()
105134 dd.show()
106135 }else {
107- DashwaveWindow .displayOutput(" ⚠️ This project is not connected to dashwave, create a new project on dashwave\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
108- openCreateProjectDialog(pwd, true )
136+ dwWindow .displayOutput(" ⚠️ This project is not connected to dashwave, create a new project on dashwave\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
137+ openCreateProjectDialog(pwd, true , dwWindow){}
109138 }
110139}
111140
112- fun loginUser (pwd : String? ) {
141+ fun loginUser (pwd : String? , dwWindow : DashwaveWindow ) {
113142 val loginDialog = LoginDialog ()
114143 var accessCode: String = " "
115144
@@ -123,14 +152,15 @@ fun loginUser(pwd:String?) {
123152 }
124153
125154 val loginUserCmd = " login $accessCode "
126- val exitCode = DwCmds (loginUserCmd, " " , true ).executeWithExitCode()
155+ val exitCode = DwCmds (loginUserCmd, pwd , true , dwWindow ).executeWithExitCode()
127156 if (exitCode == 0 ) {
128- checkProjectConnected(pwd)
157+ dwWindow.enableRunButton()
158+ checkProjectConnected(pwd, dwWindow)
129159 }else {
130160 var hyperlink = HyperlinkInfo { p: Project ->
131- loginUser(pwd)
161+ loginUser(pwd, dwWindow )
132162 }
133- DashwaveWindow .console.printHyperlink(Messages .DW_LOGIN_FAILED , hyperlink)
163+ dwWindow .console.printHyperlink(Messages .DW_LOGIN_FAILED , hyperlink)
134164 }
135165}
136166
@@ -139,11 +169,11 @@ fun doesFileExist(path: String): Boolean {
139169 return file.exists()
140170}
141171
142- fun listUsers (pwd : String? ){
143- val usersCmd = DwCmds (" user ls" , pwd, false )
172+ fun listUsers (pwd : String? , dwWindow : DashwaveWindow ){
173+ val usersCmd = DwCmds (" user ls" , pwd, false , dwWindow )
144174 val cmdOutput = usersCmd.executeWithOutput()
145175 if (cmdOutput.first != 0 ){
146- DashwaveWindow .displayError(" ❌ Could not find logged in users\n " + cmdOutput.second)
176+ dwWindow .displayError(" ❌ Could not find logged in users\n " + cmdOutput.second)
147177 return
148178 }
149179 val jsonText = cmdOutput.second.trim()
@@ -154,13 +184,13 @@ fun listUsers(pwd: String?){
154184 val users = jsonObject[" users" ]?.jsonArray?.mapNotNull { it.jsonPrimitive.contentOrNull }
155185 val activeUser = jsonObject[" active_user" ]?.toString()
156186
157- DashwaveWindow .addUsers(users, activeUser? : " " ,pwd)
187+ dwWindow .addUsers(users, activeUser? : " " ,pwd)
158188}
159- fun listModulesAndVariants (pwd : String? ) {
160- val configsCmd = DwCmds (" build configs" , pwd, false )
189+ fun listModulesAndVariants (pwd : String? , dwWindow : DashwaveWindow ) {
190+ val configsCmd = DwCmds (" build configs" , pwd, false , dwWindow )
161191 var cmdOutput = configsCmd.executeWithOutput()
162192 if (cmdOutput.first != 0 ){
163- DashwaveWindow .displayError(" ❌ Could not find modules and in variants\n " + cmdOutput.second)
193+ dwWindow .displayError(" ❌ Could not find modules and in variants\n " + cmdOutput.second)
164194 return
165195 }
166196 val jsonText = cmdOutput.second.trim()
@@ -191,34 +221,40 @@ fun listModulesAndVariants(pwd:String?) {
191221 }
192222 }
193223
194- DashwaveWindow .addModulesAndVariants(map, defaultModule, defaultVariant)
224+ dwWindow .addModulesAndVariants(map, defaultModule, defaultVariant)
195225}
196226
197- fun openCreateProjectDialog (pwd : String? , openTip : Boolean ):Boolean {
198- val createProjectDialog = CreateProjectDialog ()
199- if (createProjectDialog.showAndGet()){
200- val projectName = createProjectDialog.getProjectName()
201- val rootDir = createProjectDialog.getRootDir()
202- val techStack = createProjectDialog.getSelectedTechStack()
203- val success = createProject(projectName, techStack, rootDir,pwd, openTip)
204- return success
205- }
206- DashwaveWindow .show()
207- val yellowOutput = ConsoleViewContentType (" YellowOutput" , TextAttributes (Color .YELLOW , null ,null , null , Font .PLAIN ))
208- DashwaveWindow .displayOutput(" ⚠️ You must create a new project to be able to run builds on dashwave\n\n " , yellowOutput)
209- var hyperlink = HyperlinkInfo { p: Project ->
210- openCreateProjectDialog(pwd, openTip)
227+ fun openCreateProjectDialog (pwd : String? , openTip : Boolean , dwWindow : DashwaveWindow ,buildAction : ()-> Unit ){
228+ ApplicationManager .getApplication().invokeLater{
229+ val createProjectDialog = CreateProjectDialog (dwWindow.p)
230+ if (createProjectDialog.showAndGet()){
231+ val projectName = createProjectDialog.getProjectName()
232+ val rootDir = createProjectDialog.getRootDir()
233+ val techStack = createProjectDialog.getSelectedTechStack()
234+ val success = createProject(projectName, techStack, rootDir,pwd, openTip, dwWindow)
235+ if (success){
236+ buildAction()
237+ }
238+ }else {
239+ // dwWindow.show()
240+ dwWindow.enableRunButton()
241+ dwWindow.disableCancelButton()
242+ val yellowOutput = ConsoleViewContentType (" YellowOutput" , TextAttributes (Color .YELLOW , null ,null , null , Font .PLAIN ))
243+ dwWindow.displayOutput(" ⚠️ You must create a new project to be able to run builds on dashwave\n\n " , yellowOutput)
244+ var hyperlink = HyperlinkInfo { p: Project ->
245+ openCreateProjectDialog(pwd, openTip, dwWindow,buildAction)
246+ }
247+ dwWindow.console.printHyperlink(" Click here" , hyperlink)
248+ dwWindow.displayOutput(" to create a new dashwave project\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
249+ }
211250 }
212- DashwaveWindow .console.printHyperlink(" Click here" , hyperlink)
213- DashwaveWindow .displayOutput(" to create a new dashwave project\n\n " , ConsoleViewContentType .NORMAL_OUTPUT )
214- return false
215251}
216252
217- fun createProject (projectName : String , devStack : String , rootDir : String ,pwd : String? , openTip : Boolean ) :Boolean {
253+ fun createProject (projectName : String , devStack : String , rootDir : String ,pwd : String? , openTip : Boolean , dwWindow : DashwaveWindow ) :Boolean {
218254 val createProjectCmd = " create-project --no-prompt --name=$projectName --dev-stack=$devStack --root-dir=$rootDir "
219- val exitCode = DwCmds (createProjectCmd, pwd, true ).executeWithExitCode()
255+ val exitCode = DwCmds (createProjectCmd, pwd, true , dwWindow ).executeWithExitCode()
220256 if (exitCode == 0 ){
221- DashwaveWindow .enableRunButton()
257+ dwWindow .enableRunButton()
222258 Notifications .Bus .notify(
223259 Notification (
224260 " YourPluginNotificationGroup" ,
@@ -227,19 +263,26 @@ fun createProject(projectName: String, devStack:String, rootDir:String,pwd:Strin
227263 NotificationType .INFORMATION
228264 )
229265 )
230- DashwaveWindow .show()
231- DashwaveWindow .displayInfo(Messages .PROJECT_CONNECTION_SUCCESS )
266+ // dwWindow .show()
267+ dwWindow .displayInfo(Messages .PROJECT_CONNECTION_SUCCESS )
232268
233269 if (openTip) {
234270 val dd = ReadyForBuildDialog ()
235271 dd.show()
236272 }
237273 return true
238274 }
239- DashwaveWindow .displayError(Messages .PROJECT_CONNECTION_FAILED )
275+ dwWindow.displayError(Messages .PROJECT_CONNECTION_FAILED )
276+ if (exitCode == 13 ){
277+ var hyperlink = HyperlinkInfo { p: Project ->
278+ loginUser(pwd, dwWindow)
279+ }
280+ dwWindow.console.printHyperlink(" Login here\n\n " , hyperlink)
281+ return false
282+ }
240283 var hyperlink = HyperlinkInfo { p: Project ->
241- openCreateProjectDialog(pwd, openTip)
284+ openCreateProjectDialog(pwd, openTip, dwWindow){}
242285 }
243- DashwaveWindow .console.printHyperlink(" Please try again\n\n " , hyperlink)
286+ dwWindow .console.printHyperlink(" Please try again\n\n " , hyperlink)
244287 return false
245288}
0 commit comments