Skip to content

Commit 1090c67

Browse files
committed
Refactor github_repository_file to use Context-aware functions for easier debugging
Signed-off-by: Timo Sand <[email protected]>
1 parent 6a8fc24 commit 1090c67

1 file changed

Lines changed: 50 additions & 53 deletions

File tree

github/resource_github_repository_file.go

Lines changed: 50 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,18 @@ import (
1010
"strings"
1111

1212
"github.com/google/go-github/v81/github"
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1314
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1415
)
1516

1617
func resourceGithubRepositoryFile() *schema.Resource {
1718
return &schema.Resource{
18-
Create: resourceGithubRepositoryFileCreate,
19-
Read: resourceGithubRepositoryFileRead,
20-
Update: resourceGithubRepositoryFileUpdate,
21-
Delete: resourceGithubRepositoryFileDelete,
19+
CreateContext: resourceGithubRepositoryFileCreate,
20+
ReadContext: resourceGithubRepositoryFileRead,
21+
UpdateContext: resourceGithubRepositoryFileUpdate,
22+
DeleteContext: resourceGithubRepositoryFileDelete,
2223
Importer: &schema.ResourceImporter{
23-
State: func(d *schema.ResourceData, meta any) ([]*schema.ResourceData, error) {
24+
StateContext: func(ctx context.Context, d *schema.ResourceData, meta any) ([]*schema.ResourceData, error) {
2425
parts := strings.Split(d.Id(), ":")
2526

2627
if len(parts) > 2 {
@@ -31,7 +32,6 @@ func resourceGithubRepositoryFile() *schema.Resource {
3132
owner := meta.(*Owner).name
3233
repo, file := splitRepoFilePath(parts[0])
3334
// test if a file exists in a repository.
34-
ctx := context.WithValue(context.Background(), ctxId, fmt.Sprintf("%s/%s", repo, file))
3535
opts := &github.RepositoryContentGetOptions{}
3636
if len(parts) == 2 {
3737
opts.Ref = parts[1]
@@ -187,10 +187,9 @@ func resourceGithubRepositoryFileOptions(d *schema.ResourceData) (*github.Reposi
187187
return opts, nil
188188
}
189189

190-
func resourceGithubRepositoryFileCreate(d *schema.ResourceData, meta any) error {
190+
func resourceGithubRepositoryFileCreate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
191191
client := meta.(*Owner).v3client
192192
owner := meta.(*Owner).name
193-
ctx := context.Background()
194193

195194
repo := d.Get("repository").(string)
196195
file := d.Get("file").(string)
@@ -208,8 +207,8 @@ func resourceGithubRepositoryFileCreate(d *schema.ResourceData, meta any) error
208207
if _, hasSourceSHA := d.GetOk("autocreate_branch_source_sha"); !hasSourceSHA {
209208
ref, _, err := client.Git.GetRef(ctx, owner, repo, sourceBranchRefName)
210209
if err != nil {
211-
return fmt.Errorf("error querying GitHub branch reference %s/%s (%s): %w",
212-
owner, repo, sourceBranchRefName, err)
210+
return diag.Errorf("error querying GitHub branch reference %s/%s (%s): %s",
211+
owner, repo, sourceBranchRefName, err.Error())
213212
}
214213
_ = d.Set("autocreate_branch_source_sha", *ref.Object.SHA)
215214
}
@@ -218,18 +217,18 @@ func resourceGithubRepositoryFileCreate(d *schema.ResourceData, meta any) error
218217
Ref: branchRefName,
219218
SHA: sourceBranchSHA,
220219
}); err != nil {
221-
return err
220+
return diag.FromErr(err)
222221
}
223222
} else {
224-
return err
223+
return diag.FromErr(err)
225224
}
226225
}
227226
checkOpt.Ref = branch.(string)
228227
}
229228

230229
opts, err := resourceGithubRepositoryFileOptions(d)
231230
if err != nil {
232-
return err
231+
return diag.FromErr(err)
233232
}
234233

235234
if opts.Message == nil {
@@ -243,11 +242,11 @@ func resourceGithubRepositoryFileCreate(d *schema.ResourceData, meta any) error
243242
if resp != nil {
244243
if resp.StatusCode != 404 {
245244
// 404 is a valid response if the file does not exist
246-
return err
245+
return diag.FromErr(err)
247246
}
248247
} else {
249248
// Response should be non-nil
250-
return err
249+
return diag.FromErr(err)
251250
}
252251
}
253252

@@ -258,28 +257,28 @@ func resourceGithubRepositoryFileCreate(d *schema.ResourceData, meta any) error
258257
opts.SHA = fileContent.SHA
259258
} else {
260259
// Error if overwriting a file is not requested
261-
return fmt.Errorf("refusing to overwrite existing file: configure `overwrite_on_create` to `true` to override")
260+
return diag.Errorf("refusing to overwrite existing file: configure `overwrite_on_create` to `true` to override")
262261
}
263262
}
264263

264+
log.Printf("[DEBUG] Creating or overwriting a repository file: %s/%s/%s", owner, repo, file)
265265
// Create a new or overwritten file
266266
create, _, err := client.Repositories.CreateFile(ctx, owner, repo, file, opts)
267267
if err != nil {
268-
return err
268+
return diag.FromErr(err)
269269
}
270270

271271
d.SetId(fmt.Sprintf("%s/%s", repo, file))
272272
if err = d.Set("commit_sha", create.GetSHA()); err != nil {
273-
return err
273+
return diag.FromErr(err)
274274
}
275275

276-
return resourceGithubRepositoryFileRead(d, meta)
276+
return resourceGithubRepositoryFileRead(ctx, d, meta)
277277
}
278278

279-
func resourceGithubRepositoryFileRead(d *schema.ResourceData, meta any) error {
279+
func resourceGithubRepositoryFileRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
280280
client := meta.(*Owner).v3client
281281
owner := meta.(*Owner).name
282-
ctx := context.WithValue(context.Background(), ctxId, d.Id())
283282

284283
repo, file := splitRepoFilePath(d.Id())
285284

@@ -304,7 +303,7 @@ func resourceGithubRepositoryFileRead(d *schema.ResourceData, meta any) error {
304303
if err != nil {
305304
var errorResponse *github.ErrorResponse
306305
if errors.As(err, &errorResponse) && errorResponse.Response.StatusCode == http.StatusTooManyRequests {
307-
return err
306+
return diag.FromErr(err)
308307
}
309308
}
310309
if fc == nil {
@@ -316,35 +315,35 @@ func resourceGithubRepositoryFileRead(d *schema.ResourceData, meta any) error {
316315

317316
content, err := fc.GetContent()
318317
if err != nil {
319-
return err
318+
return diag.FromErr(err)
320319
}
321320

322321
if err = d.Set("content", content); err != nil {
323-
return err
322+
return diag.FromErr(err)
324323
}
325324
if err = d.Set("repository", repo); err != nil {
326-
return err
325+
return diag.FromErr(err)
327326
}
328327
if err = d.Set("file", file); err != nil {
329-
return err
328+
return diag.FromErr(err)
330329
}
331330
if err = d.Set("sha", fc.GetSHA()); err != nil {
332-
return err
331+
return diag.FromErr(err)
333332
}
334333

335334
var commit *github.RepositoryCommit
336335

337336
parsedUrl, err := url.Parse(fc.GetURL())
338337
if err != nil {
339-
return err
338+
return diag.FromErr(err)
340339
}
341340
parsedQuery, err := url.ParseQuery(parsedUrl.RawQuery)
342341
if err != nil {
343-
return err
342+
return diag.FromErr(err)
344343
}
345344
ref := parsedQuery["ref"][0]
346345
if err = d.Set("ref", ref); err != nil {
347-
return err
346+
return diag.FromErr(err)
348347
}
349348

350349
// Use the SHA to lookup the commit info if we know it, otherwise loop through commits
@@ -356,12 +355,12 @@ func resourceGithubRepositoryFileRead(d *schema.ResourceData, meta any) error {
356355
commit, err = getFileCommit(ctx, client, owner, repo, file, ref)
357356
}
358357
if err != nil {
359-
return err
358+
return diag.FromErr(err)
360359
}
361360
log.Printf("[DEBUG] Found file: %s/%s/%s, in commit SHA: %s ", owner, repo, file, commit.GetSHA())
362361

363362
if err = d.Set("commit_sha", commit.GetSHA()); err != nil {
364-
return err
363+
return diag.FromErr(err)
365364
}
366365

367366
commit_author := commit.Commit.GetCommitter().GetName()
@@ -373,23 +372,22 @@ func resourceGithubRepositoryFileRead(d *schema.ResourceData, meta any) error {
373372
// read from state if author+email is set explicitly, and if it was not github signing it for you previously
374373
if commit_author != "GitHub" && commit_email != "[email protected]" && hasCommitAuthor && hasCommitEmail {
375374
if err = d.Set("commit_author", commit_author); err != nil {
376-
return err
375+
return diag.FromErr(err)
377376
}
378377
if err = d.Set("commit_email", commit_email); err != nil {
379-
return err
378+
return diag.FromErr(err)
380379
}
381380
}
382381
if err = d.Set("commit_message", commit.GetCommit().GetMessage()); err != nil {
383-
return err
382+
return diag.FromErr(err)
384383
}
385384

386385
return nil
387386
}
388387

389-
func resourceGithubRepositoryFileUpdate(d *schema.ResourceData, meta any) error {
388+
func resourceGithubRepositoryFileUpdate(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
390389
client := meta.(*Owner).v3client
391390
owner := meta.(*Owner).name
392-
ctx := context.Background()
393391

394392
repo := d.Get("repository").(string)
395393
file := d.Get("file").(string)
@@ -405,8 +403,8 @@ func resourceGithubRepositoryFileUpdate(d *schema.ResourceData, meta any) error
405403
if _, hasSourceSHA := d.GetOk("autocreate_branch_source_sha"); !hasSourceSHA {
406404
ref, _, err := client.Git.GetRef(ctx, owner, repo, sourceBranchRefName)
407405
if err != nil {
408-
return fmt.Errorf("error querying GitHub branch reference %s/%s (%s): %w",
409-
owner, repo, sourceBranchRefName, err)
406+
return diag.Errorf("error querying GitHub branch reference %s/%s (%s): %s",
407+
owner, repo, sourceBranchRefName, err.Error())
410408
}
411409
_ = d.Set("autocreate_branch_source_sha", *ref.Object.SHA)
412410
}
@@ -415,17 +413,17 @@ func resourceGithubRepositoryFileUpdate(d *schema.ResourceData, meta any) error
415413
Ref: branchRefName,
416414
SHA: sourceBranchSHA,
417415
}); err != nil {
418-
return err
416+
return diag.FromErr(err)
419417
}
420418
} else {
421-
return err
419+
return diag.FromErr(err)
422420
}
423421
}
424422
}
425423

426424
opts, err := resourceGithubRepositoryFileOptions(d)
427425
if err != nil {
428-
return err
426+
return diag.FromErr(err)
429427
}
430428

431429
if *opts.Message == fmt.Sprintf("Add %s", file) {
@@ -435,20 +433,19 @@ func resourceGithubRepositoryFileUpdate(d *schema.ResourceData, meta any) error
435433

436434
create, _, err := client.Repositories.CreateFile(ctx, owner, repo, file, opts)
437435
if err != nil {
438-
return err
436+
return diag.FromErr(err)
439437
}
440438

441439
if err = d.Set("commit_sha", create.GetSHA()); err != nil {
442-
return err
440+
return diag.FromErr(err)
443441
}
444442

445-
return resourceGithubRepositoryFileRead(d, meta)
443+
return resourceGithubRepositoryFileRead(ctx, d, meta)
446444
}
447445

448-
func resourceGithubRepositoryFileDelete(d *schema.ResourceData, meta any) error {
446+
func resourceGithubRepositoryFileDelete(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics {
449447
client := meta.(*Owner).v3client
450448
owner := meta.(*Owner).name
451-
ctx := context.Background()
452449

453450
repo := d.Get("repository").(string)
454451
file := d.Get("file").(string)
@@ -457,7 +454,7 @@ func resourceGithubRepositoryFileDelete(d *schema.ResourceData, meta any) error
457454

458455
opts, err := resourceGithubRepositoryFileOptions(d)
459456
if err != nil {
460-
return err
457+
return diag.FromErr(err)
461458
}
462459

463460
if *opts.Message == fmt.Sprintf("Add %s", file) {
@@ -476,8 +473,8 @@ func resourceGithubRepositoryFileDelete(d *schema.ResourceData, meta any) error
476473
if _, hasSourceSHA := d.GetOk("autocreate_branch_source_sha"); !hasSourceSHA {
477474
ref, _, err := client.Git.GetRef(ctx, owner, repo, sourceBranchRefName)
478475
if err != nil {
479-
return fmt.Errorf("error querying GitHub branch reference %s/%s (%s): %w",
480-
owner, repo, sourceBranchRefName, err)
476+
return diag.Errorf("error querying GitHub branch reference %s/%s (%s): %s",
477+
owner, repo, sourceBranchRefName, err.Error())
481478
}
482479
_ = d.Set("autocreate_branch_source_sha", *ref.Object.SHA)
483480
}
@@ -486,18 +483,18 @@ func resourceGithubRepositoryFileDelete(d *schema.ResourceData, meta any) error
486483
Ref: branchRefName,
487484
SHA: sourceBranchSHA,
488485
}); err != nil {
489-
return err
486+
return diag.FromErr(err)
490487
}
491488
} else {
492-
return err
489+
return diag.FromErr(err)
493490
}
494491
}
495492
branch = b.(string)
496493
opts.Branch = &branch
497494
}
498495

499496
_, _, err = client.Repositories.DeleteFile(ctx, owner, repo, file, opts)
500-
return handleArchivedRepoDelete(err, "repository file", file, owner, repo)
497+
return diag.FromErr(handleArchivedRepoDelete(err, "repository file", file, owner, repo))
501498
}
502499

503500
func autoBranchDiffSuppressFunc(k, _, _ string, d *schema.ResourceData) bool {

0 commit comments

Comments
 (0)