/// <inheritdoc/> public ObjectRepositoryChangeCollection Compare(ObjectId oldCommitId, ObjectId newCommitId) { if (oldCommitId == null) { throw new ArgumentNullException(nameof(oldCommitId)); } if (newCommitId == null) { throw new ArgumentNullException(nameof(newCommitId)); } return(_repositoryProvider.Execute(_repositoryDescription, repository => { var oldRepository = _objectRepositoryLoader.LoadFrom(_container, _repositoryDescription, oldCommitId); var newRepository = _objectRepositoryLoader.LoadFrom(_container, _repositoryDescription, newCommitId); var oldCommit = repository.Lookup <Commit>(oldCommitId); var newCommit = repository.Lookup <Commit>(newCommitId); using (var changes = repository.Diff.Compare <TreeChanges>(oldCommit.Tree, newCommit.Tree)) { ThrowIfNonSupportedChangeTypes(changes); var modified = CollectModifiedNodes(oldRepository, newRepository, changes, oldCommit); var added = CollectAddedNodes(newRepository, changes, newCommit); var deleted = CollectDeletedNodes(oldRepository, changes, oldCommit); _logger.ChangesComputed(modified.Count, added.Count, deleted.Count, oldCommitId, newCommitId); return new ObjectRepositoryChangeCollection(newRepository, added.Concat(modified).Concat(deleted).ToImmutableList(), oldRepository); } })); }
private IImmutableSet <TRepository> LoadRepositories() { var builder = ImmutableSortedSet.CreateBuilder(ObjectRepositoryIdComparer <TRepository> .Instance); foreach (var repositoryPath in Directory.EnumerateDirectories(Path)) { if (Repository.IsValid(repositoryPath)) { var description = new RepositoryDescription(repositoryPath); builder.Add(_repositoryLoader.LoadFrom(this, description)); } } return(builder.ToImmutable()); }
private void Initialize() { Repository.Execute(repository => { EnsureHeadCommit(repository); var rebaseCommit = repository.Lookup <Commit>(RebaseCommitId); var headTip = repository.Head.Tip; var mergeBaseCommit = repository.ObjectDatabase.FindMergeBase(headTip, rebaseCommit); MergeBaseCommitId = mergeBaseCommit.Id; EnsureNoMigrations(); ReplayedCommits = repository.Commits.QueryBy(new CommitFilter { SortBy = CommitSortStrategies.Topological | CommitSortStrategies.Reverse, ExcludeReachableFrom = rebaseCommit, IncludeReachableFrom = headTip, }).Select(c => c.Id).ToImmutableList(); UpdateUpstreamBranchModifiedPaths(repository, rebaseCommit, mergeBaseCommit); StartRepository = _repositoryLoader.LoadFrom(Repository.Container, Repository.RepositoryDescription, RebaseCommitId); Status = _rebaseProcessorFactory(this).ContinueNext(repository); }); }
public void MergeSamePropertyConflict(IObjectRepositoryLoader loader, ObjectRepository sut, Page page, Signature signature, string message, Func <RepositoryDescription, IComputeTreeChanges> computeTreeChangesFactory) { // master: A---C---D // \ / // newBranch: B---' // Arrange var repositoryDescription = RepositoryFixture.GetRepositoryDescription(); sut.SaveInNewRepository(signature, message, repositoryDescription); // A // Act sut.Branch("newBranch"); var updateName = page.With(p => p.Name == "modified name"); sut.Commit(updateName.Repository, signature, message); // B sut.Checkout("master"); var updateNameOther = page.With(p => p.Name == "yet again modified name"); var commitC = sut.Commit(updateNameOther.Repository, signature, message); // C var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); var merge = loaded.Merge("newBranch"); var chunk = merge.ModifiedChunks.Single(); chunk.Resolve(JToken.FromObject("merged name")); var mergeCommit = merge.Apply(signature); // D // Assert var changes = computeTreeChangesFactory(RepositoryFixture.GetRepositoryDescription()) .Compare(commitC, mergeCommit); Assert.That(changes, Has.Count.EqualTo(1)); Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Modified)); Assert.That(changes[0].Old.Name, Is.EqualTo("yet again modified name")); Assert.That(changes[0].New.Name, Is.EqualTo("merged name")); }
public void MergeFileDeletionChange(IObjectRepositoryLoader loader, ObjectRepository sut, Page page, Signature signature, string message, Func <RepositoryDescription, IComputeTreeChanges> computeTreeChangesFactory) { // master: A---C---D // \ / // newBranch: B---' // Arrange var repositoryDescription = RepositoryFixture.GetRepositoryDescription(); sut.SaveInNewRepository(signature, message, repositoryDescription); // A // Act sut.Branch("newBranch"); var updateName = page.With(p => p.Fields.Delete(page.Fields[1])); sut.Commit(updateName.Repository, signature, message); // B sut.Checkout("master"); var updateDescription = page.With(p => p.Description == "modified description"); var commitC = sut.Commit(updateDescription.Repository, signature, message); // C var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); var mergeCommit = loaded.Merge("newBranch").Apply(signature); // D // Assert var changes = computeTreeChangesFactory(RepositoryFixture.GetRepositoryDescription()) .Compare(commitC, mergeCommit); Assert.That(changes, Has.Count.EqualTo(1)); Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Deleted)); Assert.That(changes[0].Old.Id, Is.EqualTo(page.Fields[1].Id)); }
public void LoadLinkField(IObjectRepositoryLoader loader, ObjectRepository sut, LinkField linkField, Signature signature, string message, InMemoryBackend inMemoryBackend) { // Act sut.SaveInNewRepository(signature, message, RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); var loadedLinkField = (LinkField)loaded.GetFromGitPath(linkField.GetFolderPath()); // Assert Assert.That(loadedLinkField.PageLink.Link.Id, Is.EqualTo(linkField.PageLink.Link.Id)); }
public void MergeTwoDifferentPropertiesWithMigrationChanged(IFixture fixture, IObjectRepositoryLoader loader, ObjectRepository sut, Page page, Signature signature, string message) { // master: A-----D-----E---F // \ / / // \ ,---' / // \ / x / // newBranch: B---C---' (B contains a non-idempotent migration) // Arrange var repositoryDescription = RepositoryFixture.GetRepositoryDescription(); sut.SaveInNewRepository(signature, message, repositoryDescription); // A // B, C sut.Branch("newBranch"); var updatedInstance = sut.With(i => i.Migrations.Add(fixture.Create <Migration>())); sut.Commit(updatedInstance.Repository, signature, message); // B var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); var updateName = loaded.Applications[1].Pages[1].With(p => p.Name == "modified name"); loaded.Commit(updateName.Repository, signature, message); // C // D sut.Checkout("master"); var updateDescription = page.With(p => p.Description == "modified description"); sut.Commit(updateDescription.Repository, signature, message); // D loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); // E var mergeStep1 = loaded.Merge("newBranch"); Assert.That(mergeStep1.IsPartialMerge, Is.True); mergeStep1.Apply(signature); // E // F loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); var mergeStep2 = loaded.Merge("newBranch"); Assert.That(mergeStep2.IsPartialMerge, Is.False); mergeStep2.Apply(signature); // F }
public void LoadLargeRepository(IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader) { // Arrange var stopwatch = Stopwatch.StartNew(); // Act loader.LoadFrom(container, RepositoryFixture.BenchmarkRepositoryDescription); // Assert // Child loading is lazy so root load time should be really short Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromMilliseconds(300))); }
public void SearchInLargeRepository(IObjectRepositoryLoader loader) { // Arrange var sut = loader.LoadFrom <ObjectRepository>(RepositoryFixture.BenchmarkRepositoryDescription); var stopwatch = Stopwatch.StartNew(); // Act sut.Flatten().LastOrDefault(o => o.Children.Any()); // Dummy search // Assert // Child loading is lazy so root load time should be really short Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromMinutes(1))); }
public void CreateAndLoadRepository(IObjectRepositoryLoader loader, ObjectRepository sut, Signature signature, string message, InMemoryBackend inMemoryBackend) { // Act sut.SaveInNewRepository(signature, message, RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); // Assert PAssert.IsTrue(AreFunctionnally.Equivalent <ObjectRepository>(() => sut == loaded)); foreach (var apps in sut.Applications.OrderBy(v => v.Id).Zip(loaded.Applications.OrderBy(v => v.Id), (a, b) => new { source = a, desctination = b })) { PAssert.IsTrue(AreFunctionnally.Equivalent <Application>(() => apps.source == apps.desctination)); } }
public void FullLoadInLargeRepository(IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader) { // Arrange var sut = loader.LoadFrom(container, RepositoryFixture.BenchmarkRepositoryDescription); var stopwatch = Stopwatch.StartNew(); // Act var result = sut.Flatten().Last(); stopwatch.Stop(); Console.WriteLine($"Full load total duration: {stopwatch.Elapsed}"); // Assert Assert.That(result, Is.Not.Null); Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromSeconds(30))); }
public void SearchInLargeRepository(IObjectRepositorySearch search, IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader) { // Arrange var sut = loader.LoadFrom(container, RepositoryFixture.BenchmarkRepositoryDescription); var page = sut.Applications.PickRandom().Pages.PickRandom(); var stopwatch = Stopwatch.StartNew(); // Act var result = search.Grep(sut, page.Id.ToString()); stopwatch.Stop(); Console.WriteLine($"Grep total duration: {stopwatch.Elapsed}"); // Assert Assert.That(result, Is.Not.Empty); Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromSeconds(2))); }
public void SearchInLargeRepositoryUsingIndex(IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader) { // Arrange var sut = loader.LoadFrom(container, RepositoryFixture.BenchmarkRepositoryDescription); var referencedPage = File.ReadAllText("Assets\\Benchmark.ReferencedPage.txt").Trim(); var index = sut.Indexes.Single(i => i is LinkFieldReferrerIndex); var stopwatch = Stopwatch.StartNew(); // Act var result = index[referencedPage].ToList(); stopwatch.Stop(); Console.WriteLine($"Grep total duration: {stopwatch.Elapsed}"); // Assert Assert.That(result, Is.Not.Empty); Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromMilliseconds(300))); }
public void ComputeChangesInLargeRepository(IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader, ComputeTreeChangesFactory computeTreeChangesFactory) { // Arrange var sut = loader.LoadFrom(container, RepositoryFixture.BenchmarkRepositoryDescription); var fieldToModify = sut.Flatten().OfType <Field>().First( f => f.Content.MatchOrDefault(matchLink: l => true)); var computeTreeChanges = computeTreeChangesFactory(container, RepositoryFixture.BenchmarkRepositoryDescription); var stopwatch = Stopwatch.StartNew(); // Act var modifiedField = sut.With(fieldToModify, f => f.Name, "modified"); computeTreeChanges.Compare(sut, modifiedField.Repository); // Assert // Child loading is lazy so root load time should be really short Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromMilliseconds(300))); }
public void ComputeChangesInLargeRepository(IObjectRepositoryLoader loader, Func <RepositoryDescription, IComputeTreeChanges> computeTreeChangesFactory) { // Arrange var sut = loader.LoadFrom <ObjectRepository>(RepositoryFixture.BenchmarkRepositoryDescription); var fieldToModify = sut .Applications.PickRandom() .Pages.PickRandom() .Fields.PickRandom(); var computeTreeChanges = computeTreeChangesFactory(RepositoryFixture.BenchmarkRepositoryDescription); var stopwatch = Stopwatch.StartNew(); // Act var modifiedField = fieldToModify.With(f => f.Name == "modified"); computeTreeChanges.Compare(sut, modifiedField.Repository); // Assert // Child loading is lazy so root load time should be really short Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromMilliseconds(300))); }
public void SearchInLargeRepositoryUsingLightDbBackend(IObjectRepositorySearch search, IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryLoader loader) { // Arrange var dbFile = Path.Combine(RepositoryFixture.BenchmarkRepositoryDescription.Path, "lite.db"); LiteDbBackend backend = default; var repositoryDescription = RepositoryFixture.BenchmarkRepositoryDescription .WithBackend(() => backend = new LiteDbBackend($"filename={dbFile}; journal=false")); var sut = loader.LoadFrom(container, repositoryDescription); sut.Execute(r => r.ObjectDatabase.CopyAllBlobs(backend)); var page = sut.Applications.PickRandom().Pages.PickRandom(); var stopwatch = Stopwatch.StartNew(); // Act var result = search.Grep(sut, page.Id.ToString()); stopwatch.Stop(); Console.WriteLine($"Grep total duration: {stopwatch.Elapsed}"); // Assert Assert.That(result, Is.Not.Empty); Assert.That(stopwatch.Elapsed, Is.LessThan(TimeSpan.FromSeconds(5))); }
public void MergeSamePropertyDetectsConflicts(IObjectRepositoryLoader loader, ObjectRepository sut, Page page, Signature signature, string message) { // master: A---C---D // \ / // newBranch: B---' // Arrange var repositoryDescription = RepositoryFixture.GetRepositoryDescription(); sut.SaveInNewRepository(signature, message, repositoryDescription); // A // Act sut.Branch("newBranch"); var updateName = page.With(p => p.Name == "modified name"); sut.Commit(updateName.Repository, signature, message); // B sut.Checkout("master"); var updateNameOther = page.With(p => p.Name == "yet again modified name"); sut.Commit(updateNameOther.Repository, signature, message); // C var loaded = loader.LoadFrom <ObjectRepository>(RepositoryFixture.GetRepositoryDescription()); Assert.Throws <RemainingConflictsException>(() => loaded.Merge("newBranch").Apply(signature)); }