public GetDiffDiscussions(ReviewIdentifier reviewId, HashSet commits, ClientFileId fileId, string rightFileName) { ReviewId = reviewId; Commits = commits; FileId = fileId; RightFileName = rightFileName; }
public void WriteProvisionalIdOnlyNew() { var clientFileId = ClientFileId.Provisional(PathPair.Make("path")); var text = ClientFileId.Write(clientFileId); Assert.That(text, Is.EqualTo("PROV_cGF0aABwYXRo")); }
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 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")); }
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")); }
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))); }
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); }
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))); }
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); }