74 lines
2.1 KiB
Go
74 lines
2.1 KiB
Go
// Package raw provides a client for interacting with the GitHub raw file API
|
|
package raw
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
|
|
gogithub "github.com/google/go-github/v89/github"
|
|
)
|
|
|
|
// GetRawClientFn is a function type that returns a RawClient instance.
|
|
type GetRawClientFn func(context.Context) (*Client, error)
|
|
|
|
// Client is a client for interacting with the GitHub raw content API.
|
|
type Client struct {
|
|
url *url.URL
|
|
client *gogithub.Client
|
|
}
|
|
|
|
// NewClient creates a new instance of the raw API Client with the provided GitHub client and provided URL.
|
|
func NewClient(client *gogithub.Client, rawURL *url.URL) (*Client, error) {
|
|
newClient, err := gogithub.NewClient(
|
|
gogithub.WithHTTPClient(client.Client()),
|
|
gogithub.WithEnterpriseURLs(rawURL.String(), rawURL.String()),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &Client{client: newClient, url: rawURL}, nil
|
|
}
|
|
|
|
func (c *Client) newRequest(ctx context.Context, method string, urlStr string, body any, opts ...gogithub.RequestOption) (*http.Request, error) {
|
|
return c.client.NewRequest(ctx, method, urlStr, body, opts...)
|
|
}
|
|
|
|
func (c *Client) refURL(owner, repo, ref, path string) string {
|
|
if ref == "" {
|
|
return c.url.JoinPath(owner, repo, "HEAD", path).String()
|
|
}
|
|
return c.url.JoinPath(owner, repo, ref, path).String()
|
|
}
|
|
|
|
func (c *Client) URLFromOpts(opts *ContentOpts, owner, repo, path string) string {
|
|
if opts == nil {
|
|
opts = &ContentOpts{}
|
|
}
|
|
if opts.SHA != "" {
|
|
return c.commitURL(owner, repo, opts.SHA, path)
|
|
}
|
|
return c.refURL(owner, repo, opts.Ref, path)
|
|
}
|
|
|
|
// BlobURL returns the URL for a blob in the raw content API.
|
|
func (c *Client) commitURL(owner, repo, sha, path string) string {
|
|
return c.url.JoinPath(owner, repo, sha, path).String()
|
|
}
|
|
|
|
type ContentOpts struct {
|
|
Ref string
|
|
SHA string
|
|
}
|
|
|
|
// GetRawContent fetches the raw content of a file from a GitHub repository.
|
|
func (c *Client) GetRawContent(ctx context.Context, owner, repo, path string, opts *ContentOpts) (*http.Response, error) {
|
|
url := c.URLFromOpts(opts, owner, repo, path)
|
|
req, err := c.newRequest(ctx, "GET", url, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return c.client.Client().Do(req)
|
|
}
|