void EnsureLocalBranchExists(IRepository repository, string branchName) { if (repository.FindBranch(branchName) != null) { return; } var existingBranches = string.Format("'{0}'", string.Join("', '", repository.Branches.Select(x => x.CanonicalName))); throw new WarningException(string.Format("This repository doesn't contain a branch named '{0}'. Please create one. Existing branches: {1}", branchName, existingBranches)); }
void EnsurePullBranchShareACommonAncestorWithMaster(IRepository repository, Branch pullBranch) { var masterTip = repository.FindBranch("master").Tip; var ancestor = repository.Commits.FindMergeBase(masterTip, pullBranch.Tip); if (ancestor != null) { return; } var message = string.Format("A pull request branch is expected to branch off of 'master'. However, branch 'master' and '{0}' do not share a common ancestor.", pullBranch.Name); throw new Exception(message); }
Commit FindCommonAncestorWithDevelop(IRepository repo, Branch branch, BranchType branchType) { var ancestor = repo.Commits.FindMergeBase( repo.FindBranch("develop").Tip, branch.Tip); if (ancestor != null) { return ancestor; } throw new ErrorException( string.Format("A {0} branch is expected to branch off of 'develop'. " + "However, branch 'develop' and '{1}' do not share a common ancestor." , branchType, branch.Name)); }
public bool IsThereAnyCommitOnTheBranch(IRepository repo, Branch branch) { var filter = new CommitFilter { Since = branch, Until = repo.FindBranch("develop") }; var commits = repo.Commits.QueryBy(filter); if (!commits.Any()) { return false; } return true; }
public VersionPoint FindLatestStableTaggedCommitReachableFrom(IRepository repo, Commit commit) { var masterTip = repo.FindBranch("master").Tip; var ancestor = repo.Commits.FindMergeBase(masterTip, commit); var allTags = repo.Tags.ToList(); foreach (var c in repo.Commits.QueryBy(new CommitFilter { Since = ancestor.Id, SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time } )) { var vp = RetrieveStableVersionPointFor(allTags, c); if (vp != null) { return vp; } } return null; }
int NumberOfCommitsInBranchNotKnownFromBaseBranch( IRepository repo, Branch branch, BranchType branchType, string baseBranchName) { var baseTip = repo.FindBranch(baseBranchName).Tip; if (branch.Tip == baseTip) { // The branch bears no additional commit return 0; } var ancestor = repo.Commits.FindMergeBase( baseTip, branch.Tip); if (ancestor == null) { var message = string.Format("A {0} branch is expected to branch off of '{1}'. However, branch '{1}' and '{2}' do not share a common ancestor.", branchType, baseBranchName, branch.Name); throw new ErrorException(message); } var filter = new CommitFilter { Since = branch.Tip, Until = ancestor, SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time }; return repo.Commits.QueryBy(filter).Count(); }
public static bool ShouldGitHubFlowVersioningSchemeApply(IRepository repo) { return repo.FindBranch("develop") == null; }
static KeyValuePair<string, BranchConfig> InheritBranchConfiguration( bool onlyEvaluateTrackedBranches, IRepository repository, Commit currentCommit, Branch currentBranch, KeyValuePair<string, BranchConfig> keyValuePair, BranchConfig branchConfiguration, Config config) { Logger.WriteInfo("Attempting to inherit branch configuration from parent branch"); var excludedBranches = new [] { currentBranch }; // Check if we are a merge commit. If so likely we are a pull request var parentCount = currentCommit.Parents.Count(); if (parentCount == 2) { var parents = currentCommit.Parents.ToArray(); var branch = repository.Branches.SingleOrDefault(b => !b.IsRemote && b.Tip == parents[1]); if (branch != null) { excludedBranches = new[] { currentBranch, branch }; currentBranch = branch; } else { currentBranch = repository.Branches.SingleOrDefault(b => !b.IsRemote && b.Tip == parents[0]) ?? currentBranch; } Logger.WriteInfo("HEAD is merge commit, this is likely a pull request using " + currentBranch.Name + " as base"); } var branchPoint = currentBranch.FindCommitBranchWasBranchedFrom(repository, onlyEvaluateTrackedBranches, excludedBranches); List<Branch> possibleParents; if (branchPoint.Sha == currentCommit.Sha) { possibleParents = currentCommit.GetBranchesContainingCommit(repository, true).Except(excludedBranches).ToList(); } else { var branches = branchPoint.GetBranchesContainingCommit(repository, true).Except(excludedBranches).ToList(); var currentTipBranches = currentCommit.GetBranchesContainingCommit(repository, true).Except(excludedBranches).ToList(); possibleParents = branches .Except(currentTipBranches) .ToList(); } Logger.WriteInfo("Found possible parent branches: " + string.Join(", ", possibleParents.Select(p => p.Name))); // If it comes down to master and something, master is always first so we pick other branch if (possibleParents.Count == 2 && possibleParents.Any(p => p.Name == "master")) { possibleParents.Remove(possibleParents.Single(p => p.Name == "master")); } if (possibleParents.Count == 1) { var branchConfig = GetBranchConfiguration(currentCommit, repository, onlyEvaluateTrackedBranches, config, possibleParents[0]).Value; return new KeyValuePair<string, BranchConfig>( keyValuePair.Key, new BranchConfig(branchConfiguration) { Increment = branchConfig.Increment, PreventIncrementOfMergedBranchVersion = branchConfig.PreventIncrementOfMergedBranchVersion }); } // If we fail to inherit it is probably because the branch has been merged and we can't do much. So we will fall back to develop's config // if develop exists and master if not string errorMessage; if (possibleParents.Count == 0) errorMessage = "Failed to inherit Increment branch configuration, no branches found."; else errorMessage = "Failed to inherit Increment branch configuration, ended up with: " + string.Join(", ", possibleParents.Select(p => p.Name)); var hasDevelop = repository.FindBranch("develop") != null; var branchName = hasDevelop ? "develop" : "master"; Logger.WriteWarning(errorMessage + Environment.NewLine + Environment.NewLine + "Falling back to " + branchName + " branch config"); var value = GetBranchConfiguration(currentCommit, repository, onlyEvaluateTrackedBranches, config, repository.Branches[branchName]).Value; return new KeyValuePair<string, BranchConfig>( keyValuePair.Key, new BranchConfig(branchConfiguration) { Increment = value.Increment, PreventIncrementOfMergedBranchVersion = value.PreventIncrementOfMergedBranchVersion }); }