@@ -215,16 +215,16 @@ public virtual TConfigurationBuilder WithConfiguration(GitVersionConfiguration v
215
215
WithUpdateBuildNumber ( value . UpdateBuildNumber ) ;
216
216
WithSemanticVersionFormat ( value . SemanticVersionFormat ) ;
217
217
WithMergeMessageFormats ( value . MergeMessageFormats ) ;
218
- foreach ( var item in value . Branches )
218
+ foreach ( var ( name , branchConfiguration ) in value . Branches )
219
219
{
220
- WithBranch ( item . Key ) . WithConfiguration ( item . Value ) ;
220
+ WithBranch ( name ) . WithConfiguration ( branchConfiguration ) ;
221
221
}
222
222
return ( TConfigurationBuilder ) this ;
223
223
}
224
224
225
225
public virtual GitVersionConfiguration Build ( )
226
226
{
227
- GitVersionConfiguration result = new ( )
227
+ GitVersionConfiguration configuration = new ( )
228
228
{
229
229
AssemblyVersioningScheme = this . assemblyVersioningScheme ,
230
230
AssemblyFileVersioningScheme = this . assemblyFileVersioningScheme ,
@@ -249,12 +249,63 @@ public virtual GitVersionConfiguration Build()
249
249
MergeMessageFormats = this . mergeMessageFormats ?? new ( )
250
250
} ;
251
251
Dictionary < string , BranchConfiguration > branches = new ( ) ;
252
- foreach ( var item in this . branchConfigurationBuilders )
252
+ foreach ( var ( name , branchConfigurationBuilder ) in this . branchConfigurationBuilders )
253
253
{
254
- branches . Add ( item . Key , item . Value . Build ( ) ) ;
254
+ branches . Add ( name , branchConfigurationBuilder . Build ( ) ) ;
255
+ }
256
+
257
+ FinalizeConfiguration ( configuration ) ;
258
+ ValidateConfiguration ( configuration ) ;
259
+
260
+ configuration . Branches = branches ;
261
+ return configuration ;
262
+ }
263
+
264
+ private static void FinalizeConfiguration ( GitVersionConfiguration configuration )
265
+ {
266
+ foreach ( var ( name , branchConfiguration ) in configuration . Branches )
267
+ {
268
+ FinalizeBranchConfiguration ( configuration , name , branchConfiguration ) ;
269
+ }
270
+ }
271
+
272
+ private static void FinalizeBranchConfiguration ( GitVersionConfiguration configuration , string name , BranchConfiguration branchConfiguration )
273
+ {
274
+ branchConfiguration . Name = name ;
275
+ if ( branchConfiguration . IsSourceBranchFor == null )
276
+ return ;
277
+
278
+ foreach ( var targetBranchName in branchConfiguration . IsSourceBranchFor )
279
+ {
280
+ var targetBranchConfig = configuration . Branches [ targetBranchName ] ;
281
+ targetBranchConfig . SourceBranches ??= new HashSet < string > ( ) ;
282
+ targetBranchConfig . SourceBranches . Add ( name ) ;
283
+ }
284
+ }
285
+
286
+ private static void ValidateConfiguration ( GitVersionConfiguration configuration )
287
+ {
288
+ foreach ( var ( name , branchConfiguration ) in configuration . Branches )
289
+ {
290
+ var helpUrl = $ "{ System . Environment . NewLine } See https://gitversion.net/docs/reference/configuration for more info";
291
+
292
+ if ( branchConfiguration . Regex == null )
293
+ {
294
+ throw new ConfigurationException ( $ "Branch configuration '{ name } ' is missing required configuration 'regex'{ helpUrl } ") ;
295
+ }
296
+
297
+ var sourceBranches = branchConfiguration ? . SourceBranches ;
298
+ if ( sourceBranches == null )
299
+ {
300
+ throw new ConfigurationException ( $ "Branch configuration '{ name } ' is missing required configuration 'source-branches'{ helpUrl } ") ;
301
+ }
302
+
303
+ var missingSourceBranches = sourceBranches . Where ( sb => ! configuration . Branches . ContainsKey ( sb ) ) . ToArray ( ) ;
304
+ if ( missingSourceBranches . Any ( ) )
305
+ {
306
+ throw new ConfigurationException ( $ "Branch configuration '{ name } ' defines these 'source-branches' that are not configured: '[{ string . Join ( "," , missingSourceBranches ) } ]'{ helpUrl } ") ;
307
+ }
255
308
}
256
- result . Branches = branches ;
257
- return result ;
258
309
}
259
310
260
311
public record BranchMetaData
0 commit comments