package github
import (
"context"
"fmt"
"net/url"
"strings"
)
type Reference struct {
Ref *string `json:"ref"`
URL *string `json:"url"`
Object *GitObject `json:"object"`
NodeID *string `json:"node_id,omitempty"`
}
func (r Reference ) String () string {
return Stringify (r )
}
type GitObject struct {
Type *string `json:"type"`
SHA *string `json:"sha"`
URL *string `json:"url"`
}
func (o GitObject ) String () string {
return Stringify (o )
}
type createRefRequest struct {
Ref *string `json:"ref"`
SHA *string `json:"sha"`
}
type updateRefRequest struct {
SHA *string `json:"sha"`
Force *bool `json:"force"`
}
func (s *GitService ) GetRef (ctx context .Context , owner string , repo string , ref string ) (*Reference , *Response , error ) {
ref = strings .TrimPrefix (ref , "refs/" )
u := fmt .Sprintf ("repos/%v/%v/git/ref/%v" , owner , repo , refURLEscape (ref ))
req , err := s .client .NewRequest ("GET" , u , nil )
if err != nil {
return nil , nil , err
}
r := new (Reference )
resp , err := s .client .Do (ctx , req , r )
if err != nil {
return nil , resp , err
}
return r , resp , nil
}
func refURLEscape(ref string ) string {
parts := strings .Split (ref , "/" )
for i , s := range parts {
parts [i ] = url .PathEscape (s )
}
return strings .Join (parts , "/" )
}
type ReferenceListOptions struct {
Ref string `url:"-"`
ListOptions
}
func (s *GitService ) ListMatchingRefs (ctx context .Context , owner , repo string , opts *ReferenceListOptions ) ([]*Reference , *Response , error ) {
var ref string
if opts != nil {
ref = strings .TrimPrefix (opts .Ref , "refs/" )
}
u := fmt .Sprintf ("repos/%v/%v/git/matching-refs/%v" , owner , repo , refURLEscape (ref ))
u , err := addOptions (u , opts )
if err != nil {
return nil , nil , err
}
req , err := s .client .NewRequest ("GET" , u , nil )
if err != nil {
return nil , nil , err
}
var rs []*Reference
resp , err := s .client .Do (ctx , req , &rs )
if err != nil {
return nil , resp , err
}
return rs , resp , nil
}
func (s *GitService ) CreateRef (ctx context .Context , owner string , repo string , ref *Reference ) (*Reference , *Response , error ) {
u := fmt .Sprintf ("repos/%v/%v/git/refs" , owner , repo )
req , err := s .client .NewRequest ("POST" , u , &createRefRequest {
Ref : String ("refs/" + strings .TrimPrefix (*ref .Ref , "refs/" )),
SHA : ref .Object .SHA ,
})
if err != nil {
return nil , nil , err
}
r := new (Reference )
resp , err := s .client .Do (ctx , req , r )
if err != nil {
return nil , resp , err
}
return r , resp , nil
}
func (s *GitService ) UpdateRef (ctx context .Context , owner string , repo string , ref *Reference , force bool ) (*Reference , *Response , error ) {
refPath := strings .TrimPrefix (*ref .Ref , "refs/" )
u := fmt .Sprintf ("repos/%v/%v/git/refs/%v" , owner , repo , refURLEscape (refPath ))
req , err := s .client .NewRequest ("PATCH" , u , &updateRefRequest {
SHA : ref .Object .SHA ,
Force : &force ,
})
if err != nil {
return nil , nil , err
}
r := new (Reference )
resp , err := s .client .Do (ctx , req , r )
if err != nil {
return nil , resp , err
}
return r , resp , nil
}
func (s *GitService ) DeleteRef (ctx context .Context , owner string , repo string , ref string ) (*Response , error ) {
ref = strings .TrimPrefix (ref , "refs/" )
u := fmt .Sprintf ("repos/%v/%v/git/refs/%v" , owner , repo , refURLEscape (ref ))
req , err := s .client .NewRequest ("DELETE" , u , nil )
if err != nil {
return nil , err
}
return s .client .Do (ctx , req , nil )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .