also looking at this
fix(rules): apply the per-rule minimum release age, which nothing read
#1419
3 files
+223
-7
| @@ -1924,29 +1924,47 @@ export class Buddy { | ||
| 1924 | 1924 | * Filter updates by minimum release age requirement |
| 1925 | 1925 | */ |
| 1926 | 1926 | 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() | |
| 1928 | 1929 | |
| 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) { | |
| 1931 | 1936 | return updates |
| 1932 | 1937 | } |
| 1933 | 1938 | |
| 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...`) | |
| 1935 | 1942 | |
| 1936 | 1943 | // PARALLEL: Check all updates concurrently |
| 1937 | 1944 | const ageCheckPromises = updates.map(async (update) => { |
| 1938 | 1945 | 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 | ||
| 1939 | 1956 | const meetsRequirement = await this.registryClient.meetsMinimumReleaseAge( |
| 1940 | 1957 | update.name, |
| 1941 | 1958 | update.newVersion, |
| 1942 | 1959 | update.dependencyType, |
| 1960 | required, | |
| 1943 | 1961 | ) |
| 1944 | 1962 | |
| 1945 | 1963 | if (meetsRequirement) { |
| 1946 | 1964 | return update |
| 1947 | 1965 | } |
| 1948 | 1966 | 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`) | |
| 1950 | 1968 | return null |
| 1951 | 1969 | } |
| 1952 | 1970 | } |