From f7da0744aaecf09f864e6d76c560be089dd508f1 Mon Sep 17 00:00:00 2001 From: Doug Ayers <4142577+douglascayers@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:10:05 -0500 Subject: [PATCH] Add support for repository alphanumeric autolinks (Fixes #1270) (#1314) * Add `is_alphanumeric` for repo autolinks * Test `is_alphanumeric` for repo autolinks * Use parseTwoPartID util func for consistent import ids * Update docs about `is_alphanumeric` and import format * revert import state parsing to avoid breaking change * revert import state parsing to avoid breaking change * revert import state parsing to avoid breaking change --- ...ce_github_repository_autolink_reference.go | 18 +- ...thub_repository_autolink_reference_test.go | 155 +++++++++++++++--- ...epository_autolink_reference.html.markdown | 12 +- 3 files changed, 152 insertions(+), 33 deletions(-) diff --git a/github/resource_github_repository_autolink_reference.go b/github/resource_github_repository_autolink_reference.go index ac976c8ef9..20efb3ffb4 100644 --- a/github/resource_github_repository_autolink_reference.go +++ b/github/resource_github_repository_autolink_reference.go @@ -41,15 +41,22 @@ func resourceGithubRepositoryAutolinkReference() *schema.Resource { "key_prefix": { Type: schema.TypeString, Required: true, - Description: "This prefix appended by a number will generate a link any time it is found in an issue, pull request, or commit", ForceNew: true, + Description: "This prefix appended by a number will generate a link any time it is found in an issue, pull request, or commit", }, "target_url_template": { Type: schema.TypeString, Required: true, + ForceNew: true, Description: "The template of the target URL used for the links; must be a valid URL and contain `` for the reference number", ValidateFunc: validation.StringMatch(regexp.MustCompile(`^http[s]?:\/\/[a-z0-9-.]*\/.*?.*?$`), "must be a valid URL and contain token"), - ForceNew: true, + }, + "is_alphanumeric": { + Type: schema.TypeBool, + Optional: true, + ForceNew: true, + Default: true, + Description: "Whether this autolink reference matches alphanumeric characters. If false, this autolink reference only matches numeric characters.", }, "etag": { Type: schema.TypeString, @@ -66,11 +73,13 @@ func resourceGithubRepositoryAutolinkReferenceCreate(d *schema.ResourceData, met repoName := d.Get("repository").(string) keyPrefix := d.Get("key_prefix").(string) targetURLTemplate := d.Get("target_url_template").(string) + isAlphanumeric := d.Get("is_alphanumeric").(bool) ctx := context.Background() opts := &github.AutolinkOptions{ - KeyPrefix: &keyPrefix, - URLTemplate: &targetURLTemplate, + KeyPrefix: &keyPrefix, + URLTemplate: &targetURLTemplate, + IsAlphanumeric: &isAlphanumeric, } autolinkRef, _, err := client.Repositories.AddAutolink(ctx, owner, repoName, opts) @@ -106,6 +115,7 @@ func resourceGithubRepositoryAutolinkReferenceRead(d *schema.ResourceData, meta d.Set("repository", repoName) d.Set("key_prefix", autolinkRef.KeyPrefix) d.Set("target_url_template", autolinkRef.URLTemplate) + d.Set("is_alphanumeric", autolinkRef.IsAlphanumeric) return nil } diff --git a/github/resource_github_repository_autolink_reference_test.go b/github/resource_github_repository_autolink_reference_test.go index 4d7cadd22a..b220dae965 100644 --- a/github/resource_github_repository_autolink_reference_test.go +++ b/github/resource_github_repository_autolink_reference_test.go @@ -15,25 +15,65 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) { t.Run("creates repository autolink reference without error", func(t *testing.T) { config := fmt.Sprintf(` - resource "github_repository" "oof" { - name = "oof-%s" - description = "Test autolink creation" + resource "github_repository" "test" { + name = "test-%s" + description = "Test autolink creation" } - resource "github_repository_autolink_reference" "autolink" { - repository = github_repository.oof.name + resource "github_repository_autolink_reference" "autolink_default" { + repository = github_repository.test.name - key_prefix = "OOF-" - target_url_template = "https://awesome.com/find/OOF-" + key_prefix = "TEST1-" + target_url_template = "https://example.com/TEST-" + } + + resource "github_repository_autolink_reference" "autolink_alphanumeric" { + repository = github_repository.test.name + + key_prefix = "TEST2-" + target_url_template = "https://example.com/TEST-" + is_alphanumeric = true + } + + resource "github_repository_autolink_reference" "autolink_numeric" { + repository = github_repository.test.name + + key_prefix = "TEST3-" + target_url_template = "https://example.com/TEST-" + is_alphanumeric = false } `, randomID) check := resource.ComposeTestCheckFunc( + // autolink_default + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "key_prefix", "TEST1-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "target_url_template", "https://example.com/TEST-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "is_alphanumeric", "true", + ), + // autolink_alphanumeric + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_alphanumeric", "key_prefix", "TEST2-", + ), resource.TestCheckResourceAttr( - "github_repository_autolink_reference.autolink", "key_prefix", "OOF-", + "github_repository_autolink_reference.autolink_alphanumeric", "target_url_template", "https://example.com/TEST-", ), resource.TestCheckResourceAttr( - "github_repository_autolink_reference.autolink", "target_url_template", "https://awesome.com/find/OOF-", + "github_repository_autolink_reference.autolink_alphanumeric", "is_alphanumeric", "true", + ), + // autolink_numeric + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "key_prefix", "TEST3-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "target_url_template", "https://example.com/TEST-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "is_alphanumeric", "false", ), ) @@ -67,19 +107,68 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) { t.Run("imports repository autolink reference without error", func(t *testing.T) { config := fmt.Sprintf(` - resource "github_repository" "oof" { - name = "oof-%s" - description = "Test autolink creation" + resource "github_repository" "test" { + name = "test-%s" + description = "Test autolink creation" + } + + resource "github_repository_autolink_reference" "autolink_default" { + repository = github_repository.test.name + + key_prefix = "TEST1-" + target_url_template = "https://example.com/TEST-" } - resource "github_repository_autolink_reference" "autolink" { - repository = github_repository.oof.name + resource "github_repository_autolink_reference" "autolink_alphanumeric" { + repository = github_repository.test.name - key_prefix = "OOF-" - target_url_template = "https://awesome.com/find/OOF-" + key_prefix = "TEST2-" + target_url_template = "https://example.com/TEST-" + is_alphanumeric = true + } + + resource "github_repository_autolink_reference" "autolink_numeric" { + repository = github_repository.test.name + + key_prefix = "TEST3-" + target_url_template = "https://example.com/TEST-" + is_alphanumeric = false } `, randomID) + check := resource.ComposeTestCheckFunc( + // autolink_default + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "key_prefix", "TEST1-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "target_url_template", "https://example.com/TEST-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_default", "is_alphanumeric", "true", + ), + // autolink_alphanumeric + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_alphanumeric", "key_prefix", "TEST2-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_alphanumeric", "target_url_template", "https://example.com/TEST-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_alphanumeric", "is_alphanumeric", "true", + ), + // autolink_numeric + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "key_prefix", "TEST3-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "target_url_template", "https://example.com/TEST-", + ), + resource.TestCheckResourceAttr( + "github_repository_autolink_reference.autolink_numeric", "is_alphanumeric", "false", + ), + ) + testCase := func(t *testing.T, mode string) { resource.Test(t, resource.TestCase{ PreCheck: func() { skipUnlessMode(t, mode) }, @@ -87,12 +176,28 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) { Steps: []resource.TestStep{ { Config: config, + Check: check, + }, + // autolink_default + { + ResourceName: "github_repository_autolink_reference.autolink_default", + ImportState: true, + ImportStateVerify: true, + ImportStateIdPrefix: fmt.Sprintf("test-%s/", randomID), + }, + // autolink_alphanumeric + { + ResourceName: "github_repository_autolink_reference.autolink_alphanumeric", + ImportState: true, + ImportStateVerify: true, + ImportStateIdPrefix: fmt.Sprintf("test-%s/", randomID), }, + // autolink_numeric { - ResourceName: "github_repository_autolink_reference.autolink", + ResourceName: "github_repository_autolink_reference.autolink_numeric", ImportState: true, ImportStateVerify: true, - ImportStateIdPrefix: fmt.Sprintf("oof-%s/", randomID), + ImportStateIdPrefix: fmt.Sprintf("test-%s/", randomID), }, }, }) @@ -115,16 +220,16 @@ func TestAccGithubRepositoryAutolinkReference(t *testing.T) { t.Run("deletes repository autolink reference without error", func(t *testing.T) { config := fmt.Sprintf(` - resource "github_repository" "oof" { - name = "oof-%s" - description = "Test autolink creation" + resource "github_repository" "test" { + name = "test-%s" + description = "Test autolink creation" } - resource "github_repository_autolink_reference" "autolink" { - repository = github_repository.oof.name + resource "github_repository_autolink_reference" "autolink_default" { + repository = github_repository.test.name - key_prefix = "OOF-" - target_url_template = "https://awesome.com/find/OOF-" + key_prefix = "TEST1-" + target_url_template = "https://example.com/TEST-" } `, randomID) diff --git a/website/docs/r/repository_autolink_reference.html.markdown b/website/docs/r/repository_autolink_reference.html.markdown index 8f9ed6870a..c0406dae4d 100644 --- a/website/docs/r/repository_autolink_reference.html.markdown +++ b/website/docs/r/repository_autolink_reference.html.markdown @@ -13,18 +13,18 @@ This resource allows you to create and manage an autolink reference for a single ```hcl resource "github_repository" "repo" { - name = "oof" + name = "my-repo" description = "GitHub repo managed by Terraform" private = false } -resource "github_repository_autolink_reference" "auto" { +resource "github_repository_autolink_reference" "autolink" { repository = github_repository.repo.name key_prefix = "TICKET-" - target_url_template = "https://hello.there/TICKET?query=" + target_url_template = "https://example.com/TICKET?query=" } ``` @@ -38,6 +38,8 @@ The following arguments are supported: * `target_url_template` - (Required) The template of the target URL used for the links; must be a valid URL and contain `` for the reference number +* `is_alphanumeric` - (Optional) Whether this autolink reference matches alphanumeric characters. If false, this autolink reference only matches numeric characters. Default is true. + ## Attributes Reference The following additional attributes are exported: @@ -49,5 +51,7 @@ The following additional attributes are exported: Autolink references can be imported using the `name` of the repository, combined with the `id` of the autolink reference and a `/` character for separating components, e.g. ```sh -terraform import github_repository_autolink_reference.auto oof/123 +terraform import github_repository_autolink_reference.auto my-repo/123 ``` + +See the GitHub documentation for how to [list all autolinks of a repository](https://docs.github.com/en/rest/repos/autolinks#list-all-autolinks-of-a-repository) to learn the autolink ids to use with the import command. \ No newline at end of file