internal AsyncDiscussionHelper(MergeRequestKey mrk, string title, User currentUser, GitLab.Shortcuts shortcuts) { _creator = shortcuts.GetDiscussionCreator(mrk, currentUser); _uploadsPrefix = StringUtils.GetUploadsPrefix(mrk.ProjectKey); _title = title; }
async private static Task <User> getUserAsync(string username, Shortcuts shortcuts) { if (String.IsNullOrEmpty(username)) { return(null); } GitLabClient.UserAccessor userAccessor = shortcuts.GetUserAccessor(); return(await userAccessor.SearchUserByUsernameAsync(username) ?? await userAccessor.SearchUserByNameAsync(username)); // fallback }
async internal static Task <MergeRequestKey?> SubmitNewMergeRequestAsync(GitLabInstance gitLabInstance, IModificationListener modificationListener, SubmitNewMergeRequestParameters parameters, string firstNote, User currentUser) { if (String.IsNullOrEmpty(parameters.ProjectKey.ProjectName) || String.IsNullOrEmpty(parameters.SourceBranch) || String.IsNullOrEmpty(parameters.TargetBranch) || String.IsNullOrEmpty(parameters.Title) || parameters.AssigneeUserName == null || firstNote == null || currentUser == null) { // this is unexpected due to UI restrictions, so don't implement detailed logging here MessageBox.Show("Invalid parameters for a new merge request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Trace.TraceError("[MergeRequestEditHelper] Invalid parameters for a new merge request"); return(null); } User assignee = await getUserAsync(gitLabInstance, parameters.AssigneeUserName); checkFoundAssignee(parameters.ProjectKey.HostName, parameters.AssigneeUserName, assignee); int assigneeId = assignee?.Id ?? 0; // 0 means to not assign MR to anyone CreateNewMergeRequestParameters creatorParameters = new CreateNewMergeRequestParameters( parameters.SourceBranch, parameters.TargetBranch, parameters.Title, assigneeId, parameters.Description, parameters.DeleteSourceBranch, parameters.Squash); MergeRequest mergeRequest = null; try { mergeRequest = await Shortcuts .GetMergeRequestCreator(gitLabInstance, modificationListener, parameters.ProjectKey) .CreateMergeRequest(creatorParameters); } catch (MergeRequestCreatorException ex) { reportErrorToUser(ex); return(null); } MergeRequestKey mrk = new MergeRequestKey(parameters.ProjectKey, mergeRequest.IId); await addComment(gitLabInstance, modificationListener, mrk, currentUser, firstNote); return(mrk); }
async internal static Task <bool> CloseMergeRequest(MergeRequestKey mrk, Shortcuts shortcuts) { UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters( null, null, null, null, "close", null, null, null); try { MergeRequest mergeRequest = await shortcuts .GetMergeRequestEditor(mrk) .ModifyMergeRequest(updateMergeRequestParameters); } catch (MergeRequestEditorException ex) { reportErrorToUser(ex); return(false); } return(true); }
async internal static Task <bool> CloseMergeRequest(GitLabInstance gitLabInstance, IModificationListener modificationListener, MergeRequestKey mrk) { UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters( null, null, null, null, "close", null, null); try { MergeRequest mergeRequest = await Shortcuts .GetMergeRequestEditor(gitLabInstance, modificationListener, mrk) .ModifyMergeRequest(updateMergeRequestParameters); } catch (MergeRequestEditorException ex) { reportErrorToUser(ex); return(false); } return(true); }
async private static Task <bool> addComment( MergeRequestKey mrk, User currentUser, string commentBody, Shortcuts shortcuts) { if (String.IsNullOrEmpty(commentBody)) { return(false); } try { IDiscussionCreator creator = shortcuts.GetDiscussionCreator(mrk, currentUser); await creator.CreateNoteAsync(new CreateNewNoteParameters(commentBody)); return(true); } catch (DiscussionCreatorException ex) { MessageBox.Show("Failed to create a note in the new merge request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); ExceptionHandlers.Handle("Failed to create a note", ex); } return(false); }
async internal static Task <bool> ApplyChangesToMergeRequest( ProjectKey projectKey, MergeRequest originalMergeRequest, ApplyMergeRequestChangesParameters parameters, string oldSpecialNote, string newSpecialNote, User currentUser, Shortcuts shortcuts) { if (String.IsNullOrEmpty(parameters.Title) || String.IsNullOrEmpty(parameters.TargetBranch) || parameters.AssigneeUserName == null || newSpecialNote == null || currentUser == null) { // this is unexpected due to UI restrictions, so don't implement detailed logging here MessageBox.Show("Invalid parameters for a merge request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Trace.TraceError("[MergeRequestEditHelper] Invalid parameters for a merge request"); return(false); } string oldAssigneeUsername = originalMergeRequest.Assignee?.Username ?? String.Empty; User assignee = oldAssigneeUsername == parameters.AssigneeUserName ? originalMergeRequest.Assignee : await getUserAsync(parameters.AssigneeUserName, shortcuts); checkFoundAssignee(projectKey.HostName, parameters.AssigneeUserName, assignee); bool result = false; MergeRequestKey mrk = new MergeRequestKey(projectKey, originalMergeRequest.IId); if (oldSpecialNote != newSpecialNote) { result = await addComment(mrk, currentUser, newSpecialNote, shortcuts); } bool wasHighPriority = originalMergeRequest.Labels? .Contains(Common.Constants.Constants.HighPriorityLabel) ?? false; bool changed = oldAssigneeUsername != parameters.AssigneeUserName || originalMergeRequest.Force_Remove_Source_Branch != parameters.DeleteSourceBranch || originalMergeRequest.Squash != parameters.Squash || originalMergeRequest.Target_Branch != parameters.TargetBranch || originalMergeRequest.Title != parameters.Title || originalMergeRequest.Description != parameters.Description || wasHighPriority != parameters.IsHighPriority; if (!changed) { return(result); } string[] labels = null; if (wasHighPriority && !parameters.IsHighPriority) { labels = originalMergeRequest.Labels .Where(label => label != Common.Constants.Constants.HighPriorityLabel).ToArray(); } else if (!wasHighPriority && parameters.IsHighPriority) { labels = originalMergeRequest.Labels .Concat(new string[] { Common.Constants.Constants.HighPriorityLabel }).ToArray(); } int assigneeId = assignee?.Id ?? 0; // 0 means to unassign UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters( parameters.TargetBranch, parameters.Title, assigneeId, parameters.Description, null, parameters.DeleteSourceBranch, parameters.Squash, labels); try { MergeRequest mergeRequest = await shortcuts .GetMergeRequestEditor(mrk) .ModifyMergeRequest(updateMergeRequestParameters); } catch (MergeRequestEditorException ex) { reportErrorToUser(ex); return(result); } return(true); }
async internal static Task <bool> ApplyChangesToMergeRequest(GitLabInstance gitLabInstance, IModificationListener modificationListener, ProjectKey projectKey, MergeRequest originalMergeRequest, ApplyMergeRequestChangesParameters parameters, string oldSpecialNote, string newSpecialNote, User currentUser) { if (String.IsNullOrEmpty(parameters.Title) || String.IsNullOrEmpty(parameters.TargetBranch) || parameters.AssigneeUserName == null || newSpecialNote == null || currentUser == null) { // this is unexpected due to UI restrictions, so don't implement detailed logging here MessageBox.Show("Invalid parameters for a merge request", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Trace.TraceError("[MergeRequestEditHelper] Invalid parameters for a merge request"); return(false); } string oldAssigneeUsername = originalMergeRequest.Assignee?.Username ?? String.Empty; User assignee = oldAssigneeUsername == parameters.AssigneeUserName ? originalMergeRequest.Assignee : await getUserAsync(gitLabInstance, parameters.AssigneeUserName); checkFoundAssignee(projectKey.HostName, parameters.AssigneeUserName, assignee); bool result = false; MergeRequestKey mrk = new MergeRequestKey(projectKey, originalMergeRequest.IId); if (oldSpecialNote != newSpecialNote) { result = await addComment(gitLabInstance, modificationListener, mrk, currentUser, newSpecialNote); } bool changed = oldAssigneeUsername != parameters.AssigneeUserName || originalMergeRequest.Force_Remove_Source_Branch != parameters.DeleteSourceBranch || originalMergeRequest.Squash != parameters.Squash || originalMergeRequest.Target_Branch != parameters.TargetBranch || originalMergeRequest.Title != parameters.Title || originalMergeRequest.Description != parameters.Description; if (!changed) { return(result); } int assigneeId = assignee?.Id ?? 0; // 0 means to unassign UpdateMergeRequestParameters updateMergeRequestParameters = new UpdateMergeRequestParameters( parameters.TargetBranch, parameters.Title, assigneeId, parameters.Description, null, parameters.DeleteSourceBranch, parameters.Squash); try { MergeRequest mergeRequest = await Shortcuts .GetMergeRequestEditor(gitLabInstance, modificationListener, mrk) .ModifyMergeRequest(updateMergeRequestParameters); } catch (MergeRequestEditorException ex) { reportErrorToUser(ex); return(result); } return(true); }