Skip to content

Commit f221e26

Browse files
fix: error when updating ruleset without bypass actors (#2824)
Co-authored-by: Nick Floyd <[email protected]>
1 parent ab27574 commit f221e26

File tree

2 files changed

+96
-2
lines changed

2 files changed

+96
-2
lines changed

github/resource_github_repository_ruleset.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -680,11 +680,16 @@ func resourceGithubRepositoryRulesetUpdate(d *schema.ResourceData, meta interfac
680680

681681
ctx := context.WithValue(context.Background(), ctxId, rulesetID)
682682

683-
// Use UpdateRulesetNoBypassActor here instead of UpdateRuleset.
683+
var ruleset *github.Ruleset
684+
// Use UpdateRulesetNoBypassActor here instead of UpdateRuleset *if* bypass_actors has changed.
684685
// UpdateRuleset uses `omitempty` on BypassActors, causing empty arrays to be omitted from the JSON.
685686
// UpdateRulesetNoBypassActor always includes the field so that bypass actors can actually be removed.
686687
// See: https://github.com/google/go-github/blob/b6248e6f6aec019e75ba2c8e189bfe89f36b7d01/github/repos_rules.go#L196
687-
ruleset, _, err := client.Repositories.UpdateRulesetNoBypassActor(ctx, owner, repoName, rulesetID, rulesetReq)
688+
if d.HasChange("bypass_actors") {
689+
ruleset, _, err = client.Repositories.UpdateRulesetNoBypassActor(ctx, owner, repoName, rulesetID, rulesetReq)
690+
} else {
691+
ruleset, _, err = client.Repositories.UpdateRuleset(ctx, owner, repoName, rulesetID, rulesetReq)
692+
}
688693
if err != nil {
689694
return err
690695
}

github/resource_github_repository_ruleset_test.go

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,95 @@ func TestGithubRepositoryRulesets(t *testing.T) {
675675

676676
})
677677

678+
t.Run("Updates ruleset without bypass actors defined", func(t *testing.T) {
679+
680+
config := fmt.Sprintf(`
681+
resource "github_repository" "test" {
682+
name = "tf-acc-test-no-bypass-%s"
683+
description = "Terraform acceptance tests %[1]s"
684+
auto_init = true
685+
}
686+
687+
resource "github_repository_ruleset" "test" {
688+
name = "test-no-bypass"
689+
repository = github_repository.test.id
690+
target = "branch"
691+
enforcement = "active"
692+
693+
conditions {
694+
ref_name {
695+
include = ["~ALL"]
696+
exclude = []
697+
}
698+
}
699+
700+
rules {
701+
deletion = true
702+
}
703+
}
704+
`, randomID)
705+
706+
configUpdated := strings.Replace(
707+
config,
708+
"deletion = true",
709+
"deletion = false",
710+
1,
711+
)
712+
713+
checks := map[string]resource.TestCheckFunc{
714+
"before": resource.ComposeTestCheckFunc(
715+
resource.TestCheckResourceAttr(
716+
"github_repository_ruleset.test", "rules.0.deletion",
717+
"true",
718+
),
719+
resource.TestCheckResourceAttr(
720+
"github_repository_ruleset.test", "bypass_actors.#",
721+
"0",
722+
),
723+
),
724+
"after": resource.ComposeTestCheckFunc(
725+
resource.TestCheckResourceAttr(
726+
"github_repository_ruleset.test", "rules.0.deletion",
727+
"false",
728+
),
729+
resource.TestCheckResourceAttr(
730+
"github_repository_ruleset.test", "bypass_actors.#",
731+
"0",
732+
),
733+
),
734+
}
735+
736+
testCase := func(t *testing.T, mode string) {
737+
resource.Test(t, resource.TestCase{
738+
PreCheck: func() { skipUnlessMode(t, mode) },
739+
Providers: testAccProviders,
740+
Steps: []resource.TestStep{
741+
{
742+
Config: config,
743+
Check: checks["before"],
744+
},
745+
{
746+
Config: configUpdated,
747+
Check: checks["after"],
748+
},
749+
},
750+
})
751+
}
752+
753+
t.Run("with an anonymous account", func(t *testing.T) {
754+
t.Skip("anonymous account not supported for this operation")
755+
})
756+
757+
t.Run("with an individual account", func(t *testing.T) {
758+
testCase(t, individual)
759+
})
760+
761+
t.Run("with an organization account", func(t *testing.T) {
762+
testCase(t, organization)
763+
})
764+
765+
})
766+
678767
t.Run("Creates repository ruleset with all bypass_modes", func(t *testing.T) {
679768

680769
config := fmt.Sprintf(`

0 commit comments

Comments
 (0)