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
36 changes: 30 additions & 6 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,9 +46,14 @@ 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)
if err := point.RequestRelease(d.GetRequest, args.Refresh); err != nil {
log.Warnf("failed to request release for %s: %v", point.Repo, err)
}

if point.Point == path { // 与仓库路径相同
if point.Release == nil {
return nil, fmt.Errorf("failed to get release for %s", point.Repo)
}
files = append(files, point.GetLatestRelease()...)
if d.Addition.ShowReadme {
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
Expand All @@ -70,21 +76,31 @@ 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)
if err := point.RequestReleases(d.GetRequest, args.Refresh); err != nil {
log.Warnf("failed to request releases for %s: %v", point.Repo, err)
}

if point.Point == path { // 与仓库路径相同
if point.Releases == nil {
return nil, fmt.Errorf("failed to get releases for %s", point.Repo)
}
files = append(files, point.GetAllVersion()...)
if d.Addition.ShowReadme {
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
Expand All @@ -104,12 +120,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 +140,9 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
if tagName == "" {
continue
}
if point.Releases == nil {
return nil, fmt.Errorf("failed to get releases for %s", point.Repo)
}

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

Expand Down
70 changes: 57 additions & 13 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 @@ -200,9 +236,17 @@ func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {

func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error), refresh bool) []File {
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
}
otherFile := new([]FileInfo)
if err := json.Unmarshal(resp.Body(), otherFile); err != nil {
m.OtherFile = nil
return nil
}
m.OtherFile = otherFile
}

files := make([]File, 0)
Expand Down
1 change: 1 addition & 0 deletions drivers/github_releases/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func (d *GithubReleases) GetRequest(url string) (*resty.Response, error) {
}
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