@@ -295,14 +295,50 @@ static IEnumerable<IBranch> InnerGetBranchesContainingCommit(ICommit commit, IEn
295295
296296 public Dictionary < string , List < IBranch > > GetMainlineBranches ( ICommit commit , IEnumerable < KeyValuePair < string , BranchConfig ? > > ? mainlineBranchConfigs ) =>
297297 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 ) )
299299 . 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+ }
303341
304- private ICommit FindBranchOrigin ( IBranch branch , ICommit commit ) =>
305- FindMergeBase ( branch . Tip ! , commit ) ?? FindCommitBranchWasBranchedFrom ( branch , null ) . Commit ;
306342
307343
308344 /// <summary>
0 commit comments