Skip to content

Commit 87f6087

Browse files
committed
fix: Fixed issue labels adoption
Signed-off-by: Steve Hipwell <[email protected]>
1 parent b9cf750 commit 87f6087

4 files changed

+166
-164
lines changed

github/data_source_github_issue_labels.go

+4-46
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package github
22

33
import (
44
"context"
5-
"fmt"
65

7-
"github.com/google/go-github/v65/github"
86
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
97
)
108

@@ -49,59 +47,19 @@ func dataSourceGithubIssueLabelsRead(d *schema.ResourceData, meta interface{}) e
4947
client := meta.(*Owner).v3client
5048
owner := meta.(*Owner).name
5149
repository := d.Get("repository").(string)
52-
5350
ctx := context.Background()
54-
opts := &github.ListOptions{
55-
PerPage: maxPerPage,
56-
}
5751

5852
d.SetId(repository)
5953

60-
allLabels := make([]interface{}, 0)
61-
for {
62-
labels, resp, err := client.Issues.ListLabels(ctx, owner, repository, opts)
63-
if err != nil {
64-
return err
65-
}
66-
67-
result, err := flattenLabels(labels)
68-
if err != nil {
69-
return fmt.Errorf("unable to flatten GitHub Labels (Owner: %q/Repository: %q) : %+v", owner, repository, err)
70-
}
71-
72-
allLabels = append(allLabels, result...)
73-
74-
if resp.NextPage == 0 {
75-
break
76-
}
77-
opts.Page = resp.NextPage
54+
labels, err := listLabels(client, ctx, owner, repository)
55+
if err != nil {
56+
return err
7857
}
7958

80-
err := d.Set("labels", allLabels)
59+
err = d.Set("labels", flattenLabels(labels))
8160
if err != nil {
8261
return err
8362
}
8463

8564
return nil
8665
}
87-
88-
func flattenLabels(labels []*github.Label) ([]interface{}, error) {
89-
if labels == nil {
90-
return make([]interface{}, 0), nil
91-
}
92-
93-
results := make([]interface{}, 0)
94-
95-
for _, l := range labels {
96-
result := make(map[string]interface{})
97-
98-
result["name"] = l.GetName()
99-
result["color"] = l.GetColor()
100-
result["description"] = l.GetDescription()
101-
result["url"] = l.GetURL()
102-
103-
results = append(results, result)
104-
}
105-
106-
return results, nil
107-
}

github/resource_github_issue_labels.go

+56-99
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package github
22

33
import (
44
"context"
5+
"fmt"
56
"log"
6-
"strings"
77

88
"github.com/google/go-github/v65/github"
99
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -61,49 +61,23 @@ func resourceGithubIssueLabels() *schema.Resource {
6161

6262
func resourceGithubIssueLabelsRead(d *schema.ResourceData, meta interface{}) error {
6363
client := meta.(*Owner).v3client
64-
6564
owner := meta.(*Owner).name
6665
repository := d.Id()
67-
68-
log.Printf("[DEBUG] Reading GitHub issue labels for %s/%s", owner, repository)
69-
7066
ctx := context.WithValue(context.Background(), ctxId, repository)
7167

72-
options := &github.ListOptions{
73-
PerPage: maxPerPage,
74-
}
75-
76-
labels := make([]map[string]interface{}, 0)
77-
78-
for {
79-
ls, resp, err := client.Issues.ListLabels(ctx, owner, repository, options)
80-
if err != nil {
81-
return err
82-
}
83-
for _, l := range ls {
84-
labels = append(labels, map[string]interface{}{
85-
"name": l.GetName(),
86-
"color": l.GetColor(),
87-
"description": l.GetDescription(),
88-
"url": l.GetURL(),
89-
})
90-
}
68+
log.Printf("[DEBUG] Reading GitHub issue labels for %s/%s", owner, repository)
9169

92-
if resp.NextPage == 0 {
93-
break
94-
}
95-
options.Page = resp.NextPage
70+
labels, err := listLabels(client, ctx, owner, repository)
71+
if err != nil {
72+
return err
9673
}
9774

98-
log.Printf("[DEBUG] Found %d GitHub issue labels for %s/%s", len(labels), owner, repository)
99-
log.Printf("[DEBUG] Labels: %v", labels)
100-
101-
err := d.Set("repository", repository)
75+
err = d.Set("repository", repository)
10276
if err != nil {
10377
return err
10478
}
10579

106-
err = d.Set("label", labels)
80+
err = d.Set("label", flattenLabels(labels))
10781
if err != nil {
10882
return err
10983
}
@@ -113,97 +87,82 @@ func resourceGithubIssueLabelsRead(d *schema.ResourceData, meta interface{}) err
11387

11488
func resourceGithubIssueLabelsCreateOrUpdate(d *schema.ResourceData, meta interface{}) error {
11589
client := meta.(*Owner).v3client
116-
11790
owner := meta.(*Owner).name
11891
repository := d.Get("repository").(string)
11992
ctx := context.WithValue(context.Background(), ctxId, repository)
12093

121-
o, n := d.GetChange("label")
94+
wantLabels := d.Get("label").(*schema.Set).List()
12295

123-
log.Printf("[DEBUG] Updating GitHub issue labels for %s/%s", owner, repository)
124-
log.Printf("[DEBUG] Old labels: %v", o)
125-
log.Printf("[DEBUG] New labels: %v", n)
126-
127-
oMap := make(map[string]map[string]interface{})
128-
nMap := make(map[string]map[string]interface{})
129-
for _, raw := range o.(*schema.Set).List() {
130-
m := raw.(map[string]interface{})
131-
name := strings.ToLower(m["name"].(string))
132-
oMap[name] = m
96+
wantLabelsMap := make(map[string]interface{}, len(wantLabels))
97+
for _, label := range wantLabels {
98+
name := label.(map[string]interface{})["name"].(string)
99+
if _, found := wantLabelsMap[name]; found {
100+
return fmt.Errorf("duplicate set label: %s", name)
101+
}
102+
wantLabelsMap[name] = label
133103
}
134-
for _, raw := range n.(*schema.Set).List() {
135-
m := raw.(map[string]interface{})
136-
name := strings.ToLower(m["name"].(string))
137-
nMap[name] = m
104+
105+
hasLabels, err := listLabels(client, ctx, owner, repository)
106+
if err != nil {
107+
return err
138108
}
139109

140-
labels := make([]map[string]interface{}, 0)
110+
log.Printf("[DEBUG] Updating GitHub issue labels for %s/%s", owner, repository)
141111

142-
// create
143-
for name, n := range nMap {
144-
if _, ok := oMap[name]; !ok {
145-
log.Printf("[DEBUG] Creating GitHub issue label %s/%s/%s", owner, repository, name)
112+
hasLabelsMap := make(map[string]struct{}, len(hasLabels))
113+
for _, hasLabel := range hasLabels {
114+
name := hasLabel.GetName()
115+
wantLabel, found := wantLabelsMap[name]
116+
if found {
117+
labelData := wantLabel.(map[string]interface{})
118+
description := labelData["description"].(string)
119+
color := labelData["color"].(string)
120+
if hasLabel.GetDescription() != description || hasLabel.GetColor() != color {
121+
log.Printf("[DEBUG] Updating GitHub issue label %s/%s/%s", owner, repository, name)
146122

147-
label, _, err := client.Issues.CreateLabel(ctx, owner, repository, &github.Label{
148-
Name: github.String(n["name"].(string)),
149-
Color: github.String(n["color"].(string)),
150-
Description: github.String(n["description"].(string)),
151-
})
152-
if err != nil {
153-
return err
123+
_, _, err := client.Issues.EditLabel(ctx, owner, repository, name, &github.Label{
124+
Name: github.String(name),
125+
Description: github.String(description),
126+
Color: github.String(color),
127+
})
128+
if err != nil {
129+
return err
130+
}
154131
}
155-
156-
labels = append(labels, map[string]interface{}{
157-
"name": label.GetName(),
158-
"color": label.GetColor(),
159-
"description": label.GetDescription(),
160-
"url": label.GetURL(),
161-
})
162-
}
163-
}
164-
165-
// delete
166-
for name, o := range oMap {
167-
if _, ok := nMap[name]; !ok {
132+
} else {
168133
log.Printf("[DEBUG] Deleting GitHub issue label %s/%s/%s", owner, repository, name)
169134

170-
_, err := client.Issues.DeleteLabel(ctx, owner, repository, o["name"].(string))
135+
_, err := client.Issues.DeleteLabel(ctx, owner, repository, name)
171136
if err != nil {
172137
return err
173138
}
174139
}
140+
141+
hasLabelsMap[name] = struct{}{}
175142
}
176143

177-
// update
178-
for name, n := range nMap {
179-
if o, ok := oMap[name]; ok {
180-
if o["name"] != n["name"] || o["color"] != n["color"] || o["description"] != n["description"] {
181-
log.Printf("[DEBUG] Updating GitHub issue label %s/%s/%s", owner, repository, name)
144+
for _, l := range wantLabels {
145+
labelData := l.(map[string]interface{})
146+
name := labelData["name"].(string)
182147

183-
label, _, err := client.Issues.EditLabel(ctx, owner, repository, name, &github.Label{
184-
Name: github.String(n["name"].(string)),
185-
Color: github.String(n["color"].(string)),
186-
Description: github.String(n["description"].(string)),
187-
})
188-
if err != nil {
189-
return err
190-
}
148+
_, found := hasLabelsMap[name]
149+
if !found {
150+
log.Printf("[DEBUG] Creating GitHub issue label %s/%s/%s", owner, repository, name)
191151

192-
labels = append(labels, map[string]interface{}{
193-
"name": label.GetName(),
194-
"color": label.GetColor(),
195-
"description": label.GetDescription(),
196-
"url": label.GetURL(),
197-
})
198-
} else {
199-
labels = append(labels, o)
152+
_, _, err := client.Issues.CreateLabel(ctx, owner, repository, &github.Label{
153+
Name: github.String(name),
154+
Description: github.String(labelData["description"].(string)),
155+
Color: github.String(labelData["color"].(string)),
156+
})
157+
if err != nil {
158+
return err
200159
}
201160
}
202161
}
203162

204163
d.SetId(repository)
205164

206-
err := d.Set("label", labels)
165+
err = d.Set("label", wantLabels)
207166
if err != nil {
208167
return err
209168
}
@@ -213,15 +172,13 @@ func resourceGithubIssueLabelsCreateOrUpdate(d *schema.ResourceData, meta interf
213172

214173
func resourceGithubIssueLabelsDelete(d *schema.ResourceData, meta interface{}) error {
215174
client := meta.(*Owner).v3client
216-
217175
owner := meta.(*Owner).name
218176
repository := d.Get("repository").(string)
219177
ctx := context.WithValue(context.Background(), ctxId, repository)
220178

221179
labels := d.Get("label").(*schema.Set).List()
222180

223181
log.Printf("[DEBUG] Deleting GitHub issue labels for %s/%s", owner, repository)
224-
log.Printf("[DEBUG] Labels: %v", labels)
225182

226183
// delete
227184
for _, raw := range labels {

0 commit comments

Comments
 (0)