Skip to content

Commit b57f695

Browse files
authored
Merge pull request #2 from A-Line-Services/feature/version-files-update-on
feat(versionFiles): add updateOn config for release type filtering
2 parents c039b4a + fc0151e commit b57f695

File tree

5 files changed

+176
-1
lines changed

5 files changed

+176
-1
lines changed

README.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,12 @@ changelog:
268268
269269
versionFiles:
270270
enabled: boolean # Enable version file updates (default: false)
271+
updateOn: # Which release types trigger updates
272+
stable: boolean # Update on stable releases (default: true)
273+
dev: boolean # Update on dev releases (default: false)
274+
alpha: boolean # Update on alpha releases (default: false)
275+
beta: boolean # Update on beta releases (default: false)
276+
rc: boolean # Update on release candidates (default: false)
271277
files: # List of files to update
272278
- file: string # File path relative to repo root
273279
pattern: string # Regex pattern to match
@@ -291,6 +297,20 @@ versionFiles:
291297
replace: 'version: {version}'
292298
```
293299

300+
By default, version files are only updated on stable releases. To also update on prereleases:
301+
302+
```yaml
303+
versionFiles:
304+
enabled: true
305+
updateOn:
306+
stable: true
307+
rc: true # Also update for release candidates
308+
files:
309+
- file: README.md
310+
pattern: 'version: [0-9.]+'
311+
replace: 'version: {version}'
312+
```
313+
294314
### Placeholders
295315

296316
| Placeholder | Description | Example |

src/config/loader.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
type ReleasePilotConfigType,
2626
type VersionConfigType,
2727
type VersionFilesConfigType,
28+
type VersionFilesUpdateOnConfigType,
2829
} from './schema.js';
2930

3031
// =============================================================================
@@ -133,11 +134,23 @@ export interface ResolvedVersionFileUpdate {
133134
replace: string;
134135
}
135136

137+
/**
138+
* Configuration for which release types trigger version file updates
139+
*/
140+
export interface ResolvedVersionFilesUpdateOnConfig {
141+
stable: boolean;
142+
dev: boolean;
143+
alpha: boolean;
144+
beta: boolean;
145+
rc: boolean;
146+
}
147+
136148
/**
137149
* Version files configuration with all defaults applied
138150
*/
139151
export interface ResolvedVersionFilesConfig {
140152
enabled: boolean;
153+
updateOn: ResolvedVersionFilesUpdateOnConfig;
141154
files: ResolvedVersionFileUpdate[];
142155
}
143156

@@ -437,11 +450,24 @@ function applyChangelogDefaults(changelog?: ChangelogConfigType): ResolvedChange
437450
};
438451
}
439452

453+
function applyVersionFilesUpdateOnDefaults(
454+
updateOn?: VersionFilesUpdateOnConfigType
455+
): ResolvedVersionFilesUpdateOnConfig {
456+
return {
457+
stable: updateOn?.stable ?? true,
458+
dev: updateOn?.dev ?? false,
459+
alpha: updateOn?.alpha ?? false,
460+
beta: updateOn?.beta ?? false,
461+
rc: updateOn?.rc ?? false,
462+
};
463+
}
464+
440465
function applyVersionFilesDefaults(
441466
versionFiles?: VersionFilesConfigType
442467
): ResolvedVersionFilesConfig {
443468
return {
444469
enabled: versionFiles?.enabled ?? false,
470+
updateOn: applyVersionFilesUpdateOnDefaults(versionFiles?.updateOn),
445471
files: (versionFiles?.files ?? []).map((f) => ({
446472
file: f.file,
447473
pattern: f.pattern,

src/config/schema.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,46 @@ export const VersionFileUpdate = a.object(
309309
);
310310
export type VersionFileUpdateType = a.infer<typeof VersionFileUpdate>;
311311

312+
/**
313+
* Configuration for which release types should trigger version file updates
314+
*
315+
* All fields are optional and default to false, except `stable` which defaults to true.
316+
* This allows updating documentation only for stable releases by default.
317+
*
318+
* @example
319+
* ```yaml
320+
* versionFiles:
321+
* enabled: true
322+
* updateOn:
323+
* stable: true # default: true
324+
* rc: true # also update for release candidates
325+
* files:
326+
* - file: README.md
327+
* pattern: 'version: [0-9.]+'
328+
* replace: 'version: {version}'
329+
* ```
330+
*/
331+
export const VersionFilesUpdateOnConfig = a.object(
332+
{
333+
/** Update version files on stable releases (default: true) */
334+
stable: a.optional(a.boolean()),
335+
336+
/** Update version files on dev releases (default: false) */
337+
dev: a.optional(a.boolean()),
338+
339+
/** Update version files on alpha releases (default: false) */
340+
alpha: a.optional(a.boolean()),
341+
342+
/** Update version files on beta releases (default: false) */
343+
beta: a.optional(a.boolean()),
344+
345+
/** Update version files on release candidate releases (default: false) */
346+
rc: a.optional(a.boolean()),
347+
},
348+
{ id: 'VersionFilesUpdateOnConfig' }
349+
);
350+
export type VersionFilesUpdateOnConfigType = a.infer<typeof VersionFilesUpdateOnConfig>;
351+
312352
/**
313353
* Configuration for updating version references in files
314354
*/
@@ -317,6 +357,12 @@ export const VersionFilesConfig = a.object(
317357
/** Enable version file updates (default: false) */
318358
enabled: a.optional(a.boolean()),
319359

360+
/**
361+
* Which release types should trigger version file updates
362+
* By default, only stable releases update version files.
363+
*/
364+
updateOn: a.optional(VersionFilesUpdateOnConfig),
365+
320366
/** List of files and patterns to update */
321367
files: a.optional(a.array(VersionFileUpdate)),
322368
},

src/main.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
loadConfig,
2121
type ResolvedConfig,
2222
type ResolvedPackageConfig,
23+
type ResolvedVersionFilesUpdateOnConfig,
2324
} from './config/loader.js';
2425
import { runCleanup } from './core/cleanup.js';
2526
import {
@@ -365,7 +366,19 @@ export async function run(): Promise<void> {
365366
}
366367

367368
// Update version references in configured files (README, docs, etc.)
368-
if (config.versionFiles.enabled && config.versionFiles.files.length > 0) {
369+
// Determine the release type for updateOn check
370+
const releaseType: keyof ResolvedVersionFilesUpdateOnConfig = prerelease
371+
? (prerelease as 'alpha' | 'beta' | 'rc')
372+
: inputs.mode === 'dev'
373+
? 'dev'
374+
: 'stable';
375+
376+
const shouldUpdateVersionFiles =
377+
config.versionFiles.enabled &&
378+
config.versionFiles.files.length > 0 &&
379+
config.versionFiles.updateOn[releaseType];
380+
381+
if (shouldUpdateVersionFiles) {
369382
core.info('Updating version references in files...');
370383
const versionFileResults = updateVersionFiles(config.versionFiles.files, newVersion, {
371384
cwd: process.cwd(),
@@ -383,6 +396,10 @@ export async function run(): Promise<void> {
383396
core.warning(`Failed to update ${result.file}: ${result.error}`);
384397
}
385398
}
399+
} else if (config.versionFiles.enabled && config.versionFiles.files.length > 0) {
400+
core.info(
401+
`Skipping version file updates for ${releaseType} release (updateOn.${releaseType}: false)`
402+
);
386403
}
387404

388405
// Stage and commit version changes

tests/unit/config/loader.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,5 +271,71 @@ packages:
271271
expect(dockerConfig?.tags).toEqual(['latest', '{version}']);
272272
expect(dockerConfig?.devTags).toEqual(['dev', '{version}']);
273273
});
274+
275+
test('applies default versionFiles settings', () => {
276+
const config = applyDefaults({});
277+
278+
expect(config.versionFiles.enabled).toBe(false);
279+
expect(config.versionFiles.files).toEqual([]);
280+
expect(config.versionFiles.updateOn.stable).toBe(true);
281+
expect(config.versionFiles.updateOn.dev).toBe(false);
282+
expect(config.versionFiles.updateOn.alpha).toBe(false);
283+
expect(config.versionFiles.updateOn.beta).toBe(false);
284+
expect(config.versionFiles.updateOn.rc).toBe(false);
285+
});
286+
287+
test('applies default versionFiles.updateOn when enabled without updateOn', () => {
288+
const config = applyDefaults({
289+
versionFiles: {
290+
enabled: true,
291+
files: [{ file: 'README.md', pattern: 'v[0-9]+', replace: 'v{major}' }],
292+
},
293+
});
294+
295+
expect(config.versionFiles.enabled).toBe(true);
296+
expect(config.versionFiles.files).toHaveLength(1);
297+
// updateOn should use defaults
298+
expect(config.versionFiles.updateOn.stable).toBe(true);
299+
expect(config.versionFiles.updateOn.dev).toBe(false);
300+
expect(config.versionFiles.updateOn.alpha).toBe(false);
301+
expect(config.versionFiles.updateOn.beta).toBe(false);
302+
expect(config.versionFiles.updateOn.rc).toBe(false);
303+
});
304+
305+
test('preserves user-provided versionFiles.updateOn values', () => {
306+
const config = applyDefaults({
307+
versionFiles: {
308+
enabled: true,
309+
updateOn: {
310+
stable: true,
311+
rc: true,
312+
// dev, alpha, beta not specified - should default to false
313+
},
314+
files: [{ file: 'README.md', pattern: 'v[0-9]+', replace: 'v{major}' }],
315+
},
316+
});
317+
318+
expect(config.versionFiles.updateOn.stable).toBe(true);
319+
expect(config.versionFiles.updateOn.rc).toBe(true);
320+
expect(config.versionFiles.updateOn.dev).toBe(false);
321+
expect(config.versionFiles.updateOn.alpha).toBe(false);
322+
expect(config.versionFiles.updateOn.beta).toBe(false);
323+
});
324+
325+
test('allows disabling stable in versionFiles.updateOn', () => {
326+
const config = applyDefaults({
327+
versionFiles: {
328+
enabled: true,
329+
updateOn: {
330+
stable: false,
331+
dev: true,
332+
},
333+
files: [{ file: 'README.md', pattern: 'v[0-9]+', replace: 'v{major}' }],
334+
},
335+
});
336+
337+
expect(config.versionFiles.updateOn.stable).toBe(false);
338+
expect(config.versionFiles.updateOn.dev).toBe(true);
339+
});
274340
});
275341
});

0 commit comments

Comments
 (0)