Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 57 additions & 8 deletions drivers/github_releases/driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (
"github.com/OpenListTeam/OpenList/v4/internal/errs"
"github.com/OpenListTeam/OpenList/v4/internal/model"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
log "github.com/sirupsen/logrus"
)

type GithubReleases struct {
Expand Down Expand Up @@ -45,12 +46,25 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
point := &d.points[i]

if !d.Addition.ShowAllVersion { // latest
point.RequestRelease(d.GetRequest, args.Refresh)
err := point.RequestRelease(d.GetRequest, args.Refresh)
if err != nil {
log.Warnf("failed to request release for %s: %v", point.Repo, err)
}

if point.Point == path { // 与仓库路径相同
if point.Release == nil {
if err != nil {
return nil, fmt.Errorf("failed to get release for %s: %w", point.Repo, err)
}
return nil, fmt.Errorf("failed to get release for %s: unknown error", point.Repo)
}
Comment thread
xrgzs marked this conversation as resolved.
files = append(files, point.GetLatestRelease()...)
if d.Addition.ShowReadme {
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
otherFiles, err := point.GetOtherFile(d.GetRequest, args.Refresh)
if err != nil {
return nil, fmt.Errorf("failed to get other files for %s: %w", point.Repo, err)
}
files = append(files, otherFiles...)
}
if d.Addition.ShowSourceCode {
files = append(files, point.GetSourceCode()...)
Expand All @@ -60,6 +74,9 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
if nextDir == "" {
continue
}
if err != nil {
return nil, fmt.Errorf("failed to get release for %s: %w", point.Repo, err)
}

hasSameDir := false
for index := range files {
Expand All @@ -70,30 +87,51 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
}
}
if !hasSameDir {
var updateAt, createAt string
if point.Release != nil {
updateAt = point.Release.PublishedAt
createAt = point.Release.CreatedAt
}
files = append(files, File{
Path: stdpath.Join(path, nextDir),
FileName: nextDir,
Size: point.GetLatestSize(),
UpdateAt: point.Release.PublishedAt,
CreateAt: point.Release.CreatedAt,
UpdateAt: updateAt,
CreateAt: createAt,
Type: "dir",
Url: "",
})
}
}
} else { // all version
point.RequestReleases(d.GetRequest, args.Refresh)
err := point.RequestReleases(d.GetRequest, args.Refresh)
if err != nil {
log.Warnf("failed to request releases for %s: %v", point.Repo, err)
}

if point.Point == path { // 与仓库路径相同
if point.Releases == nil {
if err != nil {
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
}
return nil, fmt.Errorf("failed to get releases for %s: unknown error", point.Repo)
}
Comment thread
xrgzs marked this conversation as resolved.
files = append(files, point.GetAllVersion()...)
if d.Addition.ShowReadme {
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
otherFiles, err := point.GetOtherFile(d.GetRequest, args.Refresh)
if err != nil {
return nil, fmt.Errorf("failed to get other files for %s: %w", point.Repo, err)
}
files = append(files, otherFiles...)
}
} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
nextDir := GetNextDir(point.Point, path)
if nextDir == "" {
continue
}
if err != nil {
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
}

hasSameDir := false
for index := range files {
Expand All @@ -104,12 +142,17 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
}
}
if !hasSameDir {
var updateAt, createAt string
if point.Releases != nil && len(*point.Releases) > 0 {
updateAt = (*point.Releases)[0].PublishedAt
createAt = (*point.Releases)[0].CreatedAt
}
files = append(files, File{
FileName: nextDir,
Path: stdpath.Join(path, nextDir),
Size: point.GetAllVersionSize(),
UpdateAt: (*point.Releases)[0].PublishedAt,
CreateAt: (*point.Releases)[0].CreatedAt,
UpdateAt: updateAt,
CreateAt: createAt,
Type: "dir",
Url: "",
})
Expand All @@ -119,6 +162,12 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
if tagName == "" {
continue
}
if point.Releases == nil {
if err != nil {
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
}
return nil, fmt.Errorf("failed to get releases for %s: unknown error", point.Repo)
}

files = append(files, point.GetReleaseByTagName(tagName)...)

Expand Down
74 changes: 59 additions & 15 deletions drivers/github_releases/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,33 +19,54 @@ type MountPoint struct {
}

// 请求最新版本
func (m *MountPoint) RequestRelease(get func(url string) (*resty.Response, error), refresh bool) {
func (m *MountPoint) RequestRelease(get func(url string) (*resty.Response, error), refresh bool) error {
if m.Repo == "" {
return
return nil
}

if m.Release == nil || refresh {
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/releases/latest")
m.Release = new(Release)
json.Unmarshal(resp.Body(), m.Release)
resp, err := get("https://api.github.com/repos/" + m.Repo + "/releases/latest")
if err != nil {
m.Release = nil
return err
}
release := new(Release)
if err := json.Unmarshal(resp.Body(), release); err != nil {
m.Release = nil
return err
}
m.Release = release
}
return nil
}

// 请求所有版本
func (m *MountPoint) RequestReleases(get func(url string) (*resty.Response, error), refresh bool) {
func (m *MountPoint) RequestReleases(get func(url string) (*resty.Response, error), refresh bool) error {
if m.Repo == "" {
return
return nil
}

if m.Releases == nil || refresh {
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/releases")
m.Releases = new([]Release)
json.Unmarshal(resp.Body(), m.Releases)
resp, err := get("https://api.github.com/repos/" + m.Repo + "/releases")
if err != nil {
m.Releases = nil
return err
}
releases := new([]Release)
if err := json.Unmarshal(resp.Body(), releases); err != nil {
m.Releases = nil
return err
}
m.Releases = releases
}
return nil
}

// 获取最新版本
func (m *MountPoint) GetLatestRelease() []File {
if m.Release == nil {
return nil
}
files := make([]File, 0, len(m.Release.Assets))
for _, asset := range m.Release.Assets {
files = append(files, File{
Expand All @@ -63,6 +84,9 @@ func (m *MountPoint) GetLatestRelease() []File {

// 获取最新版本大小
func (m *MountPoint) GetLatestSize() int64 {
if m.Release == nil {
return 0
}
size := int64(0)
for _, asset := range m.Release.Assets {
size += asset.Size
Expand All @@ -72,6 +96,9 @@ func (m *MountPoint) GetLatestSize() int64 {

// 获取所有版本
func (m *MountPoint) GetAllVersion() []File {
if m.Releases == nil {
return nil
}
files := make([]File, 0)
for _, release := range *m.Releases {
file := File{
Expand All @@ -93,6 +120,9 @@ func (m *MountPoint) GetAllVersion() []File {

// 根据版本号获取版本
func (m *MountPoint) GetReleaseByTagName(tagName string) []File {
if m.Releases == nil {
return nil
}
for _, item := range *m.Releases {
if item.TagName == tagName {
files := make([]File, 0)
Expand Down Expand Up @@ -145,6 +175,9 @@ func (m *MountPoint) GetAllVersionSize() int64 {
}

func (m *MountPoint) GetSourceCode() []File {
if m.Release == nil {
return nil
}
files := make([]File, 0)

// 无法获取文件大小,此处设为 1
Expand All @@ -171,6 +204,9 @@ func (m *MountPoint) GetSourceCode() []File {
}

func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {
if m.Releases == nil {
return nil
}
for _, item := range *m.Releases {
if item.TagName == tagName {
files := make([]File, 0)
Expand Down Expand Up @@ -198,11 +234,19 @@ func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {
return nil
}

func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error), refresh bool) []File {
func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error), refresh bool) ([]File, error) {
if m.OtherFile == nil || refresh {
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/contents")
m.OtherFile = new([]FileInfo)
json.Unmarshal(resp.Body(), m.OtherFile)
resp, err := get("https://api.github.com/repos/" + m.Repo + "/contents")
if err != nil {
m.OtherFile = nil
return nil, err
}
Comment thread
xrgzs marked this conversation as resolved.
otherFile := new([]FileInfo)
if err := json.Unmarshal(resp.Body(), otherFile); err != nil {
m.OtherFile = nil
return nil, err
}
m.OtherFile = otherFile
}

files := make([]File, 0)
Expand All @@ -220,7 +264,7 @@ func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error),
})
}
}
return files
return files, nil
}

type File struct {
Expand Down
3 changes: 1 addition & 2 deletions drivers/github_releases/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (

"github.com/OpenListTeam/OpenList/v4/drivers/base"
"github.com/go-resty/resty/v2"
log "github.com/sirupsen/logrus"
)

// 发送 GET 请求
Expand All @@ -23,7 +22,7 @@ func (d *GithubReleases) GetRequest(url string) (*resty.Response, error) {
return nil, err
}
if res.StatusCode() != 200 {
log.Warn("failed to get request: ", res.StatusCode(), res.String())
return nil, fmt.Errorf("github api error: status %d", res.StatusCode())
}
return res, nil
}
Expand Down
Loading