public PullRequestFilesViewModel(
            IPullRequestService service,
            IPullRequestEditorService editorService)
        {
            Guard.ArgumentNotNull(service, nameof(service));
            Guard.ArgumentNotNull(editorService, nameof(editorService));

            this.service = service;

            DiffFile = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(x =>
                                                                             editorService.OpenDiff(pullRequestSession, x.RelativePath, "HEAD"));
            ViewFile = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(x =>
                                                                             editorService.OpenFile(pullRequestSession, x.RelativePath, false));
            DiffFileWithWorkingDirectory = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(
                x => editorService.OpenDiff(pullRequestSession, x.RelativePath),
                isBranchCheckedOut);
            OpenFileInWorkingDirectory = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(
                x => editorService.OpenFile(pullRequestSession, x.RelativePath, true),
                isBranchCheckedOut);

            OpenFirstComment = ReactiveCommand.CreateFromTask <IPullRequestFileNode>(async file =>
            {
                var thread = await GetFirstCommentThread(file);

                if (thread != null)
                {
                    await editorService.OpenDiff(pullRequestSession, file.RelativePath, thread);
                }
            });
        }
        static PullRequestReviewAuthoringViewModel CreateTarget(
            IPullRequestService pullRequestService    = null,
            IPullRequestEditorService editorService   = null,
            IPullRequestSessionManager sessionManager = null,
            IMessageDraftStore draftStore             = null,
            IPullRequestFilesViewModel files          = null,
            IScheduler timerScheduler = null,
            IAutoCompleteAdvisor autoCompleteAdvisor = null
            )
        {
            editorService       = editorService ?? Substitute.For <IPullRequestEditorService>();
            sessionManager      = sessionManager ?? CreateSessionManager();
            draftStore          = draftStore ?? Substitute.For <IMessageDraftStore>();
            files               = files ?? Substitute.For <IPullRequestFilesViewModel>();
            autoCompleteAdvisor = autoCompleteAdvisor ?? Substitute.For <IAutoCompleteAdvisor>();
            timerScheduler      = timerScheduler ?? DefaultScheduler.Instance;

            return(new PullRequestReviewAuthoringViewModel(
                       pullRequestService,
                       editorService,
                       sessionManager,
                       draftStore,
                       files,
                       autoCompleteAdvisor,
                       timerScheduler));
        }
Пример #3
0
        public PullRequestFilesViewModel(
            IPullRequestService service,
            IPullRequestEditorService editorService)
        {
            Guard.ArgumentNotNull(service, nameof(service));
            Guard.ArgumentNotNull(editorService, nameof(editorService));

            this.service = service;

            DiffFile = ReactiveCommand.CreateAsyncTask(x =>
                                                       (Task)editorService.OpenDiff(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, "HEAD"));
            ViewFile = ReactiveCommand.CreateAsyncTask(x =>
                                                       (Task)editorService.OpenFile(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, false));
            DiffFileWithWorkingDirectory = ReactiveCommand.CreateAsyncTask(
                isBranchCheckedOut,
                x => (Task)editorService.OpenDiff(pullRequestSession, ((IPullRequestFileNode)x).RelativePath));
            OpenFileInWorkingDirectory = new NonDeletedFileCommand(
                isBranchCheckedOut,
                x => (Task)editorService.OpenFile(pullRequestSession, ((IPullRequestFileNode)x).RelativePath, true));

            OpenFirstComment = ReactiveCommand.CreateAsyncTask(async x =>
            {
                var file   = (IPullRequestFileNode)x;
                var thread = await GetFirstCommentThread(file);

                if (thread != null)
                {
                    await editorService.OpenDiff(pullRequestSession, file.RelativePath, thread);
                }
            });
        }
 public PullRequestAnnotationsViewModel(IPullRequestSessionManager sessionManager, IPullRequestEditorService pullRequestEditorService)
 {
     this.sessionManager           = sessionManager;
     this.pullRequestEditorService = pullRequestEditorService;
     NavigateToPullRequest         = ReactiveCommand.Create(() => {
         NavigateTo(FormattableString.Invariant(
                        $"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestNumber}"));
     });
 }
 public PullRequestReviewAuthoringViewModel(
     IPullRequestService pullRequestService,
     IPullRequestEditorService editorService,
     IPullRequestSessionManager sessionManager,
     IMessageDraftStore draftStore,
     IPullRequestFilesViewModel files)
     : this(pullRequestService, editorService, sessionManager, draftStore, files, DefaultScheduler.Instance)
 {
 }
        private async Task OpenFirstAnnotation(IPullRequestEditorService editorService, IPullRequestFileNode file,
                                               CheckAnnotationLevel checkAnnotationLevel)
        {
            var annotationModel = await GetFirstAnnotation(file, checkAnnotationLevel);

            if (annotationModel != null)
            {
                await editorService.OpenDiff(pullRequestSession, file.RelativePath, annotationModel.HeadSha, annotationModel.EndLine);
            }
        }
        PullRequestUserReviewsViewModel CreateTarget(
            IPullRequestEditorService editorService   = null,
            IPullRequestSessionManager sessionManager = null)
        {
            editorService  = editorService ?? Substitute.For <IPullRequestEditorService>();
            sessionManager = sessionManager ?? CreateSessionManager();

            return(new PullRequestUserReviewsViewModel(
                       editorService,
                       sessionManager));
        }
        public PullRequestUserReviewsViewModel(
            IPullRequestEditorService editorService,
            IPullRequestSessionManager sessionManager)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(sessionManager, nameof(sessionManager));

            this.editorService  = editorService;
            this.sessionManager = sessionManager;

            NavigateToPullRequest = ReactiveCommand.Create(() =>
                                                           NavigateTo(Invariant($"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestNumber}")));
        }
        private async Task OpenFirstAnnotation(IPullRequestEditorService editorService, IPullRequestFileNode file,
                                               CheckAnnotationLevel checkAnnotationLevel)
        {
            var annotationModel = await GetFirstAnnotation(file, checkAnnotationLevel);

            if (annotationModel != null)
            {
                //AnnotationModel.EndLine is a 1-based number
                //EditorService.OpenDiff takes a 0-based line number to start searching AFTER and will open the next tag
                var nextInlineCommentFromLine = annotationModel.EndLine - 2;
                await editorService.OpenDiff(pullRequestSession, file.RelativePath, annotationModel.HeadSha, nextInlineCommentFromLine);
            }
        }
        static PullRequestReviewAuthoringViewModel CreateTarget(
            IPullRequestEditorService editorService   = null,
            IPullRequestSessionManager sessionManager = null,
            IPullRequestFilesViewModel files          = null)
        {
            editorService  = editorService ?? Substitute.For <IPullRequestEditorService>();
            sessionManager = sessionManager ?? CreateSessionManager();
            files          = files ?? Substitute.For <IPullRequestFilesViewModel>();

            return(new PullRequestReviewAuthoringViewModel(
                       editorService,
                       sessionManager,
                       files));
        }
        /// <summary>
        /// Initializes the <see cref="PullRequestAnnotationItemViewModel"/>.
        /// </summary>
        /// <param name="annotation">The check run annotation model.</param>
        /// <param name="isFileInPullRequest">A flag that denotes if the annotation is part of the pull request's changes.</param>
        /// <param name="checkSuite">The check suite model.</param>
        /// <param name="session">The pull request session.</param>
        /// <param name="editorService">The pull request editor service.</param>
        public PullRequestAnnotationItemViewModel(
            CheckRunAnnotationModel annotation,
            bool isFileInPullRequest,
            CheckSuiteModel checkSuite,
            IPullRequestSession session,
            IPullRequestEditorService editorService)
        {
            Annotation          = annotation;
            IsFileInPullRequest = isFileInPullRequest;

            OpenAnnotation = ReactiveCommand.CreateFromTask <Unit>(
                async _ => await editorService.OpenDiff(session, annotation.Path, checkSuite.HeadSha, annotation.EndLine - 1),
                Observable.Return(IsFileInPullRequest));
        }
        PullRequestUserReviewsViewModel CreateTarget(
            IPullRequestEditorService editorService   = null,
            IPullRequestSessionManager sessionManager = null,
            IModelServiceFactory modelServiceFactory  = null)
        {
            editorService       = editorService ?? Substitute.For <IPullRequestEditorService>();
            sessionManager      = sessionManager ?? Substitute.For <IPullRequestSessionManager>();
            modelServiceFactory = modelServiceFactory ?? Substitute.For <IModelServiceFactory>();

            return(new PullRequestUserReviewsViewModel(
                       editorService,
                       sessionManager,
                       modelServiceFactory));
        }
Пример #13
0
        public PullRequestReviewFileCommentViewModel(
            IPullRequestEditorService editorService,
            IPullRequestSession session,
            IPullRequestReviewCommentModel model)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(session, nameof(session));
            Guard.ArgumentNotNull(model, nameof(model));

            this.editorService = editorService;
            this.session       = session;
            this.model         = model;

            Open = ReactiveCommand.CreateAsyncTask(DoOpen);
        }
Пример #14
0
        PullRequestReviewViewModel CreateTarget(
            IPullRequestEditorService editorService = null,
            IPullRequestSession session             = null,
            PullRequestDetailModel pullRequest      = null,
            PullRequestReviewModel model            = null)
        {
            editorService = editorService ?? Substitute.For <IPullRequestEditorService>();
            session       = session ?? Substitute.For <IPullRequestSession>();
            pullRequest   = pullRequest ?? CreatePullRequest();
            model         = model ?? pullRequest.Reviews[0];

            return(new PullRequestReviewViewModel(
                       editorService,
                       session,
                       model));
        }
Пример #15
0
        public PullRequestReviewAuthoringViewModel(
            IPullRequestService pullRequestService,
            IPullRequestEditorService editorService,
            IPullRequestSessionManager sessionManager,
            IMessageDraftStore draftStore,
            IPullRequestFilesViewModel files,
            IAutoCompleteAdvisor autoCompleteAdvisor,
            IScheduler timerScheduler)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(sessionManager, nameof(sessionManager));
            Guard.ArgumentNotNull(draftStore, nameof(draftStore));
            Guard.ArgumentNotNull(files, nameof(files));
            Guard.ArgumentNotNull(autoCompleteAdvisor, nameof(autoCompleteAdvisor));
            Guard.ArgumentNotNull(timerScheduler, nameof(timerScheduler));

            this.pullRequestService = pullRequestService;
            this.editorService      = editorService;
            this.sessionManager     = sessionManager;
            this.draftStore         = draftStore;
            this.timerScheduler     = timerScheduler;

            canApproveRequestChanges = this.WhenAnyValue(
                x => x.Model,
                x => x.PullRequestModel,
                (review, pr) => review != null && pr != null && review.Author.Login != pr.Author.Login)
                                       .ToProperty(this, x => x.CanApproveRequestChanges);

            Files = files;
            AutoCompleteAdvisor = autoCompleteAdvisor;

            var hasBodyOrComments = this.WhenAnyValue(
                x => x.Body,
                x => x.FileComments.Count,
                (body, comments) => !string.IsNullOrWhiteSpace(body) || comments > 0);

            Approve = ReactiveCommand.CreateFromTask(() => DoSubmit(Octokit.PullRequestReviewEvent.Approve));
            Comment = ReactiveCommand.CreateFromTask(
                () => DoSubmit(Octokit.PullRequestReviewEvent.Comment),
                hasBodyOrComments);
            RequestChanges = ReactiveCommand.CreateFromTask(
                () => DoSubmit(Octokit.PullRequestReviewEvent.RequestChanges),
                hasBodyOrComments);
            Cancel = ReactiveCommand.CreateFromTask(DoCancel);
            NavigateToPullRequest = ReactiveCommand.Create(() =>
                                                           NavigateTo(Invariant($"{RemoteRepositoryOwner}/{LocalRepository.Name}/pull/{PullRequestModel.Number}")));
        }
        public PullRequestReviewCommentViewModel(
            IPullRequestEditorService editorService,
            IPullRequestSession session,
            string relativePath,
            PullRequestReviewCommentModel model)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(session, nameof(session));
            Guard.ArgumentNotNull(model, nameof(model));

            this.editorService = editorService;
            this.session       = session;
            this.model         = model;
            RelativePath       = relativePath;

            Open = ReactiveCommand.CreateFromTask(DoOpen);
        }
Пример #17
0
        /// <summary>
        /// Initializes a new instance of the <see cref="PullRequestReviewViewModel"/> class.
        /// </summary>
        /// <param name="editorService">The pull request editor service.</param>
        /// <param name="session">The pull request session.</param>
        /// <param name="model">The pull request review model.</param>
        public PullRequestReviewViewModel(
            IPullRequestEditorService editorService,
            IPullRequestSession session,
            PullRequestReviewModel model)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(session, nameof(session));
            Guard.ArgumentNotNull(model, nameof(model));

            Model        = model;
            Body         = string.IsNullOrWhiteSpace(Model.Body) ? null : Model.Body;
            StateDisplay = ToString(Model.State);

            var comments = new List <IPullRequestReviewFileCommentViewModel>();
            var outdated = new List <IPullRequestReviewFileCommentViewModel>();

            foreach (var comment in model.Comments)
            {
                if (comment.Thread != null)
                {
                    var vm = new PullRequestReviewCommentViewModel(
                        editorService,
                        session,
                        comment.Thread.Path,
                        comment);

                    if (comment.Thread.Position != null)
                    {
                        comments.Add(vm);
                    }
                    else
                    {
                        outdated.Add(vm);
                    }
                }
            }

            FileComments         = comments;
            OutdatedFileComments = outdated;

            HasDetails = Body != null ||
                         FileComments.Count > 0 ||
                         OutdatedFileComments.Count > 0;
        }
        public PullRequestReviewAuthoringViewModel(
            IPullRequestEditorService editorService,
            IPullRequestSessionManager sessionManager,
            IModelServiceFactory modelServiceFactory,
            IPullRequestFilesViewModel files)
        {
            Guard.ArgumentNotNull(editorService, nameof(editorService));
            Guard.ArgumentNotNull(sessionManager, nameof(sessionManager));
            Guard.ArgumentNotNull(modelServiceFactory, nameof(modelServiceFactory));
            Guard.ArgumentNotNull(files, nameof(files));

            this.editorService       = editorService;
            this.sessionManager      = sessionManager;
            this.modelServiceFactory = modelServiceFactory;

            canApproveRequestChanges = this.WhenAnyValue(
                x => x.Model,
                x => x.PullRequestModel,
                (review, pr) => review != null && pr != null && review.User.Login != pr.Author.Login)
                                       .ToProperty(this, x => x.CanApproveRequestChanges);

            Files = files;

            var hasBodyOrComments = this.WhenAnyValue(
                x => x.Body,
                x => x.FileComments.Count,
                (body, comments) => !string.IsNullOrWhiteSpace(body) || comments > 0);

            Approve = ReactiveCommand.CreateAsyncTask(_ => DoSubmit(Octokit.PullRequestReviewEvent.Approve));
            Comment = ReactiveCommand.CreateAsyncTask(
                hasBodyOrComments,
                _ => DoSubmit(Octokit.PullRequestReviewEvent.Comment));
            RequestChanges = ReactiveCommand.CreateAsyncTask(
                hasBodyOrComments,
                _ => DoSubmit(Octokit.PullRequestReviewEvent.RequestChanges));
            Cancel = ReactiveCommand.CreateAsyncTask(DoCancel);
            NavigateToPullRequest = ReactiveCommand.Create().OnExecuteCompleted(_ =>
                                                                                NavigateTo(Invariant($"{LocalRepository.Owner}/{LocalRepository.Name}/pull/{PullRequestModel.Number}")));
        }