Skip to content

Commit b6fc505

Browse files
chore: migrate releases resource and data source to context-aware functions (#2996) (#3036)
The legacy CRUD function types are deprecated and should be replaced with the context-aware versions.
1 parent 1dfeffe commit b6fc505

2 files changed

Lines changed: 56 additions & 79 deletions

File tree

github/data_source_github_release.go

Lines changed: 39 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ package github
22

33
import (
44
"context"
5-
"fmt"
65
"strconv"
76
"strings"
87

8+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1010

1111
"github.com/google/go-github/v81/github"
@@ -14,7 +14,7 @@ import (
1414

1515
func dataSourceGithubRelease() *schema.Resource {
1616
return &schema.Resource{
17-
Read: dataSourceGithubReleaseRead,
17+
ReadContext: dataSourceGithubReleaseRead,
1818
Description: "Use this data source to retrieve information about a GitHub release in a specific repository.",
1919
Schema: map[string]*schema.Schema{
2020
"repository": {
@@ -156,12 +156,11 @@ func dataSourceGithubRelease() *schema.Resource {
156156
}
157157
}
158158

159-
func dataSourceGithubReleaseRead(d *schema.ResourceData, meta any) error {
159+
func dataSourceGithubReleaseRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
160160
repository := d.Get("repository").(string)
161161
owner := d.Get("owner").(string)
162162

163163
client := meta.(*Owner).v3client
164-
ctx := context.Background()
165164

166165
var err error
167166
var release *github.RepositoryRelease
@@ -172,85 +171,70 @@ func dataSourceGithubReleaseRead(d *schema.ResourceData, meta any) error {
172171
case "id":
173172
releaseID := int64(d.Get("release_id").(int))
174173
if releaseID == 0 {
175-
return fmt.Errorf("`release_id` must be set when `retrieve_by` = `id`")
174+
return diag.Errorf("`release_id` must be set when `retrieve_by` = `id`")
176175
}
177176

178177
release, _, err = client.Repositories.GetRelease(ctx, owner, repository, releaseID)
179178
case "tag":
180179
tag := d.Get("release_tag").(string)
181180
if tag == "" {
182-
return fmt.Errorf("`release_tag` must be set when `retrieve_by` = `tag`")
181+
return diag.Errorf("`release_tag` must be set when `retrieve_by` = `tag`")
183182
}
184183

185184
release, _, err = client.Repositories.GetReleaseByTag(ctx, owner, repository, tag)
186185
default:
187-
return fmt.Errorf("one of: `latest`, `id`, `tag` must be set for `retrieve_by`")
186+
return diag.Errorf("one of: `latest`, `id`, `tag` must be set for `retrieve_by`")
188187
}
189188

190189
if err != nil {
191-
return err
190+
return diag.FromErr(err)
192191
}
193192

194193
d.SetId(strconv.FormatInt(release.GetID(), 10))
195-
err = d.Set("release_tag", release.GetTagName())
196-
if err != nil {
197-
return err
194+
if err = d.Set("release_tag", release.GetTagName()); err != nil {
195+
return diag.FromErr(err)
198196
}
199-
err = d.Set("target_commitish", release.GetTargetCommitish())
200-
if err != nil {
201-
return err
197+
if err = d.Set("target_commitish", release.GetTargetCommitish()); err != nil {
198+
return diag.FromErr(err)
202199
}
203-
err = d.Set("name", release.GetName())
204-
if err != nil {
205-
return err
200+
if err = d.Set("name", release.GetName()); err != nil {
201+
return diag.FromErr(err)
206202
}
207-
err = d.Set("body", release.GetBody())
208-
if err != nil {
209-
return err
203+
if err = d.Set("body", release.GetBody()); err != nil {
204+
return diag.FromErr(err)
210205
}
211-
err = d.Set("draft", release.GetDraft())
212-
if err != nil {
213-
return err
206+
if err = d.Set("draft", release.GetDraft()); err != nil {
207+
return diag.FromErr(err)
214208
}
215-
err = d.Set("prerelease", release.GetPrerelease())
216-
if err != nil {
217-
return err
209+
if err = d.Set("prerelease", release.GetPrerelease()); err != nil {
210+
return diag.FromErr(err)
218211
}
219-
err = d.Set("created_at", release.GetCreatedAt().String())
220-
if err != nil {
221-
return err
212+
if err = d.Set("created_at", release.GetCreatedAt().String()); err != nil {
213+
return diag.FromErr(err)
222214
}
223-
err = d.Set("published_at", release.GetPublishedAt().String())
224-
if err != nil {
225-
return err
215+
if err = d.Set("published_at", release.GetPublishedAt().String()); err != nil {
216+
return diag.FromErr(err)
226217
}
227-
err = d.Set("url", release.GetURL())
228-
if err != nil {
229-
return err
218+
if err = d.Set("url", release.GetURL()); err != nil {
219+
return diag.FromErr(err)
230220
}
231-
err = d.Set("html_url", release.GetHTMLURL())
232-
if err != nil {
233-
return err
221+
if err = d.Set("html_url", release.GetHTMLURL()); err != nil {
222+
return diag.FromErr(err)
234223
}
235-
err = d.Set("assets_url", release.GetAssetsURL())
236-
if err != nil {
237-
return err
224+
if err = d.Set("assets_url", release.GetAssetsURL()); err != nil {
225+
return diag.FromErr(err)
238226
}
239-
err = d.Set("asserts_url", release.GetAssetsURL()) // Deprecated, original version of assets_url
240-
if err != nil {
241-
return err
227+
if err = d.Set("asserts_url", release.GetAssetsURL()); err != nil { // Deprecated, original version of assets_url
228+
return diag.FromErr(err)
242229
}
243-
err = d.Set("upload_url", release.GetUploadURL())
244-
if err != nil {
245-
return err
230+
if err = d.Set("upload_url", release.GetUploadURL()); err != nil {
231+
return diag.FromErr(err)
246232
}
247-
err = d.Set("zipball_url", release.GetZipballURL())
248-
if err != nil {
249-
return err
233+
if err = d.Set("zipball_url", release.GetZipballURL()); err != nil {
234+
return diag.FromErr(err)
250235
}
251-
err = d.Set("tarball_url", release.GetTarballURL())
252-
if err != nil {
253-
return err
236+
if err = d.Set("tarball_url", release.GetTarballURL()); err != nil {
237+
return diag.FromErr(err)
254238
}
255239

256240
assets := make([]any, 0, len(release.Assets))
@@ -273,9 +257,8 @@ func dataSourceGithubReleaseRead(d *schema.ResourceData, meta any) error {
273257
})
274258
}
275259

276-
err = d.Set("assets", assets)
277-
if err != nil {
278-
return err
260+
if err = d.Set("assets", assets); err != nil {
261+
return diag.FromErr(err)
279262
}
280263

281264
return nil

github/resource_github_release.go

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ import (
99
"strconv"
1010

1111
"github.com/google/go-github/v81/github"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1213
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1314
)
1415

1516
func resourceGithubRelease() *schema.Resource {
1617
return &schema.Resource{
17-
Create: resourceGithubReleaseCreateUpdate,
18-
Update: resourceGithubReleaseCreateUpdate,
19-
Read: resourceGithubReleaseRead,
20-
Delete: resourceGithubReleaseDelete,
18+
CreateContext: resourceGithubReleaseCreateUpdate,
19+
UpdateContext: resourceGithubReleaseCreateUpdate,
20+
ReadContext: resourceGithubReleaseRead,
21+
DeleteContext: resourceGithubReleaseDelete,
2122
Importer: &schema.ResourceImporter{
2223
State: resourceGithubReleaseImport,
2324
},
@@ -137,12 +138,7 @@ func resourceGithubRelease() *schema.Resource {
137138
}
138139
}
139140

140-
func resourceGithubReleaseCreateUpdate(d *schema.ResourceData, meta any) error {
141-
ctx := context.Background()
142-
if !d.IsNewResource() {
143-
ctx = context.WithValue(ctx, ctxId, d.Id())
144-
}
145-
141+
func resourceGithubReleaseCreateUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
146142
client := meta.(*Owner).v3client
147143
owner := meta.(*Owner).name
148144
repoName := d.Get("repository").(string)
@@ -183,12 +179,12 @@ func resourceGithubReleaseCreateUpdate(d *schema.ResourceData, meta any) error {
183179
log.Printf("[DEBUG] Response from creating release: %#v", *resp)
184180
}
185181
if err != nil {
186-
return err
182+
return diag.FromErr(err)
187183
}
188184
} else {
189185
id, err := strconv.ParseInt(d.Id(), 10, 64)
190186
if err != nil {
191-
return err
187+
return diag.FromErr(err)
192188
}
193189
log.Printf("[DEBUG] Updating release: %d:%s (%s/%s)",
194190
id, targetCommitish, owner, repoName)
@@ -197,25 +193,24 @@ func resourceGithubReleaseCreateUpdate(d *schema.ResourceData, meta any) error {
197193
log.Printf("[DEBUG] Response from updating release: %#v", *resp)
198194
}
199195
if err != nil {
200-
return err
196+
return diag.FromErr(err)
201197
}
202198
}
203199

204200
transformResponseToResourceData(d, release, repoName)
205201
return nil
206202
}
207203

208-
func resourceGithubReleaseRead(d *schema.ResourceData, meta any) error {
204+
func resourceGithubReleaseRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
209205
repository := d.Get("repository").(string)
210-
ctx := context.WithValue(context.Background(), ctxId, d.Id())
211206
client := meta.(*Owner).v3client
212207
owner := meta.(*Owner).name
213208
releaseID, err := strconv.ParseInt(d.Id(), 10, 64)
214209
if err != nil {
215-
return err
210+
return diag.FromErr(err)
216211
}
217212
if releaseID == 0 {
218-
return fmt.Errorf("`release_id` must be present")
213+
return diag.Errorf("`release_id` must be present")
219214
}
220215

221216
release, _, err := client.Repositories.GetRelease(ctx, owner, repository, releaseID)
@@ -228,30 +223,29 @@ func resourceGithubReleaseRead(d *schema.ResourceData, meta any) error {
228223
return nil
229224
}
230225
}
231-
return err
226+
return diag.FromErr(err)
232227
}
233228
transformResponseToResourceData(d, release, repository)
234229
return nil
235230
}
236231

237-
func resourceGithubReleaseDelete(d *schema.ResourceData, meta any) error {
238-
ctx := context.WithValue(context.Background(), ctxId, d.Id())
232+
func resourceGithubReleaseDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
239233
repository := d.Get("repository").(string)
240234
client := meta.(*Owner).v3client
241235
owner := meta.(*Owner).name
242236

243237
releaseIDStr := d.Id()
244238
releaseID, err := strconv.ParseInt(d.Id(), 10, 64)
245239
if err != nil {
246-
return unconvertibleIdErr(releaseIDStr, err)
240+
return diag.FromErr(unconvertibleIdErr(releaseIDStr, err))
247241
}
248242
if releaseID == 0 {
249-
return fmt.Errorf("`release_id` must be present")
243+
return diag.Errorf("`release_id` must be present")
250244
}
251245

252246
_, err = client.Repositories.DeleteRelease(ctx, owner, repository, releaseID)
253247
if err != nil {
254-
return fmt.Errorf("error deleting GitHub release reference %s/%s (%s): %w",
248+
return diag.Errorf("error deleting GitHub release reference %s/%s (%s): %v",
255249
fmt.Sprint(releaseID), repository, owner, err)
256250
}
257251
return nil

0 commit comments

Comments
 (0)