Beispiel #1
0
 internal AsyncDiscussionHelper(MergeRequestKey mrk, string title,
                                User currentUser, GitLab.Shortcuts shortcuts)
 {
     _creator       = shortcuts.GetDiscussionCreator(mrk, currentUser);
     _uploadsPrefix = StringUtils.GetUploadsPrefix(mrk.ProjectKey);
     _title         = title;
 }
Beispiel #2
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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);
        }