ReviewOS

also looking at this

stacks/buddy

fix(rules): apply the per-rule minimum release age, which nothing read

#1419
Merged glennmichael123 wants to merge fix/rule-release-age into main
3 files +223 -7
src/buddy.tsmodified+23-5
Changes to src/buddy.ts
@@ -1924,29 +1924,47 @@ export class Buddy {
19241924 * Filter updates by minimum release age requirement
19251925 */
19261926 private async filterUpdatesByMinimumReleaseAge(updates: PackageUpdate[]): Promise<PackageUpdate[]> {
1927 const minimumReleaseAge = this.config.packages?.minimumReleaseAge ?? 0
1927 const globalAge = this.config.packages?.minimumReleaseAge ?? 0
1928 const rules = this.activeRules()
19281929
1929 // If no minimum age is set, return all updates
1930 if (minimumReleaseAge === 0) {
1930 // A rule can set a hold where the global is zero, so the early return has
1931 // to account for both. Checking only the global here is what made
1932 // `rules[].minimumReleaseAge` inert: it was resolved into the effects and
1933 // nothing ever read it.
1934 const ruleSetsAnAge = rules.some(rule => rule.minimumReleaseAge !== undefined)
1935 if (globalAge === 0 && !ruleSetsAnAge) {
19311936 return updates
19321937 }
19331938
1934 this.logger.info(`Applying minimum release age filter (${minimumReleaseAge} minutes) in parallel...`)
1939 this.logger.info(`Applying minimum release age filter (global ${globalAge} minutes${
1940 ruleSetsAnAge ? ', with per-rule overrides' : ''
1941 }) in parallel...`)
19351942
19361943 // PARALLEL: Check all updates concurrently
19371944 const ageCheckPromises = updates.map(async (update) => {
19381945 try {
1946 // Resolved per update, because a rule matching this package may hold
1947 // it longer — or shorter — than the repository default.
1948 const required = (rules.length > 0
1949 ? resolveRuleEffects(update, rules).minimumReleaseAge
1950 : undefined) ?? globalAge
1951
1952 if (required === 0) {
1953 return update
1954 }
1955
19391956 const meetsRequirement = await this.registryClient.meetsMinimumReleaseAge(
19401957 update.name,
19411958 update.newVersion,
19421959 update.dependencyType,
1960 required,
19431961 )
19441962
19451963 if (meetsRequirement) {
19461964 return update
19471965 }
19481966 else {
1949 this.logger.debug(`Filtered out ${update.name}@${update.newVersion} (${update.dependencyType}) due to minimum release age requirement`)
1967 this.logger.debug(`Filtered out ${update.name}@${update.newVersion} (${update.dependencyType}) — held for ${required} minutes after publication`)
19501968 return null
19511969 }
19521970 }