Skip to content

Commit b7a49b7

Browse files
authored
Merge pull request #138 from DrFaust92/inheritance
repository - add support for `inherit_default_merge_strategy` and `inherit_branching_model`
2 parents ce3870a + c807c3e commit b7a49b7

File tree

3 files changed

+237
-52
lines changed

3 files changed

+237
-52
lines changed

bitbucket/resource_repository.go

Lines changed: 159 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package bitbucket
22

33
import (
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+
135153
func 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

232307
func 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

Comments
 (0)