Example #1
0
        public async Task MakeReviewBasedOnProvisionalAfterRevisionHasBeenSaved(string oldFileName, string newFileName)
        {
            var commits1 = Commits(Head1);

            _repository.SetupDiff(commits1.Base, commits1.Head,
                                  Modified("file1"),
                                  Modified("file2"),
                                  Modified("file3"),
                                  Modified("file4")
                                  );

            var file1 = PathPair.Make(oldFileName, newFileName);

            await Handle(commits1, _reviewer1,
                         MakeReviewDiscussion(Head1, 1),
                         MakeFileDiscussion(Head1, file1, 1),
                         ReviewedFiles(Head1, file1)
                         );

            await Handle(commits1, _reviewer2,
                         MakeReviewDiscussion(Head1, 1),
                         MakeFileDiscussion(Head1, file1, 1),
                         ReviewedFiles(Head1, "file2")
                         );

            Assert.That(_sessionAdapter.Revisions, Has.Count.EqualTo(1));

            Assert.That(_sessionAdapter.Reviews, HasReviewFor(_reviewer1, _sessionAdapter.Revisions[0]));
            Assert.That(_sessionAdapter.Reviews, HasReviewFor(_reviewer2, _sessionAdapter.Revisions[0]));

            Assert.That(_sessionAdapter.FilesInRevision(1), Is.EquivalentTo(new[] { "file1", "file2", "file3", "file4" }));

            Assert.That(_sessionAdapter.ReviewedFiles(_reviewer1, 1), Is.EquivalentTo(new[] { "file1" }));
            Assert.That(_sessionAdapter.ReviewedFiles(_reviewer2, 1), Is.EquivalentTo(new[] { "file2" }));
        }
Example #2
0
        private void cmdOk_Click(object sender, EventArgs e)
        {
            if (lvPaths.Items.Count == 0 && !string.IsNullOrEmpty(txtSource.Text) && !string.IsNullOrEmpty(txtDestination.Text))
            {
                var result = MessageBox.Show($"Would you like to add the following paths to the list of paths to compare?\r\r\r\n{txtSource.Text}\r\n{txtDestination.Text}", "InZync - Paths", MessageBoxButtons.YesNoCancel);
                if (result == DialogResult.Yes)
                {
                    cmdAdd_Click(sender, e);
                } else if (result == DialogResult.Cancel)
                {
                    DialogResult = DialogResult.None;
                    return;
                }
            }

            // copy items from ListView to ArrayList
            pathList.Clear();
            foreach (ListViewItem lvi in lvPaths.Items)
            {
                PathPair pp = new PathPair();
                pp.Source = lvi.SubItems[0].Text;
                if (!pp.Source.EndsWith("\\") && (pp.Source != ""))
                {
                    pp.Source += "\\";
                }
                pp.Destination = lvi.SubItems[1].Text;
                if (!pp.Destination.EndsWith("\\") && (pp.Destination != ""))
                {
                    pp.Destination += "\\";
                }
                pathList.Add(pp);
            }

            DialogResult = DialogResult.OK;
        }
        public void Append(RevisionId revisionId, PathPair path, FileHistoryEntry historyEntry)
        {
            string fileId;

            if (historyEntry.FileId != Guid.Empty)
            {
                fileId = historyEntry.FileId.ToString();
            }
            else
            {
                fileId = "PROV_" + Convert.ToBase64String(Encoding.UTF8.GetBytes($"{path.OldPath}\0{path.NewPath}"));
            }

            var matrixEntry = Find(x => x.FileId == fileId);

            if (matrixEntry == null)
            {
                matrixEntry = new Entry(_revisions)
                {
                    FileId = fileId
                };
                Add(matrixEntry);
            }

            matrixEntry.Revisions[revisionId] = Status.From(path, historyEntry);
        }
 public static Status From(PathPair path, FileHistoryEntry historyEntry) => new Status
 {
     File        = path,
     IsNew       = historyEntry.IsNew,
     IsRenamed   = historyEntry.IsRenamed,
     IsDeleted   = historyEntry.IsDeleted,
     IsUnchanged = !historyEntry.IsModified,
 };
 public static Status Unchanged(PathPair file) => new Status
 {
     File        = PathPair.Make(file.NewPath),
     IsDeleted   = false,
     IsNew       = false,
     IsRenamed   = false,
     IsUnchanged = true
 };
 public FileRange(string fileId, PathPair reviewFile, PathPair diffFile, RevisionId previous, RevisionId current)
 {
     FileId     = fileId;
     DiffFile   = diffFile;
     Previous   = previous;
     Current    = current;
     ReviewFile = reviewFile;
 }
Example #7
0
        public void WriteProvisionalIdOnlyNew()
        {
            var clientFileId = ClientFileId.Provisional(PathPair.Make("path"));

            var text = ClientFileId.Write(clientFileId);

            Assert.That(text, Is.EqualTo("PROV_cGF0aABwYXRo"));
        }
Example #8
0
        public void WriteProvisionalIdOldAndNew()
        {
            var clientFileId = ClientFileId.Provisional(PathPair.Make("path1", "path2"));

            var text = ClientFileId.Write(clientFileId);

            Assert.That(text, Is.EqualTo("PROV_cGF0aDEAcGF0aDI="));
        }
        public void TMP_FillFullRangeFilePath()
        {
            foreach (var entry in this)
            {
                var oldPath = entry.Revisions.First().Value.File.OldPath;
                var newPath = entry.Revisions.Last().Value.File.NewPath;

                entry.File = PathPair.Make(oldPath, newPath);
            }
        }
        public static ClientFileId Parse(string s)
        {
            if (s.StartsWith("PROV_"))
            {
                var bytes   = Convert.FromBase64String(s.Substring(5));
                var decoded = Encoding.UTF8.GetString(bytes);
                var parts   = decoded.Split('\0', 2);

                return(ClientFileId.Provisional(PathPair.Make(parts[0], parts[1])));
            }
            else
            {
                return(ClientFileId.Persistent(Guid.Parse(s)));
            }
        }
        public static IEnumerable <FileRange> FindFilesToReview(this FileMatrix matrix, string reviewerUserName)
        {
            foreach (var entry in matrix)
            {
                var(lastChangedIndex, lastChanged) = entry.Revisions.LastWithIndex(x => !x.Value.IsUnchanged);

                var lastReviewed = entry.Revisions
                                   .Take(lastChangedIndex + 1)
                                   .Select(x => x.WrapAsNullable())
                                   .Reverse()
                                   .SkipWhile(x => !x.Value.Value.Reviewers.Contains(reviewerUserName))
                                   .FirstOrDefault();


                PathPair   fileToReview;
                RevisionId previousRevision;
                IEnumerable <KeyValuePair <RevisionId, FileMatrix.Status> > reviewedRange;

                var currentRevision = lastChanged.Key;

                if (!lastReviewed.HasValue)
                {
                    fileToReview     = entry.Revisions.First().Value.File.WithNewName(lastChanged.Value.File.NewPath);
                    previousRevision = new RevisionId.Base();
                    reviewedRange    = entry.Revisions.Take(lastChangedIndex + 1);
                }
                else
                {
                    fileToReview     = PathPair.Make(lastReviewed.Value.Value.File.NewPath, lastChanged.Value.File.NewPath);
                    previousRevision = lastReviewed.Value.Key;
                    var lastIndex = entry.Revisions.Keys.IndexOf(lastReviewed.Value.Key);
                    reviewedRange = entry.Revisions.Skip(lastIndex + 1).Take(lastChangedIndex - lastIndex + 1);
                }

                yield return(new FileRange(entry.FileId, entry.File, fileToReview, previousRevision, currentRevision)
                {
                    ChangeType = DetermineChangeType(reviewedRange)
                });
            }
        }
Example #12
0
        public async Task Publish(NewFileDiscussion[] discussions, Dictionary <string, Guid> newCommentsMap, Dictionary <string, Guid> newDiscussionsMap)
        {
            foreach (var discussion in discussions)
            {
                var commentId    = GuidComb.Generate();
                var discussionId = GuidComb.Generate();

                newCommentsMap[discussion.TemporaryId]    = commentId;
                newDiscussionsMap[discussion.TemporaryId] = discussionId;

                var review = _reviewForRevision(discussion.TargetRevisionId);

                var resolvedFileId = _resolveFileId(discussion.FileId);

                var currentRevision = _sessionAdapter.GetRevision(review.RevisionId);
                var prevRevision    = _sessionAdapter.GetPreviousRevision(currentRevision);

                var currentEntry = _sessionAdapter.GetFileHistoryEntry(resolvedFileId, currentRevision);
                var prevEntry    = _sessionAdapter.GetFileHistoryEntry(resolvedFileId, prevRevision);

                _sessionAdapter.Save(new FileDiscussion
                {
                    RevisionId  = review.RevisionId,
                    Id          = discussionId,
                    FileId      = resolvedFileId,
                    File        = PathPair.Make(prevEntry?.FileName ?? currentEntry.FileName, currentEntry.FileName),
                    LineNumber  = discussion.LineNumber,
                    State       = discussion.State.AsCommentState(),
                    RootComment = new Comment
                    {
                        Id = commentId,
                        PostedInReviewId = review.Id,
                        Content          = discussion.Content,
                        CreatedAt        = DateTimeOffset.UtcNow
                    }
                });
            }
        }
Example #13
0
        public ExternalFile NextFile()
        {
            //Sanity check
            if (m_files == null || m_files.Count == 0)
            {
                return(null);
            }

            //Prepare external file
            PathPair     curpath = (PathPair)m_files[0];
            ExternalFile file    = new ExternalFile();
            FileStream   data    = new FileStream(curpath.AbsolutePath, FileMode.Open);

            file.DataStream = data;
            file.Directory  = false;
            file.Path       = curpath.RelativePath;
            file.Size       = (int)data.Length;

            //Pop off a file
            m_files.RemoveAt(0);

            return(file);
        }
Example #14
0
 public WatcherItem(PathPair file, WatcherItemType type)
 {
     m_type = type;
       m_sFullPathFileName = file.m_sFull_FileName;
       m_sParsedFileName = file.m_sMatch_FileName;
       if (type == WatcherItemType.Added)
     fileInfo = new FileInfo(file.m_sFull_FileName);
       LogMyFilms.Debug("File monitor: " + m_sParsedFileName + " " + m_type);
 }
Example #15
0
 public WatcherItem(PathPair file, WatcherItemType type)
 {
     m_type = type;
     m_sFullPathFileName = file.m_sFull_FileName;
     m_sParsedFileName = file.m_sMatch_FileName;           
     if (type == WatcherItemType.Added)
         fileInfo = new FileInfo(file.m_sFull_FileName);
     MPTVSeriesLog.Write("File monitor: " + m_sParsedFileName + " " + m_type);
 }
Example #16
0
            private async Task <FileMatrix> BuildMatrix(GetFileMatrix query)
            {
                var revisions = await _session.Query <ReviewRevision>()
                                .Where(x => x.ReviewId == query.ReviewId)
                                .OrderBy(x => x.RevisionNumber)
                                .ToListAsync();

                var revisionIds = revisions.Select(x => (RevisionId) new RevisionId.Selected(x.RevisionNumber));

                var mergeRequest = await _api.GetMergeRequestInfo(query.ReviewId.ProjectId, query.ReviewId.ReviewId);

                var hasProvisional = !revisions.Any() || mergeRequest.HeadCommit != revisions.Last().HeadCommit;

                if (hasProvisional)
                {
                    revisionIds = revisionIds.Union(new RevisionId.Hash(mergeRequest.HeadCommit));
                }

                var fileHistoryEntries = await _session.Query <FileHistoryEntry>()
                                         .Where(x => x.ReviewId == query.ReviewId)
                                         .GroupBy(x => x.FileId)
                                         .ToListAsync();

                var provisionalDiff = new List <FileDiff>();

                if (hasProvisional)
                {
                    provisionalDiff = await _api.GetDiff(query.ReviewId.ProjectId, revisions.LastOrDefault()?.HeadCommit ?? mergeRequest.BaseCommit, mergeRequest.HeadCommit);

                    if (_features.For("dont-show-excesive-files-from-rebases").IsActive)
                    {
                        if (revisions.Any() && revisions.Last().HeadCommit != mergeRequest.HeadCommit)
                        {
                            provisionalDiff = (await RelevantFilesFilter.Filter(provisionalDiff, fileHistoryEntries, query.ReviewId, mergeRequest.BaseCommit, mergeRequest.HeadCommit, _api)).ToList();
                        }
                    }
                }

                var remainingDiffs = new HashSet <FileDiff>(provisionalDiff);

                var matrix = new FileMatrix(revisionIds);

                var revisionsMap = revisions.ToDictionary(x => (Guid?)x.Id);

                foreach (var(fileId, history) in fileHistoryEntries)
                {
                    var sortedHistory = history
                                        .OrderBy(x => x.RevisionId.HasValue ? revisionsMap[x.RevisionId].RevisionNumber : int.MinValue);

                    FileHistoryEntry previousEntry = null;

                    foreach (var entry in sortedHistory)
                    {
                        if (entry.RevisionId == null)
                        {
                            previousEntry = entry;
                            continue;
                        }

                        var rev = revisionsMap[entry.RevisionId];

                        string oldPath = previousEntry?.FileName ?? entry.FileName;

                        var path = PathPair.Make(oldPath, entry.FileName);

                        matrix.Append(new RevisionId.Selected(rev.RevisionNumber), path, entry);
                        previousEntry = entry;
                    }

                    if (hasProvisional)
                    {
                        var diff = remainingDiffs.SingleOrDefault(x => x.Path.OldPath == previousEntry.FileName);
                        remainingDiffs.Remove(diff);

                        if (diff != null)
                        {
                            matrix.Append(new RevisionId.Hash(mergeRequest.HeadCommit), diff.Path, new FileHistoryEntry
                            {
                                FileId     = fileId,
                                FileName   = diff.Path.NewPath,
                                IsNew      = diff.NewFile,
                                IsDeleted  = diff.DeletedFile,
                                IsModified = true,
                                IsRenamed  = diff.RenamedFile
                            });
                        }
                    }
                }

                foreach (var diff in remainingDiffs)
                {
                    matrix.Append(new RevisionId.Hash(mergeRequest.HeadCommit), diff.Path, new FileHistoryEntry
                    {
                        FileId     = Guid.Empty,
                        FileName   = diff.Path.NewPath,
                        IsNew      = diff.NewFile,
                        IsDeleted  = diff.DeletedFile,
                        IsModified = true,
                        IsRenamed  = diff.RenamedFile
                    });
                }

                matrix.TMP_FillFullRangeFilePath();

                matrix.FillUnchanged();
                matrix.Sort(DelegateComparer.For((FileMatrix.Entry e) => e.File.NewPath));
                return(matrix);
            }
Example #17
0
 public FileReview(PathPair file, Guid fileId)
 {
     File   = file;
     FileId = fileId;
 }
 public static ClientFileId Provisional(PathPair path) => new ClientFileId
 {
     PersistentId = Guid.Empty, ProvisionalPathPair = path
 };