1// Copyright 2013 The go-github AUTHORS. All rights reserved. 2// 3// Use of this source code is governed by a BSD-style 4// license that can be found in the LICENSE file. 5 6package github 7 8import ( 9 "context" 10 "fmt" 11) 12 13// Label represents a GitHub label on an Issue 14type Label struct { 15 ID *int64 `json:"id,omitempty"` 16 URL *string `json:"url,omitempty"` 17 Name *string `json:"name,omitempty"` 18 Color *string `json:"color,omitempty"` 19 Description *string `json:"description,omitempty"` 20 Default *bool `json:"default,omitempty"` 21 NodeID *string `json:"node_id,omitempty"` 22} 23 24func (l Label) String() string { 25 return Stringify(l) 26} 27 28// ListLabels lists all labels for a repository. 29// 30// GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-a-repository 31func (s *IssuesService) ListLabels(ctx context.Context, owner string, repo string, opts *ListOptions) ([]*Label, *Response, error) { 32 u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) 33 u, err := addOptions(u, opts) 34 if err != nil { 35 return nil, nil, err 36 } 37 38 req, err := s.client.NewRequest("GET", u, nil) 39 if err != nil { 40 return nil, nil, err 41 } 42 43 var labels []*Label 44 resp, err := s.client.Do(ctx, req, &labels) 45 if err != nil { 46 return nil, resp, err 47 } 48 49 return labels, resp, nil 50} 51 52// GetLabel gets a single label. 53// 54// GitHub API docs: https://developer.github.com/v3/issues/labels/#get-a-label 55func (s *IssuesService) GetLabel(ctx context.Context, owner string, repo string, name string) (*Label, *Response, error) { 56 u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) 57 req, err := s.client.NewRequest("GET", u, nil) 58 if err != nil { 59 return nil, nil, err 60 } 61 62 label := new(Label) 63 resp, err := s.client.Do(ctx, req, label) 64 if err != nil { 65 return nil, resp, err 66 } 67 68 return label, resp, nil 69} 70 71// CreateLabel creates a new label on the specified repository. 72// 73// GitHub API docs: https://developer.github.com/v3/issues/labels/#create-a-label 74func (s *IssuesService) CreateLabel(ctx context.Context, owner string, repo string, label *Label) (*Label, *Response, error) { 75 u := fmt.Sprintf("repos/%v/%v/labels", owner, repo) 76 req, err := s.client.NewRequest("POST", u, label) 77 if err != nil { 78 return nil, nil, err 79 } 80 81 l := new(Label) 82 resp, err := s.client.Do(ctx, req, l) 83 if err != nil { 84 return nil, resp, err 85 } 86 87 return l, resp, nil 88} 89 90// EditLabel edits a label. 91// 92// GitHub API docs: https://developer.github.com/v3/issues/labels/#update-a-label 93func (s *IssuesService) EditLabel(ctx context.Context, owner string, repo string, name string, label *Label) (*Label, *Response, error) { 94 u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) 95 req, err := s.client.NewRequest("PATCH", u, label) 96 if err != nil { 97 return nil, nil, err 98 } 99 100 l := new(Label) 101 resp, err := s.client.Do(ctx, req, l) 102 if err != nil { 103 return nil, resp, err 104 } 105 106 return l, resp, nil 107} 108 109// DeleteLabel deletes a label. 110// 111// GitHub API docs: https://developer.github.com/v3/issues/labels/#delete-a-label 112func (s *IssuesService) DeleteLabel(ctx context.Context, owner string, repo string, name string) (*Response, error) { 113 u := fmt.Sprintf("repos/%v/%v/labels/%v", owner, repo, name) 114 req, err := s.client.NewRequest("DELETE", u, nil) 115 if err != nil { 116 return nil, err 117 } 118 return s.client.Do(ctx, req, nil) 119} 120 121// ListLabelsByIssue lists all labels for an issue. 122// 123// GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-an-issue 124func (s *IssuesService) ListLabelsByIssue(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { 125 u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) 126 u, err := addOptions(u, opts) 127 if err != nil { 128 return nil, nil, err 129 } 130 131 req, err := s.client.NewRequest("GET", u, nil) 132 if err != nil { 133 return nil, nil, err 134 } 135 136 var labels []*Label 137 resp, err := s.client.Do(ctx, req, &labels) 138 if err != nil { 139 return nil, resp, err 140 } 141 142 return labels, resp, nil 143} 144 145// AddLabelsToIssue adds labels to an issue. 146// 147// GitHub API docs: https://developer.github.com/v3/issues/labels/#add-labels-to-an-issue 148func (s *IssuesService) AddLabelsToIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { 149 u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) 150 req, err := s.client.NewRequest("POST", u, labels) 151 if err != nil { 152 return nil, nil, err 153 } 154 155 var l []*Label 156 resp, err := s.client.Do(ctx, req, &l) 157 if err != nil { 158 return nil, resp, err 159 } 160 161 return l, resp, nil 162} 163 164// RemoveLabelForIssue removes a label for an issue. 165// 166// GitHub API docs: https://developer.github.com/v3/issues/labels/#remove-a-label-from-an-issue 167func (s *IssuesService) RemoveLabelForIssue(ctx context.Context, owner string, repo string, number int, label string) (*Response, error) { 168 u := fmt.Sprintf("repos/%v/%v/issues/%d/labels/%v", owner, repo, number, label) 169 req, err := s.client.NewRequest("DELETE", u, nil) 170 if err != nil { 171 return nil, err 172 } 173 174 return s.client.Do(ctx, req, nil) 175} 176 177// ReplaceLabelsForIssue replaces all labels for an issue. 178// 179// GitHub API docs: https://developer.github.com/v3/issues/labels/#set-labels-for-an-issue 180func (s *IssuesService) ReplaceLabelsForIssue(ctx context.Context, owner string, repo string, number int, labels []string) ([]*Label, *Response, error) { 181 u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) 182 req, err := s.client.NewRequest("PUT", u, labels) 183 if err != nil { 184 return nil, nil, err 185 } 186 187 var l []*Label 188 resp, err := s.client.Do(ctx, req, &l) 189 if err != nil { 190 return nil, resp, err 191 } 192 193 return l, resp, nil 194} 195 196// RemoveLabelsForIssue removes all labels for an issue. 197// 198// GitHub API docs: https://developer.github.com/v3/issues/labels/#remove-all-labels-from-an-issue 199func (s *IssuesService) RemoveLabelsForIssue(ctx context.Context, owner string, repo string, number int) (*Response, error) { 200 u := fmt.Sprintf("repos/%v/%v/issues/%d/labels", owner, repo, number) 201 req, err := s.client.NewRequest("DELETE", u, nil) 202 if err != nil { 203 return nil, err 204 } 205 206 return s.client.Do(ctx, req, nil) 207} 208 209// ListLabelsForMilestone lists labels for every issue in a milestone. 210// 211// GitHub API docs: https://developer.github.com/v3/issues/labels/#list-labels-for-issues-in-a-milestone 212func (s *IssuesService) ListLabelsForMilestone(ctx context.Context, owner string, repo string, number int, opts *ListOptions) ([]*Label, *Response, error) { 213 u := fmt.Sprintf("repos/%v/%v/milestones/%d/labels", owner, repo, number) 214 u, err := addOptions(u, opts) 215 if err != nil { 216 return nil, nil, err 217 } 218 219 req, err := s.client.NewRequest("GET", u, nil) 220 if err != nil { 221 return nil, nil, err 222 } 223 224 var labels []*Label 225 resp, err := s.client.Do(ctx, req, &labels) 226 if err != nil { 227 return nil, resp, err 228 } 229 230 return labels, resp, nil 231} 232