From 9ac7786c14d18b5b7cfe623ec59da8978159b492 Mon Sep 17 00:00:00 2001 From: Ben F Date: Thu, 13 Feb 2020 14:00:33 +0000 Subject: [PATCH] GH-144 - Added handling for retrieving releases by various methods --- github/data_source_github_release.go | 43 +++++++++++++++++++++++++--- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/github/data_source_github_release.go b/github/data_source_github_release.go index 91f4606d86..ad71bd9750 100644 --- a/github/data_source_github_release.go +++ b/github/data_source_github_release.go @@ -2,9 +2,12 @@ package github import ( "context" + "errors" "log" "strconv" + "strings" + "github.com/google/go-github/v28/github" "github.com/hashicorp/terraform/helper/schema" ) @@ -21,9 +24,17 @@ func dataSourceGithubRelease() *schema.Resource { Type: schema.TypeString, Required: true, }, + "retrieve_by": { + Type: schema.TypeString, + Required: true, + }, + "release_tag": { + Type: schema.TypeString, + Optional: true, + }, "release_id": { Type: schema.TypeInt, - Required: true, + Optional: true, }, "url": { Type: schema.TypeString, @@ -36,13 +47,37 @@ func dataSourceGithubRelease() *schema.Resource { func dataSourceGithubReleaseRead(d *schema.ResourceData, meta interface{}) error { repository := d.Get("repository").(string) owner := d.Get("owner").(string) - releaseID := int64(d.Get("release_id").(int)) - log.Printf("[INFO] Refreshing GitHub release %s from repository %s", releaseID, repository) client := meta.(*Organization).client ctx := context.Background() - release, _, err := client.Repositories.GetRelease(ctx, owner, repository, releaseID) + var err error + var release *github.RepositoryRelease + + switch retrieveBy := strings.ToLower(d.Get("retrieve_by").(string)); retrieveBy { + case "latest": + log.Printf("[INFO] Refreshing GitHub latest release from repository %s", repository) + release, _, err = client.Repositories.GetLatestRelease(ctx, owner, repository) + case "id": + releaseID := int64(d.Get("release_id").(int)) + if releaseID == 0 { + return errors.New("'release_id' must be set when 'retrieve_by' = 'id'") + } + + log.Printf("[INFO] Refreshing GitHub release by id %s from repository %s", releaseID, repository) + release, _, err = client.Repositories.GetRelease(ctx, owner, repository, releaseID) + case "tag": + tag := d.Get("release_tag").(string) + if tag == "" { + return errors.New("'release_tag' must be set when 'retrieve_by' = 'tag'") + } + + log.Printf("[INFO] Refreshing GitHub release by tag %s from repository %s", tag, repository) + release, _, err = client.Repositories.GetReleaseByTag(ctx, owner, repository, tag) + default: + return errors.New("One of: 'latest', 'id', 'tag' must be set for 'retrieve_by'") + } + if err != nil { return err }