public PullRequestEditorService(
            IGitHubServiceProvider serviceProvider,
            IPullRequestService pullRequestService,
            IVsEditorAdaptersFactoryService vsEditorAdaptersFactory,
            IStatusBarNotificationService statusBar,
            IGoToSolutionOrPullRequestFileCommand goToSolutionOrPullRequestFileCommand,
            IEditorOptionsFactoryService editorOptionsFactoryService,
            IMessageDraftStore draftStore,
            IInlineCommentPeekService peekService,
            IUsageTracker usageTracker)
        {
            Guard.ArgumentNotNull(serviceProvider, nameof(serviceProvider));
            Guard.ArgumentNotNull(pullRequestService, nameof(pullRequestService));
            Guard.ArgumentNotNull(vsEditorAdaptersFactory, nameof(vsEditorAdaptersFactory));
            Guard.ArgumentNotNull(statusBar, nameof(statusBar));
            Guard.ArgumentNotNull(goToSolutionOrPullRequestFileCommand, nameof(goToSolutionOrPullRequestFileCommand));
            Guard.ArgumentNotNull(goToSolutionOrPullRequestFileCommand, nameof(editorOptionsFactoryService));
            Guard.ArgumentNotNull(usageTracker, nameof(usageTracker));
            Guard.ArgumentNotNull(peekService, nameof(peekService));
            Guard.ArgumentNotNull(draftStore, nameof(draftStore));

            this.serviceProvider         = serviceProvider;
            this.pullRequestService      = pullRequestService;
            this.vsEditorAdaptersFactory = vsEditorAdaptersFactory;
            this.statusBar = statusBar;
            this.goToSolutionOrPullRequestFileCommand = goToSolutionOrPullRequestFileCommand;
            this.editorOptionsFactoryService          = editorOptionsFactoryService;
            this.draftStore   = draftStore;
            this.peekService  = peekService;
            this.usageTracker = usageTracker;
        }
Example #2
0
        async Task <PullRequestReviewCommentThreadViewModel> CreateTarget(
            IMessageDraftStore draftStore             = null,
            IViewViewModelFactory factory             = null,
            IPullRequestSession session               = null,
            IPullRequestSessionFile file              = null,
            IEnumerable <InlineCommentModel> comments = null,
            bool newThread = false)
        {
            draftStore = draftStore ?? Substitute.For <IMessageDraftStore>();
            factory    = factory ?? CreateFactory();
            session    = session ?? CreateSession();
            file       = file ?? CreateFile();
            comments   = comments ?? CreateComments();

            var result = new PullRequestReviewCommentThreadViewModel(draftStore, factory);

            if (newThread)
            {
                await result.InitializeNewAsync(session, file, 10, DiffSide.Right, true);
            }
            else
            {
                var thread = Substitute.For <IInlineCommentThreadModel>();
                thread.Comments.Returns(comments.ToList());
                thread.LineNumber.Returns(10);

                await result.InitializeAsync(session, file, thread, true);
            }

            return(result);
        }
        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));
        }
 public PullRequestCreationViewModel(
     IModelServiceFactory modelServiceFactory,
     IPullRequestService service,
     INotificationService notifications,
     IMessageDraftStore draftStore)
     : this(modelServiceFactory, service, notifications, draftStore, DefaultScheduler.Instance)
 {
 }
        public CommentThreadViewModel(
            IMessageDraftStore draftStore,
            IScheduler timerScheduler)
        {
            Guard.ArgumentNotNull(draftStore, nameof(draftStore));

            DraftStore          = draftStore;
            this.timerScheduler = timerScheduler;
        }
 public PullRequestReviewAuthoringViewModel(
     IPullRequestService pullRequestService,
     IPullRequestEditorService editorService,
     IPullRequestSessionManager sessionManager,
     IMessageDraftStore draftStore,
     IPullRequestFilesViewModel files)
     : this(pullRequestService, editorService, sessionManager, draftStore, files, DefaultScheduler.Instance)
 {
 }
        static Target CreateTarget(
            IMessageDraftStore drafts = null,
            IScheduler scheduler      = null)
        {
            drafts    = drafts ?? Substitute.For <IMessageDraftStore>();
            scheduler = scheduler ?? DefaultScheduler.Instance;

            return(new Target(drafts, scheduler));
        }
 public PullRequestCreationViewModel(
     IModelServiceFactory modelServiceFactory,
     IPullRequestService service,
     INotificationService notifications,
     IMessageDraftStore draftStore,
     IGitService gitService,
     IAutoCompleteAdvisor autoCompleteAdvisor)
     : this(modelServiceFactory, service, notifications, draftStore, gitService, autoCompleteAdvisor, DefaultScheduler.Instance)
 {
 }
        public PullRequestReviewCommentThreadViewModel(
            IMessageDraftStore draftStore,
            IViewViewModelFactory factory)
            : base(draftStore)
        {
            Guard.ArgumentNotNull(factory, nameof(factory));

            this.factory = factory;

            needsPush = this.WhenAnyValue(
                x => x.File.CommitSha,
                x => x.IsNewThread,
                (sha, isNew) => isNew && sha == null)
                        .ToProperty(this, x => x.NeedsPush);
        }
Example #10
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 PullRequestCreationViewModel(
            IModelServiceFactory modelServiceFactory,
            IPullRequestService service,
            INotificationService notifications,
            IMessageDraftStore draftStore,
            IGitService gitService,
            IScheduler timerScheduler)
        {
            Guard.ArgumentNotNull(modelServiceFactory, nameof(modelServiceFactory));
            Guard.ArgumentNotNull(service, nameof(service));
            Guard.ArgumentNotNull(notifications, nameof(notifications));
            Guard.ArgumentNotNull(draftStore, nameof(draftStore));
            Guard.ArgumentNotNull(gitService, nameof(gitService));
            Guard.ArgumentNotNull(timerScheduler, nameof(timerScheduler));

            this.service             = service;
            this.modelServiceFactory = modelServiceFactory;
            this.draftStore          = draftStore;
            this.gitService          = gitService;
            this.timerScheduler      = timerScheduler;

            this.WhenAnyValue(x => x.Branches)
            .WhereNotNull()
            .Where(_ => TargetBranch != null)
            .Subscribe(x =>
            {
                if (!x.Any(t => t.Equals(TargetBranch)))
                {
                    TargetBranch = GitHubRepository.IsFork ? GitHubRepository.Parent.DefaultBranch : GitHubRepository.DefaultBranch;
                }
            });

            SetupValidators();

            var whenAnyValidationResultChanges = this.WhenAny(
                x => x.TitleValidator.ValidationResult,
                x => x.BranchValidator.ValidationResult,
                x => x.IsBusy,
                (x, y, z) => (x.Value?.IsValid ?? false) && (y.Value?.IsValid ?? false) && !z.Value);

            this.WhenAny(x => x.BranchValidator.ValidationResult, x => x.GetValue())
            .WhereNotNull()
            .Where(x => !x.IsValid && x.DisplayValidationError)
            .Subscribe(x => notifications.ShowError(BranchValidator.ValidationResult.Message));

            CreatePullRequest = ReactiveCommand.CreateFromObservable(
                () => service
                .CreatePullRequest(modelService, activeLocalRepo, TargetBranch.Repository, SourceBranch, TargetBranch, PRTitle, Description ?? String.Empty)
                .Catch <IPullRequestModel, Exception>(ex =>
            {
                log.Error(ex, "Error creating pull request");

                //TODO:Will need a uniform solution to HTTP exception message handling
                var apiException = ex as ApiValidationException;
                var error        = apiException?.ApiError?.Errors?.FirstOrDefault();
                notifications.ShowError(error?.Message ?? ex.Message);
                return(Observable.Empty <IPullRequestModel>());
            }),
                whenAnyValidationResultChanges);
            CreatePullRequest.Subscribe(pr =>
            {
                notifications.ShowMessage(String.Format(CultureInfo.CurrentCulture, Resources.PRCreatedUpstream, SourceBranch.DisplayName, TargetBranch.Repository.Owner + "/" + TargetBranch.Repository.Name + "#" + pr.Number,
                                                        TargetBranch.Repository.CloneUrl.ToRepositoryUrl().Append("pull/" + pr.Number)));
                NavigateTo("/pulls?refresh=true");
                Cancel.Execute();
                draftStore.DeleteDraft(GetDraftKey(), string.Empty).Forget();
                Close();
            });

            Cancel = ReactiveCommand.Create(() => { });
            Cancel.Subscribe(_ =>
            {
                Close();
                draftStore.DeleteDraft(GetDraftKey(), string.Empty).Forget();
            });

            isExecuting = CreatePullRequest.IsExecuting.ToProperty(this, x => x.IsExecuting);

            this.WhenAnyValue(x => x.Initialized, x => x.GitHubRepository, x => x.IsExecuting)
            .Select(x => !(x.Item1 && x.Item2 != null && !x.Item3))
            .ObserveOn(RxApp.MainThreadScheduler)
            .Subscribe(x => IsBusy = x);
        }
 public CommentThreadViewModel(IMessageDraftStore draftStore)
     : this(draftStore, DefaultScheduler.Instance)
 {
 }
 public Target(IMessageDraftStore drafts, IScheduler scheduler)
     : base(drafts, scheduler)
 {
 }
Example #14
0
 public Target(IMessageDraftStore drafts, IScheduler scheduler)
     : base(drafts, scheduler)
 {
     Comments = new ReactiveList <ICommentViewModel>();
 }