66 "digger/pkg/terraform"
77 "digger/pkg/utils"
88 "encoding/json"
9+ "errors"
910 "fmt"
1011 "log"
1112 "os"
@@ -58,6 +59,7 @@ func RunCommandsPerProject(commandsPerProject []ProjectCommand, repoOwner string
5859 }
5960 diggerExecutor := DiggerExecutor {
6061 workingDir ,
62+ projectCommands .ProjectWorkspace ,
6163 repoOwner ,
6264 projectCommands .ProjectName ,
6365 projectCommands .ProjectDir ,
@@ -99,9 +101,10 @@ func GetGitHubContext(ghContext string) (*models.Github, error) {
99101}
100102
101103type ProjectCommand struct {
102- ProjectName string
103- ProjectDir string
104- Commands []string
104+ ProjectName string
105+ ProjectDir string
106+ ProjectWorkspace string
107+ Commands []string
105108}
106109
107110func ConvertGithubEventToCommands (event models.Event , impactedProjects []Project ) ([]ProjectCommand , error ) {
@@ -113,21 +116,24 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
113116 for _ , project := range impactedProjects {
114117 if event .Action == "closed" && event .PullRequest .Merged && event .PullRequest .Base .Ref == event .Repository .DefaultBranch {
115118 commandsPerProject = append (commandsPerProject , ProjectCommand {
116- ProjectName : project .Name ,
117- ProjectDir : project .Dir ,
118- Commands : project .WorkflowConfiguration .OnCommitToDefault ,
119+ ProjectName : project .Name ,
120+ ProjectDir : project .Dir ,
121+ ProjectWorkspace : project .Workspace ,
122+ Commands : project .WorkflowConfiguration .OnCommitToDefault ,
119123 })
120124 } else if event .Action == "opened" || event .Action == "reopened" || event .Action == "synchronize" {
121125 commandsPerProject = append (commandsPerProject , ProjectCommand {
122- ProjectName : project .Name ,
123- ProjectDir : project .Dir ,
124- Commands : project .WorkflowConfiguration .OnPullRequestPushed ,
126+ ProjectName : project .Name ,
127+ ProjectDir : project .Dir ,
128+ ProjectWorkspace : project .Workspace ,
129+ Commands : project .WorkflowConfiguration .OnPullRequestPushed ,
125130 })
126131 } else if event .Action == "closed" {
127132 commandsPerProject = append (commandsPerProject , ProjectCommand {
128- ProjectName : project .Name ,
129- ProjectDir : project .Dir ,
130- Commands : project .WorkflowConfiguration .OnPullRequestClosed ,
133+ ProjectName : project .Name ,
134+ ProjectDir : project .Dir ,
135+ ProjectWorkspace : project .Workspace ,
136+ Commands : project .WorkflowConfiguration .OnPullRequestClosed ,
131137 })
132138 }
133139 }
@@ -139,10 +145,19 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
139145 for _ , command := range supportedCommands {
140146 if strings .Contains (event .Comment .Body , command ) {
141147 for _ , project := range impactedProjects {
148+ workspace := project .Workspace
149+ workspaceOverride , err := parseWorkspace (event .Comment .Body )
150+ if err != nil {
151+ return []ProjectCommand {}, err
152+ }
153+ if workspaceOverride != "" {
154+ workspace = workspaceOverride
155+ }
142156 commandsPerProject = append (commandsPerProject , ProjectCommand {
143- ProjectName : project .Name ,
144- ProjectDir : project .Dir ,
145- Commands : []string {command },
157+ ProjectName : project .Name ,
158+ ProjectDir : project .Dir ,
159+ ProjectWorkspace : workspace ,
160+ Commands : []string {command },
146161 })
147162 }
148163 }
@@ -153,6 +168,25 @@ func ConvertGithubEventToCommands(event models.Event, impactedProjects []Project
153168 }
154169}
155170
171+ func parseWorkspace (comment string ) (string , error ) {
172+ re := regexp .MustCompile (`-w(?:\s+(\S+)|$)` )
173+ matches := re .FindAllStringSubmatch (comment , - 1 )
174+
175+ if len (matches ) == 0 {
176+ return "" , nil
177+ }
178+
179+ if len (matches ) > 1 {
180+ return "" , errors .New ("more than one -w flag found" )
181+ }
182+
183+ if len (matches [0 ]) < 2 || matches [0 ][1 ] == "" {
184+ return "" , errors .New ("no value found after -w flag" )
185+ }
186+
187+ return matches [0 ][1 ], nil
188+ }
189+
156190func parseProjectName (comment string ) string {
157191 re := regexp .MustCompile (`-p ([a-zA-Z\-]+)` )
158192 match := re .FindStringSubmatch (comment )
@@ -164,6 +198,7 @@ func parseProjectName(comment string) string {
164198
165199type DiggerExecutor struct {
166200 workingDir string
201+ workspace string
167202 repoOwner string
168203 projectName string
169204 projectDir string
@@ -179,7 +214,7 @@ func (d DiggerExecutor) LockId() string {
179214
180215func (d DiggerExecutor ) Plan (prNumber int ) {
181216
182- terraformExecutor := terraform.Terraform {WorkingDir : path .Join (d .workingDir , d .projectDir )}
217+ terraformExecutor := terraform.Terraform {WorkingDir : path .Join (d .workingDir , d .projectDir ), Workspace : d . workspace }
183218
184219 res , err := d .lock .Lock (d .LockId (), prNumber )
185220 if err != nil {
@@ -199,7 +234,7 @@ func (d DiggerExecutor) Plan(prNumber int) {
199234}
200235
201236func (d DiggerExecutor ) Apply (prNumber int ) {
202- terraformExecutor := terraform.Terraform {WorkingDir : path .Join (d .workingDir , d .projectDir )}
237+ terraformExecutor := terraform.Terraform {WorkingDir : path .Join (d .workingDir , d .projectDir ), Workspace : d . workspace }
203238 if res , _ := d .lock .Lock (d .LockId (), prNumber ); res {
204239 stdout , stderr , err := terraformExecutor .Apply ()
205240 applyOutput := cleanupTerraformApply (true , err , stdout , stderr )
0 commit comments