@@ -2,8 +2,8 @@ package github
22
33import (
44 "context"
5+ "fmt"
56 "log"
6- "strings"
77
88 "github.com/google/go-github/v66/github"
99 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -61,49 +61,23 @@ func resourceGithubIssueLabels() *schema.Resource {
6161
6262func 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
11488func 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
214173func 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