issues_labels.go 7.6 KB

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