@@ -2,8 +2,8 @@ package github
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"log"
6
- "strings"
7
7
8
8
"github.com/google/go-github/v66/github"
9
9
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -61,49 +61,23 @@ func resourceGithubIssueLabels() *schema.Resource {
61
61
62
62
func resourceGithubIssueLabelsRead (d * schema.ResourceData , meta interface {}) error {
63
63
client := meta .(* Owner ).v3client
64
-
65
64
owner := meta .(* Owner ).name
66
65
repository := d .Id ()
67
-
68
- log .Printf ("[DEBUG] Reading GitHub issue labels for %s/%s" , owner , repository )
69
-
70
66
ctx := context .WithValue (context .Background (), ctxId , repository )
71
67
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 )
91
69
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
96
73
}
97
74
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 )
102
76
if err != nil {
103
77
return err
104
78
}
105
79
106
- err = d .Set ("label" , labels )
80
+ err = d .Set ("label" , flattenLabels ( labels ) )
107
81
if err != nil {
108
82
return err
109
83
}
@@ -113,97 +87,82 @@ func resourceGithubIssueLabelsRead(d *schema.ResourceData, meta interface{}) err
113
87
114
88
func resourceGithubIssueLabelsCreateOrUpdate (d * schema.ResourceData , meta interface {}) error {
115
89
client := meta .(* Owner ).v3client
116
-
117
90
owner := meta .(* Owner ).name
118
91
repository := d .Get ("repository" ).(string )
119
92
ctx := context .WithValue (context .Background (), ctxId , repository )
120
93
121
- o , n := d .GetChange ("label" )
94
+ wantLabels := d .Get ("label" ).( * schema. Set ). List ( )
122
95
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
133
103
}
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
138
108
}
139
109
140
- labels := make ([] map [ string ] interface {}, 0 )
110
+ log . Printf ( "[DEBUG] Updating GitHub issue labels for %s/%s" , owner , repository )
141
111
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 )
146
122
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
+ }
154
131
}
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 {
168
133
log .Printf ("[DEBUG] Deleting GitHub issue label %s/%s/%s" , owner , repository , name )
169
134
170
- _ , err := client .Issues .DeleteLabel (ctx , owner , repository , o [ " name" ].( string ) )
135
+ _ , err := client .Issues .DeleteLabel (ctx , owner , repository , name )
171
136
if err != nil {
172
137
return err
173
138
}
174
139
}
140
+
141
+ hasLabelsMap [name ] = struct {}{}
175
142
}
176
143
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 )
182
147
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 )
191
151
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
200
159
}
201
160
}
202
161
}
203
162
204
163
d .SetId (repository )
205
164
206
- err : = d .Set ("label" , labels )
165
+ err = d .Set ("label" , wantLabels )
207
166
if err != nil {
208
167
return err
209
168
}
@@ -213,15 +172,13 @@ func resourceGithubIssueLabelsCreateOrUpdate(d *schema.ResourceData, meta interf
213
172
214
173
func resourceGithubIssueLabelsDelete (d * schema.ResourceData , meta interface {}) error {
215
174
client := meta .(* Owner ).v3client
216
-
217
175
owner := meta .(* Owner ).name
218
176
repository := d .Get ("repository" ).(string )
219
177
ctx := context .WithValue (context .Background (), ctxId , repository )
220
178
221
179
labels := d .Get ("label" ).(* schema.Set ).List ()
222
180
223
181
log .Printf ("[DEBUG] Deleting GitHub issue labels for %s/%s" , owner , repository )
224
- log .Printf ("[DEBUG] Labels: %v" , labels )
225
182
226
183
// delete
227
184
for _ , raw := range labels {
0 commit comments