private static void TrySetBranchNameFromSubject( CommitId commitId, GitCommit gitCommit, IDictionary <CommitId, BranchName> branchNameByCommitId, IDictionary <CommitId, BranchName> subjectBranchNameByCommitId) { // Trying to parse source and target branch names from subject. They can be like // "Merge branch 'branch-name' of remote-repository-path" // This is considered a "pull merge", where branch-name is both source and target. These are // usually automatically created by tools and thus more trustworthy. // Other merge merge subjects are less trustworthy since they sometiems are manually edited // like: // "Merge source-branch" // which contains a source branch name, but sometimes they contain a target like // "Merge source-branch into target-branch" MergeBranchNames mergeNames = BranchNameParser.ParseBranchNamesFromSubject(gitCommit.Subject); if (IsPullMergeCommit(mergeNames)) { // Pull merge subjects (source branch same as target) (trust worthy, so use branch name branchNameByCommitId[commitId] = mergeNames.SourceBranchName; branchNameByCommitId[gitCommit.ParentIds[0]] = mergeNames.SourceBranchName; branchNameByCommitId[gitCommit.ParentIds[1]] = mergeNames.SourceBranchName; // But also note the barnch name from subjects subjectBranchNameByCommitId[commitId] = mergeNames.SourceBranchName; subjectBranchNameByCommitId[gitCommit.ParentIds[0]] = mergeNames.SourceBranchName; subjectBranchNameByCommitId[gitCommit.ParentIds[1]] = mergeNames.SourceBranchName; } else { // Normal merge subject (less trustworthy) if (mergeNames.TargetBranchName != null) { // There was a target branch name subjectBranchNameByCommitId[commitId] = mergeNames.TargetBranchName; } if (mergeNames.SourceBranchName != null) { // There was a source branch name subjectBranchNameByCommitId[gitCommit.ParentIds[1]] = mergeNames.SourceBranchName; } } }
private static bool IsPullMergeCommit(MergeBranchNames branchNames) { return (branchNames.SourceBranchName != null && branchNames.SourceBranchName == branchNames.TargetBranchName); }