diff --git a/github/migrate_github_branch_protection.go b/github/migrate_github_branch_protection.go index 02c537a5a5..f54957f23a 100644 --- a/github/migrate_github_branch_protection.go +++ b/github/migrate_github_branch_protection.go @@ -27,7 +27,7 @@ func resourceGithubBranchProtectionUpgradeV0(rawState map[string]interface{}, me } branch := rawState["branch"].(string) - protectionRuleID, err := getBranchProtectionID(repoName, branch, meta) + protectionRuleID, err := getBranchProtectionID(repoID, branch, meta) if err != nil { return nil, err } diff --git a/github/resource_github_branch_protection.go b/github/resource_github_branch_protection.go index 21311a7973..63b7c2e56a 100644 --- a/github/resource_github_branch_protection.go +++ b/github/resource_github_branch_protection.go @@ -307,7 +307,7 @@ func resourceGithubBranchProtectionImport(d *schema.ResourceData, meta interface } d.Set("repository_id", repoID) - id, err := getBranchProtectionID(repoName, pattern, meta) + id, err := getBranchProtectionID(repoID, pattern, meta) if err != nil { return nil, err } diff --git a/github/resource_github_branch_protection_test.go b/github/resource_github_branch_protection_test.go index f6cbc1ed29..e56d2eadbc 100644 --- a/github/resource_github_branch_protection_test.go +++ b/github/resource_github_branch_protection_test.go @@ -62,7 +62,7 @@ func TestAccGithubBranchProtection(t *testing.T) { ResourceName: "github_branch_protection.test", ImportState: true, ImportStateVerify: true, - ImportStateIdFunc: branchProtectionImportStateIdFunc( + ImportStateIdFunc: importBranchProtectionByRepoName( fmt.Sprintf("tf-acc-test-%s", randomID), "main", ), }, @@ -122,6 +122,13 @@ func TestAccGithubBranchProtection(t *testing.T) { Config: config, Check: check, }, + { + ResourceName: "github_branch_protection.test", + ImportState: true, + ImportStateVerify: true, + ImportStateIdFunc: importBranchProtectionByRepoID( + "github_repository.test", "main"), + }, }, }) } @@ -322,8 +329,25 @@ func TestAccGithubBranchProtection(t *testing.T) { } -func branchProtectionImportStateIdFunc(repo, pattern string) resource.ImportStateIdFunc { +func importBranchProtectionByRepoName(repo, pattern string) resource.ImportStateIdFunc { + // test importing using an ID of the form : return func(s *terraform.State) (string, error) { return fmt.Sprintf("%s:%s", repo, pattern), nil } } + +func importBranchProtectionByRepoID(repoLogicalName, pattern string) resource.ImportStateIdFunc { + // test importing using an ID of the form : + // by retrieving the GraphQL ID from the terraform.State + return func(s *terraform.State) (string, error) { + repo := s.RootModule().Resources[repoLogicalName] + if repo == nil { + return "", fmt.Errorf("Cannot find %s in terraform state", repoLogicalName) + } + repoID, found := repo.Primary.Attributes["node_id"] + if !found { + return "", fmt.Errorf("Repository %s does not have a node_id in terraform state", repo.Primary.ID) + } + return fmt.Sprintf("%s:%s", repoID, pattern), nil + } +} diff --git a/github/util_v4_branch_protection.go b/github/util_v4_branch_protection.go index ad4f880fea..5e175c6d90 100644 --- a/github/util_v4_branch_protection.go +++ b/github/util_v4_branch_protection.go @@ -255,7 +255,7 @@ func setPushes(protection BranchProtectionRule) []string { return pushActors } -func getBranchProtectionID(name string, pattern string, meta interface{}) (githubv4.ID, error) { +func getBranchProtectionID(repoID githubv4.ID, pattern string, meta interface{}) (githubv4.ID, error) { var query struct { Node struct { Repository struct { @@ -268,11 +268,10 @@ func getBranchProtectionID(name string, pattern string, meta interface{}) (githu } `graphql:"branchProtectionRules(first: $first, after: $cursor)"` ID string } `graphql:"... on Repository"` - } `graphql:"repository(owner: $owner, name: $name)"` + } `graphql:"node(id: $id)"` } variables := map[string]interface{}{ - "owner": githubv4.String(meta.(*Owner).name), - "name": githubv4.String(name), + "id": repoID, "first": githubv4.Int(100), "cursor": (*githubv4.String)(nil), }