@@ -295,14 +295,50 @@ static IEnumerable<IBranch> InnerGetBranchesContainingCommit(ICommit commit, IEn
295
295
296
296
public Dictionary < string , List < IBranch > > GetMainlineBranches ( ICommit commit , IEnumerable < KeyValuePair < string , BranchConfig ? > > ? mainlineBranchConfigs ) =>
297
297
this . repository . Branches
298
- . Where ( b => mainlineBranchConfigs ? . Any ( c => c . Value ? . Regex != null && Regex . IsMatch ( b . Name . Friendly , c . Value . Regex ) ) == true )
298
+ . Where ( b => BranchIsMainline ( b , mainlineBranchConfigs ) )
299
299
. Select ( b => new { Origin = FindBranchOrigin ( b , commit ) , Branch = b } )
300
- . Where ( a => a . Origin != null )
301
- . GroupBy ( b => b . Origin ? . Sha , b => b . Branch )
302
- . ToDictionary ( b => b . Key , b => b . ToList ( ) ) ;
300
+ . Where ( x => x . Origin is not null )
301
+ . GroupBy ( x => x . Origin ! . Sha , a => a . Branch )
302
+ . ToDictionary ( x => x . Key , x => x . ToList ( ) ) ;
303
+
304
+ private bool BranchIsMainline ( INamedReference branch , IEnumerable < KeyValuePair < string , BranchConfig ? > > ? mainlineBranchConfigs ) =>
305
+ mainlineBranchConfigs ? . Any ( c => BranchMatchesMainlineConfig ( branch , c ) ) == true ;
306
+
307
+ private bool BranchMatchesMainlineConfig ( INamedReference branch , KeyValuePair < string , BranchConfig ? > mainlineBranchConfig )
308
+ {
309
+ if ( mainlineBranchConfig . Value ? . Regex == null )
310
+ {
311
+ return false ;
312
+ }
313
+
314
+ var mainlineRegex = mainlineBranchConfig . Value . Regex ;
315
+ var branchName = branch . Name . WithoutRemote ;
316
+ var match = Regex . IsMatch ( branchName , mainlineRegex ) ;
317
+ this . log . Info ( $ "'{ mainlineRegex } ' { ( match ? "matches" : "does not match" ) } '{ branchName } '.") ;
318
+ return match ;
319
+ }
320
+
321
+ private ICommit ? FindBranchOrigin ( IBranch branch , ICommit commit )
322
+ {
323
+ var branchName = branch . Name . Friendly ;
324
+ var mergeBase = FindMergeBase ( branch . Tip ! , commit ) ;
325
+ if ( mergeBase is not null )
326
+ {
327
+ this . log . Info ( $ "Found merge base { mergeBase . Sha } for '{ branchName } '.") ;
328
+ return mergeBase ;
329
+ }
330
+
331
+ var branchCommit = FindCommitBranchWasBranchedFrom ( branch , null ) ;
332
+ if ( branchCommit != BranchCommit . Empty )
333
+ {
334
+ this . log . Info ( $ "Found parent commit { branchCommit . Commit . Sha } for '{ branchName } '.") ;
335
+ return branchCommit . Commit ;
336
+ }
337
+
338
+ this . log . Info ( $ "Found no merge base or parent commit for '{ branchName } '.") ;
339
+ return null ;
340
+ }
303
341
304
- private ICommit FindBranchOrigin ( IBranch branch , ICommit commit ) =>
305
- FindMergeBase ( branch . Tip ! , commit ) ?? FindCommitBranchWasBranchedFrom ( branch , null ) . Commit ;
306
342
307
343
308
344
/// <summary>
0 commit comments