public GetDiffDiscussions(ReviewIdentifier reviewId, HashSet commits, ClientFileId fileId, string rightFileName)
 {
     ReviewId      = reviewId;
     Commits       = commits;
     FileId        = fileId;
     RightFileName = rightFileName;
 }
Ejemplo n.º 2
0
        public void WriteProvisionalIdOnlyNew()
        {
            var clientFileId = ClientFileId.Provisional(PathPair.Make("path"));

            var text = ClientFileId.Write(clientFileId);

            Assert.That(text, Is.EqualTo("PROV_cGF0aABwYXRo"));
        }
Ejemplo n.º 3
0
        public void WriteProvisionalIdOldAndNew()
        {
            var clientFileId = ClientFileId.Provisional(PathPair.Make("path1", "path2"));

            var text = ClientFileId.Write(clientFileId);

            Assert.That(text, Is.EqualTo("PROV_cGF0aDEAcGF0aDI="));
        }
Ejemplo n.º 4
0
        public void ParseProvisionalIdOnlyNew()
        {
            var clientFileId = ClientFileId.Parse("PROV_cGF0aABwYXRo");

            Assert.That(clientFileId.IsProvisional, Is.True);
            Assert.That(clientFileId.ProvisionalPathPair.OldPath, Is.EqualTo("path"));
            Assert.That(clientFileId.ProvisionalPathPair.NewPath, Is.EqualTo("path"));
        }
Ejemplo n.º 5
0
        public void ParseProvisionalIdOldAndNew()
        {
            var clientFileId = ClientFileId.Parse("PROV_cGF0aDEAcGF0aDI=");

            Assert.That(clientFileId.IsProvisional, Is.True);
            Assert.That(clientFileId.ProvisionalPathPair.OldPath, Is.EqualTo("path1"));
            Assert.That(clientFileId.ProvisionalPathPair.NewPath, Is.EqualTo("path2"));
        }
Ejemplo n.º 6
0
        public void ParsePersistentId()
        {
            var guid = "9acf4124-e1eb-44cd-bdbb-f8c675bce872";

            var clientFileId = ClientFileId.Parse(guid);

            Assert.That(clientFileId.IsProvisional, Is.False);
            Assert.That(clientFileId.PersistentId, Is.EqualTo(Guid.Parse(guid)));
        }
Ejemplo n.º 7
0
        public void WritePersistentId()
        {
            var guid = "69e1cf41-71cb-4384-86c9-c66706dcf3ea";

            var clientFileId = ClientFileId.Persistent(Guid.Parse(guid));

            var text = ClientFileId.Write(clientFileId);

            Assert.That(text, Is.EqualTo(guid));
        }
        public async Task <(Guid RevisionId, Dictionary <ClientFileId, Guid> ClientFileIdMap, Dictionary <string, Guid> ByName)> FindOrCreateRevision(ReviewIdentifier reviewId, PublishReview.RevisionCommits commits, FeatureToggle features)
        {
            var existingRevision = await _sessionAdapter.GetRevision(reviewId, commits);

            if (existingRevision != null)
            {
                var fileHistory = _sessionAdapter.GetFileHistoryEntries(existingRevision);

                var idMap = fileHistory.ToDictionary(x => ClientFileId.Persistent(x.FileId), x => x.FileId);

                var nameMap = fileHistory.GroupBy(x => x.FileName).ToDictionary(x => x.Key, x => x.First().FileId);

                return(existingRevision.Id, idMap, nameMap);
            }

            // create revision
            var nextNumber = _sessionAdapter.GetNextRevisionNumber(reviewId);

            await CreateRef(reviewId, nextNumber, commits.Base, "base", _api);

            try
            {
                await CreateRef(reviewId, nextNumber, commits.Head, "head", _api);
            }
            catch (ExistingRefConflictException unexpectedException)
            {
                // The base ref is already created, we must add the record to database no matter what
                Console.WriteLine("Failed to create ref for head commit - ignoring");
                Console.WriteLine(unexpectedException.ToString());
            }

            var revision = await _factory.Create(reviewId, nextNumber, commits.Base, commits.Head);

            await _sessionAdapter.Save(revision);

            var clientFileIdMap = await new FillFileHistory(_sessionAdapter, _api, revision, features).Fill();

            var byClientId = clientFileIdMap.ToDictionary(x => x.Key, x => x.Value.Item2);

            var byName = clientFileIdMap.GroupBy(x => x.Value.Item1).ToDictionary(x => x.Key, x => x.First().Value.Item2);

            return(RevisionId : revision.Id, ClientFileIdMap : byClientId, byName);
        }
Ejemplo n.º 9
0
        public ReviewInfoModule(IQueryRunner query, ICommandDispatcher command, FeatureToggle features) : base("/api/project/{projectId}/review/{reviewId}")
        {
            this.AddToLogContext(new Dictionary <string, Func <object> >
            {
                ["api.projectId"] = () => ReviewId.ProjectId,
                ["api.reviewId"]  = () => ReviewId.ReviewId
            });

            Get("/info", async _ => await query.Query(new GetReviewInfo(_.projectId, _.reviewId)));
            Get("/matrix", async _ => await query.Query(new GetFileMatrix(ReviewId)));

            if (features.For("DiffV3").IsActive)
            {
                Get("/diff/{previous_base}/{previous_head}/{current_base}/{current_head}",
                    async _ => await query.Query(new GetFileDiff_Line(
                                                     ReviewId,
                                                     new GetFileDiff_Line.HashSet
                {
                    PreviousBase = (string)_.previous_base,
                    PreviousHead = (string)_.previous_head,
                    CurrentBase  = (string)_.current_base,
                    CurrentHead  = (string)_.current_head,
                },
                                                     Request.Query.oldPath, Request.Query.newPath
                                                     )));
            }
            else
            {
                Get("/diff/{previous_base}/{previous_head}/{current_base}/{current_head}",
                    async _ => await query.Query(new GetFileDiff(
                                                     ReviewId,
                                                     new GetFileDiff.HashSet
                {
                    PreviousBase = (string)_.previous_base,
                    PreviousHead = (string)_.previous_head,
                    CurrentBase  = (string)_.current_base,
                    CurrentHead  = (string)_.current_head,
                },
                                                     Request.Query.oldPath, Request.Query.newPath
                                                     )));
            }

            Get("/discussions/{previous_base}/{previous_head}/{current_base}/{current_head}/{fileId}",
                async _ => await query.Query(new GetDiffDiscussions(
                                                 ReviewId,
                                                 new GetDiffDiscussions.HashSet
            {
                PreviousBase = (string)_.previous_base,
                PreviousHead = (string)_.previous_head,
                CurrentBase  = (string)_.current_base,
                CurrentHead  = (string)_.current_head,
            },
                                                 ClientFileId.Parse((string)_.fileId),
                                                 (string)Request.Query.fileName
                                                 )));

            Post("/publish", async _ =>
            {
                try
                {
                    await command.Execute(this.Bind <PublishReview>());
                    return(new
                    {
                        ok = true
                    });
                }
                catch (ReviewConcurrencyException)
                {
                    return(Response.AsJson(new { error = "review_concurrency" }, HttpStatusCode.Conflict));
                }
            });

            Post("/merge_request/merge", async _ =>
            {
                try
                {
                    await command.Execute(this.Bind <MergePullRequest>());
                    return(new { });
                }
                catch (MergeFailedException)
                {
                    return(Response.AsJson(new { error = "merge_failed" }, HttpStatusCode.ImATeapot));
                }
            });

            Get("/status", async _ => await query.Query(new GetReviewStatus(ReviewId)));

            Get("/commit_status_base", async _ => await query.Query(new GetCommitStatusInput(ReviewId)));

            Get("/emoji", async _ => await query.Query(new GetReviewEmoji(ReviewId)));
        }
Ejemplo n.º 10
0
        public async Task <Dictionary <ClientFileId, (string, Guid)> > Fill()
        {
            var(previousRevId, previousHead) = _sessionAdapter.FindPreviousRevision(_currentRevision.ReviewId, _currentRevision.RevisionNumber, _currentRevision.BaseCommit);

            var diff = await _api.GetDiff(_currentRevision.ReviewId.ProjectId, previousHead, _currentRevision.HeadCommit);

            if (_features.For("dont-show-excesive-files-from-rebases").IsActive)
            {
                var fileHistoryEntries = await _sessionAdapter.GetReviewFileHistory(_currentRevision.ReviewId);

                diff = (await RelevantFilesFilter.Filter(diff, fileHistoryEntries, _currentRevision.ReviewId, _currentRevision.BaseCommit, _currentRevision.HeadCommit, _api)).ToList();
            }

            TMP_FIllOldRevisionFiles(diff);

            var fileIds = _sessionAdapter.FetchFileIds(previousRevId);

            var clientFileIdMap = fileIds.ToDictionary(x => ClientFileId.Persistent(x.Key), x => (x.Value, x.Key));

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

            foreach (var(fileId, latestFileName) in fileIds)
            {
                var allMatchingDiffs = remainingDiffs.Where(x => x.Path.OldPath == latestFileName);
                if (allMatchingDiffs.Count() > 1)
                {
                    Logger.Error($"More that one diff found for {latestFileName}");
                }

                var matchingDiff = allMatchingDiffs.FirstOrDefault();
                if (matchingDiff != null)
                {
                    remainingDiffs.Remove(matchingDiff);
                }

                _sessionAdapter.Save(new FileHistoryEntry
                {
                    Id         = GuidComb.Generate(),
                    RevisionId = _currentRevision.Id,
                    ReviewId   = _currentRevision.ReviewId,
                    FileId     = fileId,
                    FileName   = matchingDiff?.Path.NewPath ?? latestFileName,
                    IsNew      = matchingDiff?.NewFile ?? false,
                    IsDeleted  = matchingDiff?.DeletedFile ?? false,
                    IsRenamed  = matchingDiff?.RenamedFile ?? false,
                    IsModified = matchingDiff != null
                });
            }

            foreach (var file in remainingDiffs)
            {
                var fileId = GuidComb.Generate();

                clientFileIdMap[ClientFileId.Provisional(file.Path)] = (file.Path.NewPath, fileId);

                if (file.RenamedFile)
                {
                    _sessionAdapter.Save(new FileHistoryEntry
                    {
                        Id         = GuidComb.Generate(),
                        RevisionId = null,
                        ReviewId   = _currentRevision.ReviewId,
                        FileId     = fileId,
                        FileName   = file.Path.OldPath,
                        IsNew      = false,
                        IsDeleted  = false,
                        IsRenamed  = false,
                        IsModified = false
                    });
                }

                _sessionAdapter.Save(new FileHistoryEntry
                {
                    Id         = GuidComb.Generate(),
                    RevisionId = _currentRevision.Id,
                    ReviewId   = _currentRevision.ReviewId,
                    FileId     = fileId,
                    FileName   = file.Path.NewPath,
                    IsNew      = file.NewFile,
                    IsDeleted  = file.DeletedFile,
                    IsRenamed  = file.RenamedFile,
                    IsModified = true
                });
            }

            return(clientFileIdMap);
        }