tools/eksDistroBuildToolingOpsTools/pkg/repoManager/repoManager.go (66 lines of code) (raw):
package repoManager
import (
"context"
"fmt"
"io"
"strings"
gogithub "github.com/google/go-github/v48/github"
"github.com/aws/eks-distro-build-tooling/tools/eksDistroBuildToolingOpsTools/pkg/github"
"github.com/aws/eks-distro-build-tooling/tools/eksDistroBuildToolingOpsTools/pkg/logger"
"github.com/aws/eks-distro-build-tooling/tools/eksDistroBuildToolingOpsTools/pkg/retrier"
)
type RepoContentManager struct {
client *github.Client
retrier *retrier.Retrier
sourceOwner string
sourceRepo string
}
type Opts struct {
SourceOwner string
SourceRepo string
}
func New(r *retrier.Retrier, githubClient *github.Client, opts *Opts) *RepoContentManager {
return &RepoContentManager{
client: githubClient,
sourceOwner: opts.SourceOwner,
sourceRepo: opts.SourceRepo,
retrier: r,
}
}
type GetFileOpts struct {
Owner string
Repo string
Path string
Ref *gogithub.RepositoryContentGetOptions // Can be a SHA, branch, or tag. Optional
}
func (p *RepoContentManager) GetFile(ctx context.Context, opts *GetFileOpts) (*gogithub.RepositoryContent, error) {
var fileContent *gogithub.RepositoryContent
var resp *gogithub.Response
var err error
fileContent, _, resp, err = p.client.Repositories.GetContents(ctx, opts.Owner, opts.Repo, opts.Path, opts.Ref)
if resp != nil {
if resp.StatusCode == github.SecondaryRateLimitStatusCode {
b, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("reading Github response body: %v", err)
}
if strings.Contains(string(b), github.SecondaryRateLimitResponse) {
logger.V(4).Info("rate limited while attempting to get github file")
return nil, fmt.Errorf("rate limited while attempting to get github file")
}
}
if resp.StatusCode == github.ResourceGoneStatusCode {
_, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("reading Github response body: %v", err)
}
}
}
if err != nil {
logger.V(4).Error(err, "getting file from Github", "response", resp)
return nil, fmt.Errorf("getting file from Github: %v; resp: %v", err, resp)
}
logger.V(4).Info("get file response", "response", resp.Response.StatusCode)
logger.V(1).Info("Github file received", "fileContent URL", fileContent.GetHTMLURL())
return fileContent, nil
}