@@ -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,97 @@ 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+ ) ;
45+
3746 await writeFile ( renovateConfigPath , JSON . stringify ( configJson , undefined , 2 ) ) ;
38- Log . info ( green ( ` ✓ Updated Renovate config.` ) ) ;
3947
48+ Log . info ( green ( ` ✓ Updated Renovate config.` ) ) ;
4049 return renovateConfigPath ;
4150}
51+
52+ /**
53+ * Updates a specific target label in the `renovate.json` configuration file.
54+ * This function specifically targets and replaces one label with another within the `packageRules`.
55+ *
56+ * @param projectDir - The path to the project directory.
57+ * @param fromLabel - The label name to be replaced.
58+ * @param toLabel - The new label name to replace `fromLabel` with.
59+ * @returns A promise that resolves to `true` if a label was updated and the file was written `false` otherwise.
60+ */
61+ export async function updateRenovateConfigTargetLabels (
62+ projectDir : string ,
63+ fromLabel : string ,
64+ toLabel : string ,
65+ ) : Promise < string | null > {
66+ const renovateConfigPath = join ( projectDir , 'renovate.json' ) ;
67+ if ( ! existsSync ( renovateConfigPath ) ) {
68+ Log . warn ( ` ✘ Skipped updating Renovate config as it was not found.` ) ;
69+
70+ return null ;
71+ }
72+
73+ const config = await readFile ( renovateConfigPath , 'utf-8' ) ;
74+ const configJson = JSON . parse ( config ) as Record < string , unknown > ;
75+
76+ // Check baseBranches just in case, though this function's primary focus is labels
77+ const baseBranches = configJson . baseBranches ;
78+ if ( ! Array . isArray ( baseBranches ) || baseBranches . length !== 2 ) {
79+ Log . warn (
80+ ` ✘ Skipped updating Renovate config: "baseBranches" must contain exactly 2 branches.` ,
81+ ) ;
82+
83+ return null ;
84+ }
85+
86+ if ( updateRenovateTargetLabel ( configJson , fromLabel , toLabel ) ) {
87+ await writeFile ( renovateConfigPath , JSON . stringify ( configJson , undefined , 2 ) ) ;
88+ Log . info ( green ( ` ✓ Updated target label in Renovate config.` ) ) ;
89+
90+ return renovateConfigPath ;
91+ } else {
92+ Log . info ( green ( ` ✓ No changes to target labels in Renovate config.` ) ) ;
93+ return null ;
94+ }
95+ }
96+
97+ /**
98+ * Updates a specific target label within the `packageRules` of a Renovate configuration.
99+ * This is a private helper function.
100+ *
101+ * @param configJson - The parsed JSON object of the Renovate configuration.
102+ * @param fromLabel - The label name to be replaced.
103+ * @param toLabel - The new label name to replace `fromLabel` with.
104+ * @returns `true` is the label has been updated, otherwise `false`.
105+ */
106+ function updateRenovateTargetLabel (
107+ configJson : Record < string , unknown > ,
108+ fromLabel : string ,
109+ toLabel : string ,
110+ ) : boolean {
111+ if ( ! Array . isArray ( configJson . packageRules ) ) {
112+ return false ;
113+ }
114+
115+ let updated = false ;
116+ for ( const rule of configJson . packageRules ) {
117+ if ( ! Array . isArray ( rule . addLabels ) ) {
118+ continue ;
119+ }
120+
121+ for ( let index = 0 ; index < rule . addLabels . length ; index ++ ) {
122+ if ( fromLabel !== rule . addLabels [ index ] ) {
123+ continue ;
124+ }
125+
126+ rule . addLabels [ index ] = toLabel ;
127+ updated = true ;
128+ }
129+ }
130+
131+ return updated ;
132+ }
0 commit comments