11package bitbucket
22
33import (
4+ "bytes"
45 "context"
6+ "encoding/json"
57 "fmt"
8+ "io"
69 "log"
710 "net/http"
811 "regexp"
@@ -128,10 +131,25 @@ func resourceRepository() *schema.Resource {
128131 },
129132 },
130133 },
134+ "inherit_default_merge_strategy" : {
135+ Type : schema .TypeBool ,
136+ Optional : true ,
137+ Computed : true ,
138+ },
139+ "inherit_branching_model" : {
140+ Type : schema .TypeBool ,
141+ Optional : true ,
142+ Computed : true ,
143+ },
131144 },
132145 }
133146}
134147
148+ type RepositoryInheritanceSettings struct {
149+ DefaultMergeStrategy * bool `json:"default_merge_strategy,omitempty"`
150+ BranchingModel * bool `json:"branching_model,omitempty"`
151+ }
152+
135153func newRepositoryFromResource (d * schema.ResourceData ) * bitbucket.Repository {
136154 repo := & bitbucket.Repository {
137155 Name : d .Get ("name" ).(string ),
@@ -162,31 +180,60 @@ func resourceRepositoryUpdate(ctx context.Context, d *schema.ResourceData, m int
162180 c := m .(Clients ).genClient
163181 repoApi := c .ApiClient .RepositoriesApi
164182 pipeApi := c .ApiClient .PipelinesApi
165-
166- repository := newRepositoryFromResource (d )
183+ client := m .(Clients ).httpClient
167184
168185 var repoSlug string
169186 repoSlug = d .Get ("slug" ).(string )
170187 if repoSlug == "" {
171188 repoSlug = d .Get ("name" ).(string )
172189 }
173190 repoSlug = computeSlug (repoSlug )
174- repoBody := & bitbucket.RepositoriesApiRepositoriesWorkspaceRepoSlugPutOpts {
175- Body : optional .NewInterface (repository ),
191+ workspace := d .Get ("owner" ).(string )
192+
193+ if d .HasChangesExcept ("pipelines_enabled" , "inherit_default_merge_strategy" , "inherit_branching_model" ) {
194+ repository := newRepositoryFromResource (d )
195+
196+ repoBody := & bitbucket.RepositoriesApiRepositoriesWorkspaceRepoSlugPutOpts {
197+ Body : optional .NewInterface (repository ),
198+ }
199+ _ , _ , err := repoApi .RepositoriesWorkspaceRepoSlugPut (c .AuthContext , repoSlug , workspace , repoBody )
200+ if err := handleClientError (err ); err != nil {
201+ return diag .FromErr (err )
202+ }
176203 }
177204
178- workspace := d .Get ("owner" ).(string )
179- _ , _ , err := repoApi .RepositoriesWorkspaceRepoSlugPut (c .AuthContext , repoSlug , workspace , repoBody )
180- if err := handleClientError (err ); err != nil {
181- return diag .FromErr (err )
205+ if d .HasChange ("pipelines_enabled" ) {
206+ // nolint:staticcheck
207+ if v , ok := d .GetOkExists ("pipelines_enabled" ); ok {
208+ pipelinesConfig := & bitbucket.PipelinesConfig {Enabled : v .(bool )}
209+
210+ _ , _ , err := pipeApi .UpdateRepositoryPipelineConfig (c .AuthContext , * pipelinesConfig , workspace , repoSlug )
211+ if err := handleClientError (err ); err != nil {
212+ return diag .FromErr (err )
213+ }
214+ }
182215 }
183216
184- pipelinesEnabled := d . Get ( "pipelines_enabled" ).( bool )
185- pipelinesConfig := & bitbucket. PipelinesConfig { Enabled : pipelinesEnabled }
217+ if d . HasChanges ( "inherit_default_merge_strategy" , "inherit_branching_model" ) {
218+ setting := createRepositoryInheritanceSettings ( d )
186219
187- _ , _ , err = pipeApi .UpdateRepositoryPipelineConfig (c .AuthContext , * pipelinesConfig , workspace , repoSlug )
188- if err := handleClientError (err ); err != nil {
189- return diag .FromErr (err )
220+ log .Printf ("Repository Inheritance Settings update is: %#v" , setting )
221+
222+ payload , err := json .Marshal (setting )
223+ if err != nil {
224+ return diag .FromErr (err )
225+ }
226+
227+ log .Printf ("Repository Inheritance Settings update encoded is: %v" , string (payload ))
228+
229+ _ , err = client .Put (fmt .Sprintf ("2.0/repositories/%s/%s/override-settings" ,
230+ workspace ,
231+ repoSlug ,
232+ ), bytes .NewBuffer (payload ))
233+
234+ if err != nil {
235+ return diag .FromErr (err )
236+ }
190237 }
191238
192239 return resourceRepositoryRead (ctx , d , m )
@@ -196,6 +243,8 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, m int
196243 c := m .(Clients ).genClient
197244 repoApi := c .ApiClient .RepositoriesApi
198245 pipeApi := c .ApiClient .PipelinesApi
246+ client := m .(Clients ).httpClient
247+
199248 repo := newRepositoryFromResource (d )
200249
201250 var repoSlug string
@@ -218,41 +267,59 @@ func resourceRepositoryCreate(ctx context.Context, d *schema.ResourceData, m int
218267
219268 d .SetId (string (fmt .Sprintf ("%s/%s" , d .Get ("owner" ).(string ), repoSlug )))
220269
221- pipelinesEnabled := d .Get ("pipelines_enabled" ).(bool )
222- pipelinesConfig := & bitbucket.PipelinesConfig {Enabled : pipelinesEnabled }
270+ // nolint:staticcheck
271+ if v , ok := d .GetOkExists ("pipelines_enabled" ); ok {
272+ pipelinesConfig := & bitbucket.PipelinesConfig {Enabled : v .(bool )}
273+
274+ _ , _ , err = pipeApi .UpdateRepositoryPipelineConfig (c .AuthContext , * pipelinesConfig , workspace , repoSlug )
275+ if err := handleClientError (err ); err != nil {
276+ return diag .FromErr (err )
277+ }
278+ }
279+
280+ // nolint:staticcheck
281+ _ , branchOk := d .GetOkExists ("inherit_branching_model" )
282+ // nolint:staticcheck
283+ _ , mergeStratOk := d .GetOkExists ("inherit_default_merge_strategy" )
284+
285+ if mergeStratOk || branchOk {
286+ setting := createRepositoryInheritanceSettings (d )
287+
288+ payload , err := json .Marshal (setting )
289+ if err != nil {
290+ return diag .FromErr (err )
291+ }
292+
293+ _ , err = client .Put (fmt .Sprintf ("2.0/repositories/%s/%s/override-settings" ,
294+ workspace ,
295+ repoSlug ,
296+ ), bytes .NewBuffer (payload ))
297+
298+ if err != nil {
299+ return diag .FromErr (err )
300+ }
223301
224- _ , _ , err = pipeApi .UpdateRepositoryPipelineConfig (c .AuthContext , * pipelinesConfig , workspace , repoSlug )
225- if err := handleClientError (err ); err != nil {
226- return diag .FromErr (err )
227302 }
228303
229304 return resourceRepositoryRead (ctx , d , m )
230305}
231306
232307func resourceRepositoryRead (ctx context.Context , d * schema.ResourceData , m interface {}) diag.Diagnostics {
233- id := d .Id ()
234- if id != "" {
235- idparts := strings .Split (id , "/" )
236- if len (idparts ) == 2 {
237- d .Set ("owner" , idparts [0 ])
238- d .Set ("slug" , idparts [1 ])
239- } else {
240- return diag .Errorf ("incorrect ID format, should match `owner/slug`" )
241- }
308+ c := m .(Clients ).genClient
309+ repoApi := c .ApiClient .RepositoriesApi
310+ pipeApi := c .ApiClient .PipelinesApi
311+ client := m .(Clients ).httpClient
312+
313+ workspace , repoSlug , err := repositoryId (d .Id ())
314+ if err != nil {
315+ diag .FromErr (err )
242316 }
243317
244- var repoSlug string
245- repoSlug = d .Get ("slug" ).(string )
246318 if repoSlug == "" {
247319 repoSlug = d .Get ("name" ).(string )
248320 }
249321 repoSlug = computeSlug (repoSlug )
250322
251- workspace := d .Get ("owner" ).(string )
252- c := m .(Clients ).genClient
253- repoApi := c .ApiClient .RepositoriesApi
254- pipeApi := c .ApiClient .PipelinesApi
255-
256323 repoRes , res , err := repoApi .RepositoriesWorkspaceRepoSlugGet (c .AuthContext , repoSlug , workspace )
257324
258325 if res .StatusCode == http .StatusNotFound {
@@ -265,6 +332,7 @@ func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, m inter
265332 return diag .FromErr (err )
266333 }
267334
335+ d .Set ("owner" , workspace )
268336 d .Set ("scm" , repoRes .Scm )
269337 d .Set ("is_private" , repoRes .IsPrivate )
270338 d .Set ("has_wiki" , repoRes .HasWiki )
@@ -299,6 +367,34 @@ func resourceRepositoryRead(ctx context.Context, d *schema.ResourceData, m inter
299367 d .Set ("pipelines_enabled" , false )
300368 }
301369
370+ settingReq , err := client .Get (fmt .Sprintf ("2.0/repositories/%s/%s/override-settings" ,
371+ workspace ,
372+ repoSlug ,
373+ ))
374+
375+ if err != nil {
376+ return diag .FromErr (err )
377+ }
378+
379+ var setting RepositoryInheritanceSettings
380+
381+ body , readerr := io .ReadAll (settingReq .Body )
382+ if readerr != nil {
383+ return diag .FromErr (readerr )
384+ }
385+
386+ log .Printf ("Repository Inheritance Settings raw is: %#v" , string (body ))
387+
388+ decodeerr := json .Unmarshal (body , & setting )
389+ if decodeerr != nil {
390+ return diag .FromErr (decodeerr )
391+ }
392+
393+ log .Printf ("Repository Inheritance Settings decoded is: %#v" , setting )
394+
395+ d .Set ("inherit_default_merge_strategy" , setting .DefaultMergeStrategy )
396+ d .Set ("inherit_branching_model" , setting .BranchingModel )
397+
302398 return nil
303399}
304400
@@ -390,3 +486,32 @@ func flattenLink(rp *bitbucket.Link) []interface{} {
390486
391487 return []interface {}{m }
392488}
489+
490+ func createRepositoryInheritanceSettings (d * schema.ResourceData ) * RepositoryInheritanceSettings {
491+
492+ setting := & RepositoryInheritanceSettings {}
493+
494+ // nolint:staticcheck
495+ if v , ok := d .GetOkExists ("inherit_branching_model" ); ok {
496+ model := v .(bool )
497+ setting .BranchingModel = & model
498+ }
499+
500+ // nolint:staticcheck
501+ if v , ok := d .GetOkExists ("inherit_default_merge_strategy" ); ok {
502+ strat := v .(bool )
503+ setting .DefaultMergeStrategy = & strat
504+ }
505+
506+ return setting
507+ }
508+
509+ func repositoryId (id string ) (string , string , error ) {
510+ parts := strings .Split (id , "/" )
511+
512+ if len (parts ) != 2 {
513+ return "" , "" , fmt .Errorf ("unexpected format of ID (%q), expected WORKSPACE:REPO-SLUG" , id )
514+ }
515+
516+ return parts [0 ], parts [1 ], nil
517+ }
0 commit comments