diff --git a/github/resource_github_repository_file.go b/github/resource_github_repository_file.go index 0d29b8bf63..4c1bed306f 100644 --- a/github/resource_github_repository_file.go +++ b/github/resource_github_repository_file.go @@ -242,7 +242,7 @@ func resourceGithubRepositoryFileCreate(ctx context.Context, d *schema.ResourceD return diag.FromErr(err) } - newResourceID, err := buildID(repo, file, branch) + newResourceID, err := buildID(repo, escapeIDPart(file), branch) if err != nil { return diag.FromErr(err) } @@ -392,7 +392,7 @@ func resourceGithubRepositoryFileUpdate(ctx context.Context, d *schema.ResourceD } if d.HasChanges("repository", "file", "branch") { - newResourceID, err := buildID(repo, file, branch) + newResourceID, err := buildID(repo, escapeIDPart(file), branch) if err != nil { return diag.FromErr(err) } @@ -468,7 +468,7 @@ func resourceGithubRepositoryFileImport(ctx context.Context, d *schema.ResourceD return nil, err } - newResourceID, err := buildID(repo, filePath, branch) + newResourceID, err := buildID(repo, escapeIDPart(filePath), branch) if err != nil { return nil, err } diff --git a/github/resource_github_repository_file_test.go b/github/resource_github_repository_file_test.go index 57343b6dd8..ed778fcab2 100644 --- a/github/resource_github_repository_file_test.go +++ b/github/resource_github_repository_file_test.go @@ -8,6 +8,9 @@ import ( "github.com/hashicorp/terraform-plugin-testing/helper/acctest" "github.com/hashicorp/terraform-plugin-testing/helper/resource" + "github.com/hashicorp/terraform-plugin-testing/knownvalue" + "github.com/hashicorp/terraform-plugin-testing/statecheck" + "github.com/hashicorp/terraform-plugin-testing/tfjsonpath" ) func TestAccGithubRepositoryFile(t *testing.T) { @@ -455,4 +458,47 @@ func TestAccGithubRepositoryFile(t *testing.T) { }, }) }) + + t.Run("verify_that_id_can_contain_colon_in_file_path", func(t *testing.T) { + randomID := acctest.RandString(5) + repoName := fmt.Sprintf("%srepo-file-%s", testResourcePrefix, randomID) + filePathWithColon := "repro/example:one.yaml" + config := fmt.Sprintf(` + + resource "github_repository" "test" { + name = "%s" + auto_init = true + vulnerability_alerts = true + } + + resource "github_repository_file" "test" { + repository = github_repository.test.name + branch = "main" + file = "%s" + content = "bar" + commit_message = "Managed by Terraform" + commit_author = "Terraform User" + commit_email = "terraform@example.com" + } + `, repoName, filePathWithColon) + + resource.Test(t, resource.TestCase{ + PreCheck: func() { skipUnauthenticated(t) }, + ProviderFactories: providerFactories, + Steps: []resource.TestStep{ + { + Config: config, + ConfigStateChecks: []statecheck.StateCheck{ + statecheck.ExpectKnownValue("github_repository_file.test", tfjsonpath.New("id"), knownvalue.StringFunc(func(v string) error { + if strings.Contains(v, escapeIDPart(filePathWithColon)) { + return nil + } + return fmt.Errorf("expected id to contain escaped file path, got: %s", v) + })), + statecheck.ExpectKnownValue("github_repository_file.test", tfjsonpath.New("file"), knownvalue.StringExact(filePathWithColon)), + }, + }, + }, + }) + }) }