示例#1
0
        private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo)
        {
            if (TextView.IsClosed)
            {
                return;
            }

            var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber;
            var endLineNumber   = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1;

            var snapshot = TextView.TextBuffer.CurrentSnapshot;

            if (startLineNumber < 0 ||
                startLineNumber >= snapshot.LineCount ||
                endLineNumber < 0 ||
                endLineNumber >= snapshot.LineCount)
            {
                return;
            }

            var startLine = snapshot.GetLineFromLineNumber(startLineNumber);
            var endLine   = snapshot.GetLineFromLineNumber(endLineNumber);

            if (startLine == null || endLine == null)
            {
                return;
            }

            var mapTop    = _scrollBar.Map.GetCoordinateAtBufferPosition(startLine.Start) - 0.5;
            var mapBottom = _scrollBar.Map.GetCoordinateAtBufferPosition(endLine.End) + 0.5;

            diffViewModel.Top    = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapTop)) - 2.0;
            diffViewModel.Height = Math.Round(_scrollBar.GetYCoordinateOfScrollMapPosition(mapBottom)) - diffViewModel.Top + 2.0;
        }
示例#2
0
        public void Execute()
        {
            var window          = new MainWindow();
            var diffView        = new DiffView();
            var windowViewModel = new MainWindowViewModel(diffView);
            var diffViewModel   = new DiffViewModel(Option.SrcPath, Option.DstPath, windowViewModel);

            window.DataContext   = windowViewModel;
            diffView.DataContext = diffViewModel;

            App.Current.MainWindow = window;
            window.Show();
        }
示例#3
0
        public async Task UpdatesTreeDiff()
        {
            using var signal = new SemaphoreSlim(0, 1);

            var shaGenerator = new PseudoShaGenerator();
            var addedFile    = new TreeEntryChangesMock(ChangeKind.Added,
                                                        true, Mode.NonExecutableFile, new ObjectId(shaGenerator.Generate()), "some/p.ath",
                                                        false, Mode.Nonexistent, null, null);
            var firstCommit    = CommitMock.GenerateCommit(shaGenerator, null, 0);
            var secondCommit   = CommitMock.GenerateCommit(shaGenerator, firstCommit.Yield(), 1);
            var compareOptions = new CompareOptions();
            var diff           = new DiffMock(null, (oldTree, newTree, CompareOptions)
                                              => (oldTree, newTree, CompareOptions) == (firstCommit.Tree, secondCommit.Tree, compareOptions)
                    ? new TreeChangesMock(((TreeEntryChanges)addedFile).Yield().ToList())
                    : throw new Exception("Compare was called with wrong arguments."));
            var oldCommit         = Observable.Return(new Variant <Commit, DiffTargets>(firstCommit));
            var newCommit         = Observable.Return(new Variant <Commit, DiffTargets>(secondCommit));
            var head              = new BranchMock(true, false, null, secondCommit, "HEAD");
            var compareOptionsObs = Observable.Return(compareOptions);
            var repo              = new RepositoryMock(new CommitMock[] { firstCommit, secondCommit }, new BranchCollectionMock(head.Yield().ToList()), null, diff);
            var repoObservable    = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>());
            var input             = Observable
                                    .CombineLatest(oldCommit, newCommit, compareOptionsObs, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c));

            Variant <List <TreeEntryChanges>, Unexpected>?value = null;
            var vm = new DiffViewModel(new TestSchedulers(), input);

            using var _ = vm.TreeDiff
                          .Subscribe(val =>
            {
                value = val;
                if (val.Is <List <TreeEntryChanges> >())
                {
                    signal.Release();
                }
            });

            if (value is null)
            {
                value = vm.TreeDiff.Value;
            }
            if (value is null)
            {
                throw new Exception("TreeDiff was not set.");
            }
            if (!value.Is <List <TreeEntryChanges> >())
            {
                await signal.WaitAsync(TimeSpan.FromSeconds(10));
            }
            Assert.IsTrue(value.Is <List <TreeEntryChanges> >());
        }
示例#4
0
        public void UpdatesSelectionInfo()
        {
            var shaGenerator      = new PseudoShaGenerator();
            var firstCommit       = CommitMock.GenerateCommit(shaGenerator, null, 0);
            var secondCommit      = CommitMock.GenerateCommit(shaGenerator, firstCommit.Yield(), 1);
            var diff              = new DiffMock(null, (_1, _2, _3) => new TreeChangesMock(new List <TreeEntryChanges>()));
            var head              = new BranchMock(true, false, null, secondCommit, "HEAD");
            var compareOptions    = new CompareOptions();
            var compareOptionsObs = Observable.Return(compareOptions);
            var repo              = new RepositoryMock(new CommitMock[] { firstCommit, secondCommit }, new BranchCollectionMock(head.Yield().ToList()), null, diff);

            using var oldCommit = new BehaviorSubject <Variant <Commit, DiffTargets>?>(null);
            using var newCommit = new BehaviorSubject <Variant <Commit, DiffTargets>?>(null);
            var repoObservable = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>());
            var input          = Observable
                                 .CombineLatest(oldCommit, newCommit, compareOptionsObs, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c));

            using var vm = new DiffViewModel(new TestSchedulers(), input);
            var selectionInfo = new List <Variant <string, Unexpected, List <TreeEntryChanges>, Commit> >();
            var resetEvent    = new AutoResetEvent(false);

            using var _ = vm.SelectionInfo
                          .Subscribe(info =>
            {
                selectionInfo.Add(info);
                resetEvent.Set();
            });
            resetEvent.WaitOne(TimeSpan.FromSeconds(5));
            newCommit.OnNext(DiffTargets.WorkingDirectory);
            resetEvent.WaitOne(TimeSpan.FromSeconds(5));
            oldCommit.OnNext(secondCommit);
            resetEvent.WaitOne(TimeSpan.FromSeconds(5));
            newCommit.OnNext(firstCommit);
            resetEvent.WaitOne(TimeSpan.FromSeconds(5));
            oldCommit.OnNext(null);
            resetEvent.WaitOne(TimeSpan.FromSeconds(5));

            Assert.AreEqual(5, selectionInfo.Count);
            Assert.AreEqual(0, selectionInfo[0].VariantIndex);
            Assert.AreEqual(2, selectionInfo[1].VariantIndex);
            Assert.AreEqual(0, selectionInfo[2].VariantIndex);
            Assert.AreEqual(0, selectionInfo[3].VariantIndex);
            Assert.AreEqual(3, selectionInfo[4].VariantIndex);
            Assert.AreEqual(firstCommit, selectionInfo[4].Fourth);
        }
示例#5
0
        public async Task <IActionResult> CalculateDiff([FromBody] DiffRequestViewModel guid)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            try
            {
                DiffViewModel diff = await _diffAppService.CalculateDiff(guid.Id);

                return(Ok(diff));
            }
            catch (Exception)
            {
                return(StatusCode((int)HttpStatusCode.InternalServerError));
            }
        }
示例#6
0
        public void CanCreateInstance()
        {
            var diff           = new DiffMock(null, null);
            var oldCommit      = Observable.Return((Variant <Commit, DiffTargets>?)null).Concat(Observable.Never <Variant <Commit, DiffTargets>?>());
            var newCommit      = Observable.Return((Variant <Commit, DiffTargets>?)null).Concat(Observable.Never <Variant <Commit, DiffTargets>?>());
            var compareOptions = Observable.Return(new CompareOptions()).Concat(Observable.Never <CompareOptions>());
            var repo           = new RepositoryMock(new List <CommitMock>(), new BranchCollectionMock(new List <BranchMock>()), null, diff);
            var repoObservable = Observable.Return(repo).Concat(Observable.Never <IRepositoryWrapper>());
            var input          = Observable
                                 .CombineLatest(oldCommit, newCommit, compareOptions, repoObservable, (o, n, c, r) => new DiffViewModelInput(r, o, n, c));

            var vm = new DiffViewModel(new TestSchedulers(), input);
            Variant <List <TreeEntryChanges>, Unexpected>?value = null;

            using var subscription = vm.TreeDiff.Subscribe(treeDiff => value = treeDiff);
            if (value is null)
            {
                throw new Exception("Value was not set.");
            }
            Assert.IsTrue(value.Is <Unexpected>());
            Assert.AreEqual(DiffViewModel.NoCommitSelectedMessage, value.Get <Unexpected>().Message);
        }
示例#7
0
        public async Task CalculateDiff_success()
        {
            //Arrange
            Guid fakeGuid = new Guid();
            DiffRequestViewModel fakeData = new DiffRequestViewModel()
            {
                Id = fakeGuid
            };
            DiffViewModel fakeViewModel = GetDiffViewModelFake(fakeGuid);

            _diffAppServiceMock.Setup(x => x.CalculateDiff(It.IsAny <Guid>()))
            .Returns(Task.FromResult(fakeViewModel));

            //Act
            var diffController = new DiffController(_diffAppServiceMock.Object);

            diffController.ControllerContext.HttpContext = _contextMock.Object;
            var actionResult = await diffController.CalculateDiff(fakeData);

            //Assert
            Assert.Equal((actionResult as OkObjectResult).StatusCode, (int)System.Net.HttpStatusCode.OK);
            Assert.Equal((((ObjectResult)actionResult).Value as DiffViewModel).Id, fakeGuid);
        }
        private void UpdateDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo)
        {
            if (TextView.IsClosed)
            {
                return;
            }

            bool?visible;

            if (diffViewModel.IsDeletion)
            {
                visible = UpdateDeletedDiffDimensions(diffViewModel, hunkRangeInfo);
            }
            else
            {
                visible = UpdateNormalDiffDimensions(diffViewModel, hunkRangeInfo);
            }

            if (visible.HasValue)
            {
                diffViewModel.IsVisible = visible.Value;
            }
        }
 public DiffWindow()
 {
     InitializeComponent();
     diffViewModel = new DiffViewModel(this);
     DataContext   = diffViewModel;
 }
        private bool?UpdateNormalDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo)
        {
            if (hunkRangeInfo.NewHunkRange.NumberOfLines <= 0)
            {
                // if visible, it would have been as a deletion
                return(false);
            }

            var snapshot = TextView.TextBuffer.CurrentSnapshot;

            var startLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber;
            var endLineNumber   = startLineNumber + hunkRangeInfo.NewHunkRange.NumberOfLines - 1;

            if (startLineNumber < 0 ||
                startLineNumber >= snapshot.LineCount ||
                endLineNumber < 0 ||
                endLineNumber >= snapshot.LineCount)
            {
                return(false);
            }

            var startLine = snapshot.GetLineFromLineNumber(startLineNumber);
            var endLine   = snapshot.GetLineFromLineNumber(endLineNumber);

            if (startLine == null || endLine == null)
            {
                return(null);
            }

            var span = new SnapshotSpan(startLine.Start, endLine.End);

            if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span))
            {
                return(false);
            }

            var startLineView = TextView.GetTextViewLineContainingBufferPosition(startLine.Start);
            var endLineView   = TextView.GetTextViewLineContainingBufferPosition(endLine.Start);

            if (startLineView == null || endLineView == null)
            {
                return(false);
            }

            if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < startLineView.Start)
            {
                // starts after the last visible line
                return(false);
            }

            if (TextView.TextViewLines.FirstVisibleLine.Start > endLineView.EndIncludingLineBreak)
            {
                // ends before the first visible line
                return(false);
            }

            double startTop;

            switch (startLineView.VisibilityState)
            {
            case VisibilityState.FullyVisible:
            case VisibilityState.Hidden:
            case VisibilityState.PartiallyVisible:
                startTop = startLineView.Top - TextView.ViewportTop;
                break;

            case VisibilityState.Unattached:
                // if the closest line was past the end we would have already returned
                startTop = 0;
                break;

            default:
                // shouldn't be reachable, but definitely hide if this is the case
                return(false);
            }

            double stopBottom;

            switch (endLineView.VisibilityState)
            {
            case VisibilityState.FullyVisible:
            case VisibilityState.Hidden:
            case VisibilityState.PartiallyVisible:
                stopBottom = endLineView.Bottom - TextView.ViewportTop;
                break;

            case VisibilityState.Unattached:
                // if the closest line was before the start we would have already returned
                stopBottom = TextView.ViewportHeight;
                break;

            default:
                // shouldn't be reachable, but definitely hide if this is the case
                return(false);
            }

            diffViewModel.Top    = startTop;
            diffViewModel.Height = stopBottom - startTop;
            return(true);
        }
        private bool?UpdateDeletedDiffDimensions(DiffViewModel diffViewModel, HunkRangeInfo hunkRangeInfo)
        {
            if (hunkRangeInfo.NewHunkRange.NumberOfLines != 0)
            {
                // unexpected number of lines for a deletion hunk
                return(false);
            }

            var snapshot = TextView.TextBuffer.CurrentSnapshot;

            var followingLineNumber = hunkRangeInfo.NewHunkRange.StartingLineNumber + 1;

            if (followingLineNumber < 0 || followingLineNumber >= snapshot.LineCount)
            {
                return(false);
            }

            var followingLine = snapshot.GetLineFromLineNumber(followingLineNumber);

            if (followingLine == null)
            {
                return(null);
            }

            var span = new SnapshotSpan(followingLine.Start, followingLine.End);

            if (!TextView.TextViewLines.FormattedSpan.IntersectsWith(span))
            {
                return(false);
            }

            var followingLineView = TextView.GetTextViewLineContainingBufferPosition(followingLine.Start);

            if (followingLineView == null)
            {
                return(false);
            }

            if (TextView.TextViewLines.LastVisibleLine.EndIncludingLineBreak < followingLineView.Start)
            {
                // starts after the last visible line
                return(false);
            }

            if (TextView.TextViewLines.FirstVisibleLine.Start > followingLineView.EndIncludingLineBreak)
            {
                // ends before the first visible line
                return(false);
            }

            double followingTop;

            switch (followingLineView.VisibilityState)
            {
            case VisibilityState.FullyVisible:
            case VisibilityState.Hidden:
            case VisibilityState.PartiallyVisible:
                followingTop = followingLineView.Top - TextView.ViewportTop;
                break;

            case VisibilityState.Unattached:
                // if the closest line was past the end we would have already returned
                followingTop = 0;
                break;

            default:
                // shouldn't be reachable, but definitely hide if this is the case
                return(false);
            }

            double center = followingTop;
            double height = TextView.LineHeight;

            diffViewModel.Top    = center - (height / 2.0);
            diffViewModel.Height = TextView.LineHeight;
            return(true);
        }
 public DiffView()
 {
     DataContext = new DiffViewModel();
     InitializeComponent();
 }
示例#13
0
 public DiffDialog(string firstFile = "", string secondFile = "")
 {
     InitializeComponent();
     DataContext = new DiffViewModel(firstFile, secondFile);
 }
示例#14
0
 public DiffDialog()
 {
     InitializeComponent();
     DataContext = new DiffViewModel();
 }