99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
package github
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/google/go-github/v56/github"
|
|
"golang.org/x/oauth2"
|
|
)
|
|
|
|
type Client struct {
|
|
client *github.Client
|
|
owner string
|
|
repo string
|
|
}
|
|
|
|
type Content struct {
|
|
Path string
|
|
Content string
|
|
SHA string
|
|
LastUpdated time.Time
|
|
}
|
|
|
|
func NewClient(token, owner, repo string) *Client {
|
|
ctx := context.Background()
|
|
ts := oauth2.StaticTokenSource(
|
|
&oauth2.Token{AccessToken: token},
|
|
)
|
|
tc := oauth2.NewClient(ctx, ts)
|
|
client := github.NewClient(tc)
|
|
|
|
return &Client{
|
|
client: client,
|
|
owner: owner,
|
|
repo: repo,
|
|
}
|
|
}
|
|
|
|
func (c *Client) GetFileContent(path string) (*Content, error) {
|
|
ctx := context.Background()
|
|
|
|
fileContent, _, _, err := c.client.Repositories.GetContents(ctx, c.owner, c.repo, path, nil)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get file content: %w", err)
|
|
}
|
|
|
|
content, err := fileContent.GetContent()
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to decode content: %w", err)
|
|
}
|
|
|
|
return &Content{
|
|
Path: path,
|
|
Content: content,
|
|
SHA: fileContent.GetSHA(),
|
|
LastUpdated: time.Now(),
|
|
}, nil
|
|
}
|
|
|
|
func (c *Client) ListDirectory(path string) ([]*Content, error) {
|
|
ctx := context.Background()
|
|
|
|
_, contents, _, err := c.client.Repositories.GetContents(ctx, c.owner, c.repo, path, nil)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to list directory: %w", err)
|
|
}
|
|
|
|
var result []*Content
|
|
for _, content := range contents {
|
|
if content.GetType() == "file" {
|
|
fileContent, err := c.GetFileContent(content.GetPath())
|
|
if err != nil {
|
|
continue
|
|
}
|
|
result = append(result, fileContent)
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (c *Client) GetLastCommit() (*github.RepositoryCommit, error) {
|
|
ctx := context.Background()
|
|
|
|
commits, _, err := c.client.Repositories.ListCommits(ctx, c.owner, c.repo, &github.CommitsListOptions{
|
|
ListOptions: github.ListOptions{PerPage: 1},
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get last commit: %w", err)
|
|
}
|
|
|
|
if len(commits) == 0 {
|
|
return nil, fmt.Errorf("no commits found")
|
|
}
|
|
|
|
return commits[0], nil
|
|
}
|