1
2
3
4
5
6 package github
7
8 import (
9 "context"
10 "fmt"
11 "net/url"
12 "strings"
13 )
14
15
16 type Reference struct {
17 Ref *string `json:"ref"`
18 URL *string `json:"url"`
19 Object *GitObject `json:"object"`
20 NodeID *string `json:"node_id,omitempty"`
21 }
22
23 func (r Reference) String() string {
24 return Stringify(r)
25 }
26
27
28 type GitObject struct {
29 Type *string `json:"type"`
30 SHA *string `json:"sha"`
31 URL *string `json:"url"`
32 }
33
34 func (o GitObject) String() string {
35 return Stringify(o)
36 }
37
38
39 type createRefRequest struct {
40 Ref *string `json:"ref"`
41 SHA *string `json:"sha"`
42 }
43
44
45 type updateRefRequest struct {
46 SHA *string `json:"sha"`
47 Force *bool `json:"force"`
48 }
49
50
51
52
53 func (s *GitService) GetRef(ctx context.Context, owner string, repo string, ref string) (*Reference, *Response, error) {
54 ref = strings.TrimPrefix(ref, "refs/")
55 u := fmt.Sprintf("repos/%v/%v/git/ref/%v", owner, repo, refURLEscape(ref))
56 req, err := s.client.NewRequest("GET", u, nil)
57 if err != nil {
58 return nil, nil, err
59 }
60
61 r := new(Reference)
62 resp, err := s.client.Do(ctx, req, r)
63 if err != nil {
64 return nil, resp, err
65 }
66
67 return r, resp, nil
68 }
69
70
71
72 func refURLEscape(ref string) string {
73 parts := strings.Split(ref, "/")
74 for i, s := range parts {
75 parts[i] = url.PathEscape(s)
76 }
77 return strings.Join(parts, "/")
78 }
79
80
81
82 type ReferenceListOptions struct {
83 Ref string `url:"-"`
84
85 ListOptions
86 }
87
88
89
90
91
92 func (s *GitService) ListMatchingRefs(ctx context.Context, owner, repo string, opts *ReferenceListOptions) ([]*Reference, *Response, error) {
93 var ref string
94 if opts != nil {
95 ref = strings.TrimPrefix(opts.Ref, "refs/")
96 }
97 u := fmt.Sprintf("repos/%v/%v/git/matching-refs/%v", owner, repo, refURLEscape(ref))
98 u, err := addOptions(u, opts)
99 if err != nil {
100 return nil, nil, err
101 }
102
103 req, err := s.client.NewRequest("GET", u, nil)
104 if err != nil {
105 return nil, nil, err
106 }
107
108 var rs []*Reference
109 resp, err := s.client.Do(ctx, req, &rs)
110 if err != nil {
111 return nil, resp, err
112 }
113
114 return rs, resp, nil
115 }
116
117
118
119
120 func (s *GitService) CreateRef(ctx context.Context, owner string, repo string, ref *Reference) (*Reference, *Response, error) {
121 u := fmt.Sprintf("repos/%v/%v/git/refs", owner, repo)
122 req, err := s.client.NewRequest("POST", u, &createRefRequest{
123
124 Ref: String("refs/" + strings.TrimPrefix(*ref.Ref, "refs/")),
125 SHA: ref.Object.SHA,
126 })
127 if err != nil {
128 return nil, nil, err
129 }
130
131 r := new(Reference)
132 resp, err := s.client.Do(ctx, req, r)
133 if err != nil {
134 return nil, resp, err
135 }
136
137 return r, resp, nil
138 }
139
140
141
142
143 func (s *GitService) UpdateRef(ctx context.Context, owner string, repo string, ref *Reference, force bool) (*Reference, *Response, error) {
144 refPath := strings.TrimPrefix(*ref.Ref, "refs/")
145 u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refURLEscape(refPath))
146 req, err := s.client.NewRequest("PATCH", u, &updateRefRequest{
147 SHA: ref.Object.SHA,
148 Force: &force,
149 })
150 if err != nil {
151 return nil, nil, err
152 }
153
154 r := new(Reference)
155 resp, err := s.client.Do(ctx, req, r)
156 if err != nil {
157 return nil, resp, err
158 }
159
160 return r, resp, nil
161 }
162
163
164
165
166 func (s *GitService) DeleteRef(ctx context.Context, owner string, repo string, ref string) (*Response, error) {
167 ref = strings.TrimPrefix(ref, "refs/")
168 u := fmt.Sprintf("repos/%v/%v/git/refs/%v", owner, repo, refURLEscape(ref))
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
View as plain text