public async Task <string> GetNextBranchNameIteration(string branchName, IEnumerable <string> existingNames) { var candidateNames = convention.GetBranchNameIterations(branchName, existingNames); var remoteBranches = repository.RemoteBranches().Take(1); return(await candidateNames.CombineLatest(remoteBranches, (name, branches) => new { name, branches }) .Where(target => !target.branches.Select(b => b.Name).Contains(target.name)) .Select(target => target.name) .FirstOrDefaultAsync()); }
public IObservable <string> GetIngtegrationBranchNameCandidates(string branchA, string branchB) { var branchAParts = branchA.Split('/'); var branchBParts = branchB.Split('/'); var sharedParts = branchAParts.Take(branchBParts.Length).Zip(branchBParts.Take(branchAParts.Length), (a, b) => a == b ? a : null).Where(v => v != null).ToArray(); var remainingA = string.Join("/", branchAParts.Skip(sharedParts.Length)); var remainingB = string.Join("/", branchBParts.Skip(sharedParts.Length)); var shared = string.Join("/", sharedParts); var ideal = string.Join("/", new[] { "merge", shared, remainingA, remainingB }.Where(v => !string.IsNullOrEmpty(v))); var maxLength = ideal.Substring(0, Math.Min(100, ideal.Length)).TrimEnd('/'); return(iterationNaming.GetBranchNameIterations(maxLength, Enumerable.Empty <string>()).Select(n => n != maxLength ? n + "/conflict" : n)); }