@@ -2,14 +2,16 @@ import {existsSync} from 'node:fs';
22import { green , Log } from '../../../utils/logging.js' ;
33import { join } from 'node:path' ;
44import { writeFile , readFile } from 'node:fs/promises' ;
5+ import { targetLabels } from '../../../pr/common/labels/target.js' ;
56
67/**
78 * Updates the `renovate.json` configuration file to include a new base branch.
9+ * It also updates specific target labels within the package rules.
810 *
9- * @param projectDir - The project directory path .
11+ * @param projectDir - The path to the project directory.
1012 * @param newBranchName - The name of the new branch to add to the base branches list.
11- * @returns A promise that resolves to an string containing the path to the modified `renovate.json` file,
12- * or null if config updating is disabled .
13+ * @returns A promise that resolves to the path of the modified `renovate.json` file if updated ,
14+ * or `null` if the file was not found or the `baseBranches` array has an unexpected format .
1315 */
1416export async function updateRenovateConfig (
1517 projectDir : string ,
@@ -18,13 +20,13 @@ export async function updateRenovateConfig(
1820 const renovateConfigPath = join ( projectDir , 'renovate.json' ) ;
1921 if ( ! existsSync ( renovateConfigPath ) ) {
2022 Log . warn ( ` ✘ Skipped updating Renovate config as it was not found.` ) ;
21-
2223 return null ;
2324 }
2425
2526 const config = await readFile ( renovateConfigPath , 'utf-8' ) ;
2627 const configJson = JSON . parse ( config ) as Record < string , unknown > ;
2728 const baseBranches = configJson . baseBranches ;
29+
2830 if ( ! Array . isArray ( baseBranches ) || baseBranches . length !== 2 ) {
2931 Log . warn (
3032 ` ✘ Skipped updating Renovate config: "baseBranches" must contain exactly 2 branches.` ,
@@ -34,8 +36,93 @@ export async function updateRenovateConfig(
3436 }
3537
3638 configJson . baseBranches = [ 'main' , newBranchName ] ;
39+
40+ updateRenovateTargetLabel (
41+ configJson ,
42+ targetLabels [ 'TARGET_PATCH' ] . name ,
43+ targetLabels [ 'TARGET_RC' ] . name ,
44+ ) ;
3745 await writeFile ( renovateConfigPath , JSON . stringify ( configJson , undefined , 2 ) ) ;
38- Log . info ( green ( ` ✓ Updated Renovate config.` ) ) ;
3946
47+ Log . info ( green ( ` ✓ Updated Renovate config.` ) ) ;
4048 return renovateConfigPath ;
4149}
50+
51+ /**
52+ * Updates a specific target label in the `renovate.json` configuration file.
53+ * This function specifically targets and replaces one label with another within the `packageRules`.
54+ *
55+ * @param projectDir - The path to the project directory.
56+ * @param fromLabel - The label name to be replaced.
57+ * @param toLabel - The new label name to replace `fromLabel` with.
58+ * @returns A promise that resolves to `true` if a label was updated and the file was written `false` otherwise.
59+ */
60+ export async function updateRenovateConfigTargetLabels (
61+ projectDir : string ,
62+ fromLabel : string ,
63+ toLabel : string ,
64+ ) : Promise < string | null > {
65+ const renovateConfigPath = join ( projectDir , 'renovate.json' ) ;
66+ if ( ! existsSync ( renovateConfigPath ) ) {
67+ Log . warn ( ` ✘ Skipped updating Renovate config as it was not found.` ) ;
68+
69+ return null ;
70+ }
71+
72+ const config = await readFile ( renovateConfigPath , 'utf-8' ) ;
73+ const configJson = JSON . parse ( config ) as Record < string , unknown > ;
74+
75+ // Check baseBranches just in case, though this function's primary focus is labels
76+ const baseBranches = configJson . baseBranches ;
77+ if ( ! Array . isArray ( baseBranches ) || baseBranches . length !== 2 ) {
78+ Log . warn (
79+ ` ✘ Skipped updating Renovate config: "baseBranches" must contain exactly 2 branches.` ,
80+ ) ;
81+
82+ return null ;
83+ }
84+
85+ if ( updateRenovateTargetLabel ( configJson , fromLabel , toLabel ) ) {
86+ await writeFile ( renovateConfigPath , JSON . stringify ( configJson , undefined , 2 ) ) ;
87+ Log . info ( green ( ` ✓ Updated target label in Renovate config.` ) ) ;
88+
89+ return renovateConfigPath ;
90+ } else {
91+ Log . info ( green ( ` ✓ No changes to target labels in Renovate config.` ) ) ;
92+ return null ;
93+ }
94+ }
95+
96+ /**
97+ * Updates a specific target label within the `packageRules` of a Renovate configuration.
98+ * This is a private helper function.
99+ *
100+ * @param configJson - The parsed JSON object of the Renovate configuration.
101+ * @param fromLabel - The label name to be replaced.
102+ * @param toLabel - The new label name to replace `fromLabel` with.
103+ * @returns `true` is the label has been updated, otherwise `false`.
104+ */
105+ function updateRenovateTargetLabel (
106+ configJson : Record < string , unknown > ,
107+ fromLabel : string ,
108+ toLabel : string ,
109+ ) : boolean {
110+ if ( ! Array . isArray ( configJson . packageRules ) ) {
111+ return false ;
112+ }
113+
114+ let updated = false ;
115+ for ( const rule of configJson . packageRules ) {
116+ if ( ! Array . isArray ( rule . addLabels ) ) {
117+ continue ;
118+ }
119+
120+ const idx = ( rule . addLabels as string [ ] ) . findIndex ( ( x ) => x === fromLabel ) ;
121+ if ( idx >= 0 ) {
122+ rule . addLabels [ idx ] = toLabel ;
123+ updated = true ;
124+ }
125+ }
126+
127+ return updated ;
128+ }
0 commit comments