public static void MergeNoFF(this IRepository repository, string branch, Signature sig) { repository.Merge(repository.FindBranch(branch), sig, new MergeOptions { FastForwardStrategy = FastForwardStrategy.NoFastFoward }); }
private VersionTaggedCommit GetVersion(IRepository gitRepo) { var branch = gitRepo.FindBranch("master"); var tags = gitRepo.Tags.Select(t => { SemanticVersion version; if (SemanticVersionParser.TryParse(t.Name.TrimStart('v'), out version)) { return(new VersionTaggedCommit((Commit)t.Target, version)); } return(null); }) .Where(a => a != null) .ToArray(); var olderThan = branch.Tip.Committer.When; var lastTaggedCommit = branch.Commits.FirstOrDefault(c => c.Committer.When <= olderThan && tags.Any(a => a.Commit == c)); if (lastTaggedCommit != null) { return(tags.Last(a => a.Commit.Sha == lastTaggedCommit.Sha)); } // Create a next version txt as 0.1.0 var filePath = Path.Combine(workingDirectory, "NextVersion.txt"); if (!File.Exists(filePath)) { File.WriteAllText(filePath, "0.1.0"); } var commit = branch.Commits.Last(); return(new VersionTaggedCommit(commit, new SemanticVersion())); }
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 WarningException(message); } var filter = new CommitFilter { Since = branch.Tip, Until = ancestor, SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Time }; return(repo.Commits.QueryBy(filter).Count()); }
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); }
public static Commit CreatePullRequestRef(this IRepository repository, string from, string to, int prNumber = 2, bool normalise = false, bool allowFastFowardMerge = false) { repository.Checkout(repository.FindBranch(to).Tip); if (allowFastFowardMerge) { repository.Merge(repository.FindBranch(from), Constants.SignatureNow()); } else { repository.MergeNoFF(from); } var commit = repository.Head.Tip; repository.Refs.Add("refs/pull/" + prNumber + "/merge", commit.Id); repository.Checkout(to); if (normalise) { // Turn the ref into a real branch repository.Checkout(repository.Branches.Add("pull/" + prNumber + "/merge", commit)); } return(commit); }
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)); }
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 WarningException( 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 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; }
static Commit 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); }
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 }); }
public static bool ShouldGitHubFlowVersioningSchemeApply(IRepository repo) { return repo.FindBranch("develop") == 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(); }
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 })); }
public Branch FindBranch(string branchName) { return(repository.FindBranch(branchName)); }
public static bool ShouldGitHubFlowVersioningSchemeApply(IRepository repo) { return(repo.FindBranch("develop") == null); }