Skip to content

Commit 7160d03

Browse files
committed
feat: paginate GitHub release fetching and add detailed logging for release filtering logic
1 parent 529d39d commit 7160d03

1 file changed

Lines changed: 43 additions & 21 deletions

File tree

src/main/releases.ts

Lines changed: 43 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,27 @@ const REPO = 'CynToolkit/pipelab'
1616

1717
export const fetchAllReleases = async (): Promise<Release[]> => {
1818
const { logger } = useLogger()
19+
const allReleases: Release[] = []
1920
try {
20-
const url = `https://api.github.com/repos/${REPO}/releases`
21-
logger().info('Fetching releases from GitHub API:', url)
22-
const response = await fetch(url, {
23-
headers: {
24-
'User-Agent': 'Pipelab'
21+
// Fetch up to 5 pages (500 items total) to bypass monorepo package release noise
22+
for (let page = 1; page <= 5; page++) {
23+
const url = `https://api.github.com/repos/${REPO}/releases?per_page=100&page=${page}`
24+
logger().info(`Fetching releases from GitHub API (page ${page}):`, url)
25+
const response = await fetch(url, {
26+
headers: {
27+
'User-Agent': 'Pipelab'
28+
}
29+
})
30+
if (!response.ok) {
31+
throw new Error(`Failed to fetch releases page ${page}: ${response.statusText}`)
2532
}
26-
})
27-
if (!response.ok) {
28-
throw new Error(`Failed to fetch releases: ${response.statusText}`)
33+
const pageReleases = (await response.json()) as Release[]
34+
if (pageReleases.length === 0) {
35+
break
36+
}
37+
allReleases.push(...pageReleases)
2938
}
30-
return (await response.json()) as Release[]
39+
return allReleases
3140
} catch (error) {
3241
logger().error('Error fetching all releases:', error)
3342
throw error
@@ -50,14 +59,17 @@ export const fetchLatestRelease = async (
5059
const { logger } = useLogger()
5160

5261
try {
62+
logger().info('fetchLatestRelease called with options:', options)
5363
const releases = await fetchAllReleases()
64+
logger().info(`Total releases fetched from API: ${releases.length}`)
5465

5566
// Handle command-line override
5667
if (overrideRelease) {
5768
logger().info('Using release override:', overrideRelease)
5869
const targetTag = overrideRelease.includes('@') ? overrideRelease : `${packageName}@${overrideRelease}`
5970
const release = releases.find((r) => r.tag_name === targetTag)
6071
if (release) {
72+
logger().info('Found matching release for override:', release.tag_name)
6173
return release
6274
}
6375
logger().warn(`Release override ${overrideRelease} not found for package ${packageName}`)
@@ -66,21 +78,28 @@ export const fetchLatestRelease = async (
6678
// Helper to get version from tag name
6779
const getVersion = (tagName: string) => tagName.split('@').pop() || '0.0.0'
6880

81+
const matchedPrefixReleases = releases.filter((r) => r.tag_name.startsWith(`${packageName}@`))
82+
logger().info(`Found ${matchedPrefixReleases.length} releases matching prefix "${packageName}@"`)
83+
6984
// Filter for releases that follow the {packageName}@X.Y.Z tag pattern and filter out prereleases unconditionally unless prerelease is true
70-
const packageReleases = releases
71-
.filter((r) => r.tag_name.startsWith(`${packageName}@`))
72-
.filter((r) => {
73-
if (prerelease) {
74-
return true
75-
}
76-
if (r.prerelease) {
77-
return false
78-
}
79-
const version = getVersion(r.tag_name)
80-
return !semver.prerelease(version)
81-
})
85+
const packageReleases = matchedPrefixReleases.filter((r) => {
86+
const version = getVersion(r.tag_name)
87+
const isPrerelease = r.prerelease || semver.prerelease(version)
88+
89+
if (prerelease) {
90+
logger().info(`[prerelease-mode] Keeping release: ${r.tag_name} (prerelease: ${!!isPrerelease})`)
91+
return true
92+
}
93+
if (isPrerelease) {
94+
logger().info(`[stable-mode] Skipping prerelease: ${r.tag_name}`)
95+
return false
96+
}
97+
logger().info(`[stable-mode] Keeping stable release: ${r.tag_name}`)
98+
return true
99+
})
82100

83101
if (packageReleases.length === 0) {
102+
logger().info('No releases matched after filtering.')
84103
return null
85104
}
86105

@@ -93,6 +112,9 @@ export const fetchLatestRelease = async (
93112
return new Date(b.published_at).getTime() - new Date(a.published_at).getTime()
94113
})
95114

115+
logger().info('Filtered releases order (sorted descending):', packageReleases.map((r) => r.tag_name))
116+
logger().info('Selected latest release:', packageReleases[0].tag_name)
117+
96118
return packageReleases[0]
97119
} catch (error) {
98120
logger().error('Failed to fetch latest release:', error)

0 commit comments

Comments
 (0)