/// <summary> /// Creates a pull request from the given updates. /// </summary> /// <param name="updates"></param> /// <returns>The pull request url when a pr was created; <see langref="null" /> if no PR is necessary</returns> private async Task <string> CreatePullRequestAsync(List <UpdateAssetsParameters> updates) { (string targetRepository, string targetBranch) = await GetTargetAsync(); IRemote darc = await GetDarc(); List <(UpdateAssetsParameters update, List <DependencyDetail> deps)> requiredUpdates = await GetRequiredUpdates(updates, darc, targetRepository, targetBranch); if (requiredUpdates.Count < 1) { return(null); } string newBranchName = $"darc-{targetBranch}-{Guid.NewGuid()}"; await darc.CreateNewBranchAsync(targetRepository, targetBranch, newBranchName); using (var description = new StringWriter()) { description.WriteLine("This pull request updates the following dependencies"); description.WriteLine(); await CommitUpdatesAsync(requiredUpdates, description, darc, targetRepository, newBranchName); string prUrl = await darc.CreatePullRequestAsync( targetRepository, new PullRequest { Title = "Update dependency files", Description = description.ToString(), BaseBranch = targetBranch, HeadBranch = newBranchName }); var inProgressPr = new InProgressPullRequest { Url = prUrl, ContainedSubscriptions = requiredUpdates.Select( u => new SubscriptionPullRequestUpdate { SubscriptionId = u.update.SubscriptionId, BuildId = u.update.BuildId }) .ToList() }; await StateManager.SetStateAsync(PullRequest, inProgressPr); await StateManager.SaveStateAsync(); await Reminders.TryRegisterReminderAsync( PullRequestCheck, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)); return(prUrl); } }
/// <summary> /// Creates a pull request from the given updates. /// </summary> /// <param name="updates"></param> /// <returns>The pull request url when a pr was created; <see langref="null" /> if no PR is necessary</returns> private async Task <string> CreatePullRequestAsync(List <UpdateAssetsParameters> updates) { (string targetRepository, string targetBranch) = await GetTargetAsync(); IRemote darcRemote = await DarcRemoteFactory.GetRemoteAsync(targetRepository, Logger); List <(UpdateAssetsParameters update, List <DependencyDetail> deps)> requiredUpdates = await GetRequiredUpdates(updates, DarcRemoteFactory, targetRepository, targetBranch); if (requiredUpdates.Count < 1) { return(null); } string newBranchName = $"darc-{targetBranch}-{Guid.NewGuid()}"; await darcRemote.CreateNewBranchAsync(targetRepository, targetBranch, newBranchName); try { using (var description = new StringWriter()) { description.WriteLine("This pull request updates the following dependencies"); description.WriteLine(); await CommitUpdatesAsync(requiredUpdates, description, darcRemote, targetRepository, newBranchName); var inProgressPr = new InProgressPullRequest { // Calculate the subscriptions contained within the // update. Coherency updates do not have subscription info. ContainedSubscriptions = requiredUpdates .Where(u => !u.update.IsCoherencyUpdate) .Select( u => new SubscriptionPullRequestUpdate { SubscriptionId = u.update.SubscriptionId, BuildId = u.update.BuildId }) .ToList() }; string prUrl = await darcRemote.CreatePullRequestAsync( targetRepository, new PullRequest { Title = await ComputePullRequestTitleAsync(inProgressPr, targetBranch), Description = description.ToString(), BaseBranch = targetBranch, HeadBranch = newBranchName }); if (!string.IsNullOrEmpty(prUrl)) { inProgressPr.Url = prUrl; await StateManager.SetStateAsync(PullRequest, inProgressPr); await StateManager.SaveStateAsync(); await Reminders.TryRegisterReminderAsync( PullRequestCheck, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)); return(prUrl); } // Something wrong happened when trying to create the PR but didn't throw an exception (probably there was no diff). // We need to delete the branch also in this case. await darcRemote.DeleteBranchAsync(targetRepository, newBranchName); return(null); } } catch { await darcRemote.DeleteBranchAsync(targetRepository, newBranchName); throw; } }