Skip to content

Commit 5a5d8d6

Browse files
xrgzsGitHub Copilot
andauthored
refactor(drivers/github_releases): remove internal caching and add pagination support (#2775)
* refactor(github_releases): remove internal caching, use global cache instead - Remove Release/Releases/OtherFile cache fields from MountPoint struct - Convert instance methods to pure functions (releaseToFiles, releasesToVersionDirs, etc.) - Make List() fetch fresh data from GitHub API on every call - Add githubGet helper to centralize GitHub API requests - Remove unused GetRequest method and IsAncestorDir function Co-authored-by: GitHub Copilot <copilot@github.com> * feat(github_releases): add pagination and max page limit for all versions - Add PerPage config to control releases per page (default 30, max 100) - Add MaxPage config to limit max pages fetched (0 = unlimited) - Rewrite getAllReleases to support automatic pagination Co-authored-by: GitHub Copilot <copilot@github.com> * chore(github_releases): move utils from driver.go to util.go Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> * chore(github_releases): revert changes to GetRequest Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> * chore(github_releases): use more common format for github proxy url Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> * fix(github_releases): show_readme in empty releases case Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> * fix(github_releases): preserve README and LICENSE name variants Co-authored-by: Copilot <copilot@github.com> Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> --------- Signed-off-by: MadDogOwner <xiaoran@xrgzs.top> Co-authored-by: GitHub Copilot <copilot@github.com>
1 parent 061c1e2 commit 5a5d8d6

4 files changed

Lines changed: 207 additions & 247 deletions

File tree

drivers/github_releases/driver.go

Lines changed: 55 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -45,134 +45,126 @@ func (d *GithubReleases) List(ctx context.Context, dir model.Obj, args model.Lis
4545
for i := range d.points {
4646
point := &d.points[i]
4747

48-
if !d.Addition.ShowAllVersion { // latest
49-
err := point.RequestRelease(d.GetRequest, args.Refresh)
48+
if !d.Addition.ShowAllVersion {
49+
// latest version mode
50+
release, err := d.getLatestRelease(point.Repo)
5051
if err != nil {
5152
log.Warnf("failed to request release for %s: %v", point.Repo, err)
53+
continue
54+
}
55+
if release == nil {
56+
continue
5257
}
5358

54-
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-
}
61-
files = append(files, point.GetLatestRelease()...)
59+
if point.Point == path {
60+
// 当前目录就是仓库挂载点
61+
files = append(files, releaseToFiles(point.Point, release)...)
6262
if d.Addition.ShowReadme {
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)
63+
other, err := d.fetchRepoFiles(point.Repo)
64+
if err == nil {
65+
files = append(files, otherFiles(point.Point, other)...)
66+
} else {
67+
log.Warnf("failed to get other files for %s: %v", point.Repo, err)
6668
}
67-
files = append(files, otherFiles...)
6869
}
6970
if d.Addition.ShowSourceCode {
70-
files = append(files, point.GetSourceCode()...)
71+
files = append(files, sourceCodeFiles(point.Point, release)...)
7172
}
72-
} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
73+
} else if strings.HasPrefix(point.Point, path) {
74+
// 仓库目录的父目录,需要聚合显示
7375
nextDir := GetNextDir(point.Point, path)
7476
if nextDir == "" {
7577
continue
7678
}
77-
if err != nil {
78-
return nil, fmt.Errorf("failed to get release for %s: %w", point.Repo, err)
79-
}
8079

8180
hasSameDir := false
8281
for index := range files {
8382
if files[index].GetName() == nextDir {
8483
hasSameDir = true
85-
files[index].Size += point.GetLatestSize()
84+
files[index].Size += releaseSize(release)
8685
break
8786
}
8887
}
8988
if !hasSameDir {
90-
var updateAt, createAt string
91-
if point.Release != nil {
92-
updateAt = point.Release.PublishedAt
93-
createAt = point.Release.CreatedAt
94-
}
9589
files = append(files, File{
9690
Path: stdpath.Join(path, nextDir),
9791
FileName: nextDir,
98-
Size: point.GetLatestSize(),
99-
UpdateAt: updateAt,
100-
CreateAt: createAt,
92+
Size: releaseSize(release),
93+
UpdateAt: release.PublishedAt,
94+
CreateAt: release.CreatedAt,
10195
Type: "dir",
10296
Url: "",
10397
})
10498
}
10599
}
106-
} else { // all version
107-
err := point.RequestReleases(d.GetRequest, args.Refresh)
100+
} else {
101+
// all versions mode
102+
releases, err := d.getAllReleases(point.Repo)
108103
if err != nil {
109104
log.Warnf("failed to request releases for %s: %v", point.Repo, err)
105+
continue
110106
}
111-
112-
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)
107+
if len(releases) == 0 {
108+
// no releases but may still have repo files (e.g. README)
109+
if point.Point == path && d.Addition.ShowReadme {
110+
other, err := d.fetchRepoFiles(point.Repo)
111+
if err == nil {
112+
files = append(files, otherFiles(point.Point, other)...)
113+
} else {
114+
log.Warnf("failed to get other files for %s: %v", point.Repo, err)
116115
}
117-
return nil, fmt.Errorf("failed to get releases for %s: unknown error", point.Repo)
118116
}
119-
files = append(files, point.GetAllVersion()...)
117+
continue
118+
}
119+
120+
if point.Point == path {
121+
// 当前目录就是仓库挂载点
122+
files = append(files, releasesToVersionDirs(point.Point, releases)...)
120123
if d.Addition.ShowReadme {
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+
other, err := d.fetchRepoFiles(point.Repo)
125+
if err == nil {
126+
files = append(files, otherFiles(point.Point, other)...)
127+
} else {
128+
log.Warnf("failed to get other files for %s: %v", point.Repo, err)
124129
}
125-
files = append(files, otherFiles...)
126130
}
127-
} else if strings.HasPrefix(point.Point, path) { // 仓库目录的父目录
131+
} else if strings.HasPrefix(point.Point, path) {
132+
// 仓库目录的父目录
128133
nextDir := GetNextDir(point.Point, path)
129134
if nextDir == "" {
130135
continue
131136
}
132-
if err != nil {
133-
return nil, fmt.Errorf("failed to get releases for %s: %w", point.Repo, err)
134-
}
135137

136138
hasSameDir := false
137139
for index := range files {
138140
if files[index].GetName() == nextDir {
139141
hasSameDir = true
140-
files[index].Size += point.GetAllVersionSize()
142+
files[index].Size += releasesTotalSize(releases)
141143
break
142144
}
143145
}
144146
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-
}
150147
files = append(files, File{
151148
FileName: nextDir,
152149
Path: stdpath.Join(path, nextDir),
153-
Size: point.GetAllVersionSize(),
154-
UpdateAt: updateAt,
155-
CreateAt: createAt,
150+
Size: releasesTotalSize(releases),
151+
UpdateAt: releases[0].PublishedAt,
152+
CreateAt: releases[0].CreatedAt,
156153
Type: "dir",
157154
Url: "",
158155
})
159156
}
160-
} else if strings.HasPrefix(path, point.Point) { // 仓库目录的子目录
157+
} else if strings.HasPrefix(path, point.Point) {
158+
// 仓库目录的子目录(某个版本)
161159
tagName := GetNextDir(path, point.Point)
162160
if tagName == "" {
163161
continue
164162
}
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-
}
171163

172-
files = append(files, point.GetReleaseByTagName(tagName)...)
164+
files = append(files, releaseAssetsByTag(point.Point, tagName, releases)...)
173165

174166
if d.Addition.ShowSourceCode {
175-
files = append(files, point.GetSourceCodeByTagName(tagName)...)
167+
files = append(files, sourceCodeFilesByTag(point.Point, releases, tagName)...)
176168
}
177169
}
178170
}

drivers/github_releases/meta.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ type Addition struct {
1212
Token string `json:"token" type:"string" required:"false" help:"GitHub token, if you want to access private repositories or increase the rate limit"`
1313
ShowSourceCode bool `json:"show_source_code" type:"bool" default:"false" help:"show Source code (zip/tar.gz)"`
1414
ShowAllVersion bool `json:"show_all_version" type:"bool" default:"false" help:"show all versions"`
15-
GitHubProxy string `json:"gh_proxy" type:"string" default:"" help:"GitHub proxy, e.g. https://ghproxy.net/github.com or https://gh-proxy.com/github.com "`
15+
PerPage int `json:"per_page" type:"number" default:"30" help:"releases per page (max 100), only works when show all versions"`
16+
MaxPage int `json:"max_page" type:"number" default:"0" help:"max pages to fetch (0 = unlimited), only works when show all versions"`
17+
GitHubProxy string `json:"gh_proxy" type:"string" default:"" help:"GitHub proxy, e.g. https://ghproxy.net/https://github.com or https://gh-proxy.com/https://github.com"`
1618
}
1719

1820
var config = driver.Config{

0 commit comments

Comments
 (0)