Skip to content

Commit a42e367

Browse files
xrgzsclaudeMimoGitHub Copilot
authored
fix(drivers/github_releases): skip broken repos instead of returning 500 (#2494)
* fix(drivers/github_releases): skip broken repos instead of returning 500 When multiple repos are configured and one fails (404, rate limit, etc.), the driver now logs a warning and skips that repo instead of panicking with a nil pointer dereference that caused a 500 error for the entire storage. Added proper error propagation from GetRequest through RequestRelease/RequestReleases/GetOtherFile, and nil checks on all Release/Releases dereferences. Instead of hiding broken repos entirely, still display them as directory entries in parent listings. Return an error only when the user navigates into a broken repo. Co-authored-by: Claude Code <noreply@anthropic.com> Co-authored-by: Mimo <208276378+mimo@users.noreply.github.com> * fix(drivers/github_releases): apply patches Co-authored-by: GitHub Copilot <copilot@github.com> Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> --------- Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> Co-authored-by: Claude Code <noreply@anthropic.com> Co-authored-by: Mimo <208276378+mimo@users.noreply.github.com> Co-authored-by: GitHub Copilot <copilot@github.com>
1 parent f454733 commit a42e367

3 files changed

Lines changed: 117 additions & 25 deletions

File tree

drivers/github_releases/driver.go

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/OpenListTeam/OpenList/v4/internal/errs"
1212
"github.com/OpenListTeam/OpenList/v4/internal/model"
1313
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
14+
log "github.com/sirupsen/logrus"
1415
)
1516

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

4748
if !d.Addition.ShowAllVersion { // latest
48-
point.RequestRelease(d.GetRequest, args.Refresh)
49+
err := point.RequestRelease(d.GetRequest, args.Refresh)
50+
if err != nil {
51+
log.Warnf("failed to request release for %s: %v", point.Repo, err)
52+
}
4953

5054
if point.Point == path { // 与仓库路径相同
55+
if point.Release == nil {
56+
if err != nil {
57+
return nil, fmt.Errorf("failed to get release for %s: %w", point.Repo, err)
58+
}
59+
return nil, fmt.Errorf("failed to get release for %s: unknown error", point.Repo)
60+
}
5161
files = append(files, point.GetLatestRelease()...)
5262
if d.Addition.ShowReadme {
53-
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
63+
otherFiles, err := point.GetOtherFile(d.GetRequest, args.Refresh)
64+
if err != nil {
65+
return nil, fmt.Errorf("failed to get other files for %s: %w", point.Repo, err)
66+
}
67+
files = append(files, otherFiles...)
5468
}
5569
if d.Addition.ShowSourceCode {
5670
files = append(files, point.GetSourceCode()...)
@@ -60,6 +74,9 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
6074
if nextDir == "" {
6175
continue
6276
}
77+
if err != nil {
78+
return nil, fmt.Errorf("failed to get release for %s: %w", point.Repo, err)
79+
}
6380

6481
hasSameDir := false
6582
for index := range files {
@@ -70,30 +87,51 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
7087
}
7188
}
7289
if !hasSameDir {
90+
var updateAt, createAt string
91+
if point.Release != nil {
92+
updateAt = point.Release.PublishedAt
93+
createAt = point.Release.CreatedAt
94+
}
7395
files = append(files, File{
7496
Path: stdpath.Join(path, nextDir),
7597
FileName: nextDir,
7698
Size: point.GetLatestSize(),
77-
UpdateAt: point.Release.PublishedAt,
78-
CreateAt: point.Release.CreatedAt,
99+
UpdateAt: updateAt,
100+
CreateAt: createAt,
79101
Type: "dir",
80102
Url: "",
81103
})
82104
}
83105
}
84106
} else { // all version
85-
point.RequestReleases(d.GetRequest, args.Refresh)
107+
err := point.RequestReleases(d.GetRequest, args.Refresh)
108+
if err != nil {
109+
log.Warnf("failed to request releases for %s: %v", point.Repo, err)
110+
}
86111

87112
if point.Point == path { // 与仓库路径相同
113+
if point.Releases == nil {
114+
if err != nil {
115+
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
116+
}
117+
return nil, fmt.Errorf("failed to get releases for %s: unknown error", point.Repo)
118+
}
88119
files = append(files, point.GetAllVersion()...)
89120
if d.Addition.ShowReadme {
90-
files = append(files, point.GetOtherFile(d.GetRequest, args.Refresh)...)
121+
otherFiles, err := point.GetOtherFile(d.GetRequest, args.Refresh)
122+
if err != nil {
123+
return nil, fmt.Errorf("failed to get other files for %s: %w", point.Repo, err)
124+
}
125+
files = append(files, otherFiles...)
91126
}
92127
} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
93128
nextDir := GetNextDir(point.Point, path)
94129
if nextDir == "" {
95130
continue
96131
}
132+
if err != nil {
133+
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
134+
}
97135

98136
hasSameDir := false
99137
for index := range files {
@@ -104,12 +142,17 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
104142
}
105143
}
106144
if !hasSameDir {
145+
var updateAt, createAt string
146+
if point.Releases != nil && len(*point.Releases) > 0 {
147+
updateAt = (*point.Releases)[0].PublishedAt
148+
createAt = (*point.Releases)[0].CreatedAt
149+
}
107150
files = append(files, File{
108151
FileName: nextDir,
109152
Path: stdpath.Join(path, nextDir),
110153
Size: point.GetAllVersionSize(),
111-
UpdateAt: (*point.Releases)[0].PublishedAt,
112-
CreateAt: (*point.Releases)[0].CreatedAt,
154+
UpdateAt: updateAt,
155+
CreateAt: createAt,
113156
Type: "dir",
114157
Url: "",
115158
})
@@ -119,6 +162,12 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
119162
if tagName == "" {
120163
continue
121164
}
165+
if point.Releases == nil {
166+
if err != nil {
167+
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
168+
}
169+
return nil, fmt.Errorf("failed to get releases for %s: unknown error", point.Repo)
170+
}
122171

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

drivers/github_releases/types.go

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,33 +19,54 @@ type MountPoint struct {
1919
}
2020

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

2727
if m.Release == nil || refresh {
28-
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/releases/latest")
29-
m.Release = new(Release)
30-
json.Unmarshal(resp.Body(), m.Release)
28+
resp, err := get("https://api.github.com/repos/" + m.Repo + "/releases/latest")
29+
if err != nil {
30+
m.Release = nil
31+
return err
32+
}
33+
release := new(Release)
34+
if err := json.Unmarshal(resp.Body(), release); err != nil {
35+
m.Release = nil
36+
return err
37+
}
38+
m.Release = release
3139
}
40+
return nil
3241
}
3342

3443
// 请求所有版本
35-
func (m *MountPoint) RequestReleases(get func(url string) (*resty.Response, error), refresh bool) {
44+
func (m *MountPoint) RequestReleases(get func(url string) (*resty.Response, error), refresh bool) error {
3645
if m.Repo == "" {
37-
return
46+
return nil
3847
}
3948

4049
if m.Releases == nil || refresh {
41-
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/releases")
42-
m.Releases = new([]Release)
43-
json.Unmarshal(resp.Body(), m.Releases)
50+
resp, err := get("https://api.github.com/repos/" + m.Repo + "/releases")
51+
if err != nil {
52+
m.Releases = nil
53+
return err
54+
}
55+
releases := new([]Release)
56+
if err := json.Unmarshal(resp.Body(), releases); err != nil {
57+
m.Releases = nil
58+
return err
59+
}
60+
m.Releases = releases
4461
}
62+
return nil
4563
}
4664

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

6485
// 获取最新版本大小
6586
func (m *MountPoint) GetLatestSize() int64 {
87+
if m.Release == nil {
88+
return 0
89+
}
6690
size := int64(0)
6791
for _, asset := range m.Release.Assets {
6892
size += asset.Size
@@ -72,6 +96,9 @@ func (m *MountPoint) GetLatestSize() int64 {
7296

7397
// 获取所有版本
7498
func (m *MountPoint) GetAllVersion() []File {
99+
if m.Releases == nil {
100+
return nil
101+
}
75102
files := make([]File, 0)
76103
for _, release := range *m.Releases {
77104
file := File{
@@ -93,6 +120,9 @@ func (m *MountPoint) GetAllVersion() []File {
93120

94121
// 根据版本号获取版本
95122
func (m *MountPoint) GetReleaseByTagName(tagName string) []File {
123+
if m.Releases == nil {
124+
return nil
125+
}
96126
for _, item := range *m.Releases {
97127
if item.TagName == tagName {
98128
files := make([]File, 0)
@@ -145,6 +175,9 @@ func (m *MountPoint) GetAllVersionSize() int64 {
145175
}
146176

147177
func (m *MountPoint) GetSourceCode() []File {
178+
if m.Release == nil {
179+
return nil
180+
}
148181
files := make([]File, 0)
149182

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

173206
func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {
207+
if m.Releases == nil {
208+
return nil
209+
}
174210
for _, item := range *m.Releases {
175211
if item.TagName == tagName {
176212
files := make([]File, 0)
@@ -198,11 +234,19 @@ func (m *MountPoint) GetSourceCodeByTagName(tagName string) []File {
198234
return nil
199235
}
200236

201-
func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error), refresh bool) []File {
237+
func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error), refresh bool) ([]File, error) {
202238
if m.OtherFile == nil || refresh {
203-
resp, _ := get("https://api.github.com/repos/" + m.Repo + "/contents")
204-
m.OtherFile = new([]FileInfo)
205-
json.Unmarshal(resp.Body(), m.OtherFile)
239+
resp, err := get("https://api.github.com/repos/" + m.Repo + "/contents")
240+
if err != nil {
241+
m.OtherFile = nil
242+
return nil, err
243+
}
244+
otherFile := new([]FileInfo)
245+
if err := json.Unmarshal(resp.Body(), otherFile); err != nil {
246+
m.OtherFile = nil
247+
return nil, err
248+
}
249+
m.OtherFile = otherFile
206250
}
207251

208252
files := make([]File, 0)
@@ -220,7 +264,7 @@ func (m *MountPoint) GetOtherFile(get func(url string) (*resty.Response, error),
220264
})
221265
}
222266
}
223-
return files
267+
return files, nil
224268
}
225269

226270
type File struct {

drivers/github_releases/util.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77

88
"github.com/OpenListTeam/OpenList/v4/drivers/base"
99
"github.com/go-resty/resty/v2"
10-
log "github.com/sirupsen/logrus"
1110
)
1211

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

0 commit comments

Comments
 (0)