public void PullRequiringMerge(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IObjectRepositoryContainerFactory containerFactory, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var tempPath        = RepositoryFixture.GetAvailableFolderPath();
            var clientContainer = containerFactory.Create <ObjectRepository>(tempPath);

            clientContainer.Clone(container.Repositories.Single().RepositoryDescription.Path);

            // Arrange - Update source repository
            var change = sut.With(sut.Applications[0].Pages[0], p => p.Description, "foo");

            sut = container.Commit(change.Repository, signature, message);

            // Arrange - Update client repository
            var clientChange = sut.With(sut.Applications[0].Pages[0], p => p.Name, "bar");

            clientContainer.Commit(clientChange.Repository, signature, message);

            // Act
            var pullResult = clientContainer.Pull(clientContainer.Repositories.Single().Id);

            pullResult.Apply(signature);

            // Assert
            Assert.That(pullResult.RequiresMergeCommit, Is.True);
            Assert.That(clientContainer.Repositories.Single().Applications[0].Pages[0].Description, Is.EqualTo("foo"));
        }
        public void LinkFieldSerialization(IServiceProvider serviceProvider, IObjectRepositoryContainer container, string name, string path)
        {
            // Arrange
            var sut       = CreateJsonRepositorySerializer(serviceProvider, new ModelObjectSerializationContext(container));
            var link      = new LazyLink <Page>(container, new ObjectPath(UniqueId.CreateNew(), path));
            var linkField = new Field.Builder(serviceProvider)
            {
                Id      = UniqueId.CreateNew(),
                Name    = name,
                Content = FieldContent.NewLink(new FieldLinkContent(link))
            }.ToImmutable();

            // Act
            var json = Serialize(sut, linkField);

            using (var stream = new MemoryStream(Encoding.Default.GetBytes(json)))
            {
                var deserialized         = (Field)sut.Deserialize(stream, _ => throw new NotSupportedException());
                var deserializedLazyLink = deserialized.Content.MatchOrDefault(matchLink: c => c.Target);

                // Assert
                Assert.That(deserialized.Id, Is.EqualTo(linkField.Id));
                Assert.That(deserialized.Name, Is.EqualTo(name));
                Assert.That(deserializedLazyLink.Path.Path, Is.EqualTo(path));
            }
        }
        public void MergeFileDeletionChange(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // master:    A---C---D
            //             \     /
            // newBranch:   B---'

            // Arrange
            var a = container.AddRepository(sut, signature, message); // A

            // Act
            a = container.Checkout(a.Id, "newBranch", createNewBranch: true);
            var page       = a.Applications[0].Pages[0];
            var updateName = a.With(c => c.Remove(page, p => p.Fields, page.Fields[1]));

            container.Commit(updateName, signature, message); // B
            a = container.Checkout(a.Id, "master");
            var updateDescription = a.With(a.Applications[0].Pages[0], p => p.Description, "modified description");
            var commitC           = container.Commit(updateDescription.Repository, signature, message); // C
            var mergeCommit       = container.Merge(sut.Id, "newBranch").Apply(signature);              // D

            // Assert
            var changes = computeTreeChangesFactory(container, container[sut.Id].RepositoryDescription)
                          .Compare(commitC.CommitId, mergeCommit)
                          .SkipIndexChanges();

            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 MergeFileAdditionChange(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, IServiceProvider serviceProvider, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // master:    A---C---D
            //             \     /
            // newBranch:   B---'

            // Arrange
            sut = container.AddRepository(sut, signature, message); // A

            // Act
            sut = container.Checkout(sut.Id, "newBranch", createNewBranch: true);
            var updateName = sut.With(c => c.Add(sut.Applications[0].Pages[0], p => p.Fields, new Field(serviceProvider, UniqueId.CreateNew(), "new field", FieldContent.Default)));

            container.Commit(updateName.Repository, signature, message); // B
            var a = container.Checkout(sut.Id, "master");
            var updateDescription = a.With(a.Applications[0].Pages[0], p => p.Description, "modified description");
            var commitC           = container.Commit(updateDescription.Repository, signature, message); // C
            var mergeCommit       = container.Merge(sut.Id, "newBranch").Apply(signature);              // D

            // Assert
            var changes = computeTreeChangesFactory(container, container[sut.Id].RepositoryDescription)
                          .Compare(commitC.CommitId, mergeCommit)
                          .SkipIndexChanges();

            Assert.That(changes, Has.Count.EqualTo(1));
            Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Added));
            Assert.That(changes[0].New.Name, Is.EqualTo("new field"));
        }
        public void MergeTwoDifferentPropertiesChanged(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // master:    A---C---D
            //             \     /
            // newBranch:   B---'

            // Arrange
            sut = container.AddRepository(sut, signature, message); // A

            // Act
            sut = container.Checkout(sut.Id, "newBranch", createNewBranch: true);
            var updateName = sut.With(sut.Applications[0].Pages[0], p => p.Name, "modified name");

            container.Commit(updateName.Repository, signature, message); // B
            var a = container.Checkout(sut.Id, "master");
            var updateDescription = a.With(a.Applications[0].Pages[0], p => p.Description, "modified description");
            var commitC           = container.Commit(updateDescription.Repository, signature, message); // C
            var mergeCommit       = container.Merge(sut.Id, "newBranch").Apply(signature);              // D

            // Assert
            var changes = computeTreeChangesFactory(container, container[sut.Id].RepositoryDescription)
                          .Compare(commitC.CommitId, mergeCommit)
                          .SkipIndexChanges();

            Assert.That(changes, Has.Count.EqualTo(1));
            Assert.That(changes[0].Status, Is.EqualTo(ChangeKind.Modified));
            Assert.That(changes[0].Old.Name, Is.EqualTo(sut.Applications[0].Pages[0].Name));
            Assert.That(changes[0].New.Name, Is.EqualTo(updateName.Name));
        }
Example #6
0
        public void ObjectDeletionIsAlsoDeletingBlobs(BlobRepository repository, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message)
        {
            // Arrange
            var a = container.AddRepository(repository, signature, message);

            // Act
            var b = container.Commit(
                repository.With(c => c.Remove(repository, r => r.Cars, repository.Cars[0])),
                signature,
                message);

            // Assert
            b.Execute(r =>
            {
                var changes = r.Diff.Compare <TreeChanges>(
                    r.Lookup <Commit>(a.CommitId).Tree,
                    r.Lookup <Commit>(b.CommitId).Tree);
                Assert.That(
                    changes.Deleted.Select(c => c.Path),
                    Is.EquivalentTo(new[]
                {
                    $"Cars/{a.Cars[0].Id}/blob{FileSystemStorage.BlobExtension}",
                    $"Cars/{a.Cars[0].Id}/{FileSystemStorage.DataFile}"
                }));
            });
        }
        public void MergeSamePropertyConflict(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message, ComputeTreeChangesFactory computeTreeChangesFactory)
        {
            // master:    A---C---D
            //             \     /
            // newBranch:   B---'

            // Arrange
            var a = container.AddRepository(sut, signature, message); // A

            // Act
            a = container.Checkout(sut.Id, "newBranch", createNewBranch: true);
            var updateName = a.With(a.Applications[0].Pages[0], p => p.Name, "modified name");

            container.Commit(updateName.Repository, signature, message); // B
            a = container.Checkout(sut.Id, "master");
            var updateNameOther = a.With(a.Applications[0].Pages[0], p => p.Name, "yet again modified name");
            var commitC         = container.Commit(updateNameOther.Repository, signature, message); // C
            var merge           = container.Merge(sut.Id, "newBranch");
            var chunk           = merge.ModifiedProperties.Single();

            chunk.Resolve("merged name");
            var mergeCommit = merge.Apply(signature); // D

            // Assert
            var changes = computeTreeChangesFactory(container, container[sut.Id].RepositoryDescription)
                          .Compare(commitC.CommitId, mergeCommit)
                          .SkipIndexChanges();

            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 CloneRepository(IObjectRepositoryContainer <ObjectRepository> container)
        {
            // Act
            var loaded = container.Clone(RepositoryFixture.SmallRepositoryPath);

            // Assert
            Assert.That(loaded.Applications, Has.Count.EqualTo(2));
        }
Example #9
0
 internal MigrationScaffolder(IObjectRepositoryContainer container, RepositoryDescription repositoryDescription,
                              IRepositoryProvider repositoryProvider, ObjectRepositorySerializerFactory repositorySerializerFactory)
 {
     _repositoryProvider          = repositoryProvider ?? throw new ArgumentNullException(nameof(repositoryProvider));
     _container                   = container ?? throw new ArgumentNullException(nameof(container));
     _repositoryDescription       = repositoryDescription ?? throw new ArgumentNullException(nameof(repositoryDescription));
     _repositorySerializerFactory = repositorySerializerFactory ?? throw new ArgumentNullException(nameof(repositorySerializerFactory));
 }
 private IEnumerable <IModelObject> LoadEntryChildren(IObjectRepositoryContainer container, ObjectId commitId, string childPath, Tree subTree) =>
 from c in subTree
     where c.TargetType == TreeEntryTargetType.Tree
 let childTree                       = (Tree)c.Target
                            let data = childTree[FileSystemStorage.DataFile]
                                           where data != null
                                       select LoadEntry(container, commitId, data, $"{childPath}/{c.Name}",
                                                        relativePath => (subTree[relativePath]?.Target as Blob)?.GetContentText() ?? string.Empty);
Example #11
0
        public void LazyLinkCloneCopiesObjectPath(IObjectRepositoryContainer <ObjectRepository> container, Page page)
        {
            // Act
            var sut = (LazyLink <Page>) new LazyLink <Page>(container, page).Clone();

            // Assert
            Assert.That(sut.IsLinkCreated, Is.False);
            Assert.That(sut.Path, Is.EqualTo(page.Path));
        }
Example #12
0
        public void CherryPickDetectsConflicts(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            var cherryPick = CreateConflictingCherryPick(sut, container, signature, message);

            // Assert
            Assert.That(cherryPick.Status, Is.EqualTo(CherryPickStatus.Conflicts));
            Assert.That(cherryPick.ModifiedProperties, Has.Count.EqualTo(1));
            Assert.That(cherryPick.ModifiedProperties, Has.Exactly(1).Matches <ObjectRepositoryPropertyChange>(c => c.IsInConflict));
        }
        public void RebaseDetectsConflicts(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            var rebase = CreateConflictingRebase(sut, container, signature, message);

            // Assert
            Assert.That(rebase.Status, Is.EqualTo(RebaseStatus.Conflicts));
            Assert.That(rebase.ModifiedProperties, Has.Count.EqualTo(3));
            Assert.That(rebase.ModifiedProperties, Has.Exactly(1).Matches <ObjectRepositoryPropertyChange>(c => c.IsInConflict));
        }
        public void CommitPageNameUpdate(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            sut = container.AddRepository(sut, signature, message);
            var modifiedPage  = sut.With(sut.Applications[0].Pages[0], p => p.Name, "modified");
            var updated       = container.Commit(modifiedPage.Repository, signature, message);
            var retrievedPage = updated.Flatten().OfType <Page>().FirstOrDefault(p => p.Name == "modified");

            // Assert
            Assert.That(retrievedPage.Name, Is.EqualTo("modified"));
        }
Example #15
0
        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)));
        }
Example #16
0
        public void BlobSerializedAsNestedFile(BlobRepository sut, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);

            // Assert
            sut.Execute(r =>
            {
                var blob = (Blob)r.Head[$"blob{FileSystemStorage.BlobExtension}"].Target;
                Assert.AreEqual(sut.Blob.Value, blob.GetContentText());
            });
        }
Example #17
0
        public void LazyLinkCloneDuplicatesFactoryWithoutInvokingIt(IObjectRepositoryContainer <ObjectRepository> container)
        {
            // Act
            var exception = new Exception();
            var sut       = (LazyLink <Page>) new LazyLink <Page>(container, () => throw exception).Clone();

            // Assert
            Assert.That(sut.IsLinkCreated, Is.False);
            var thrown = Assert.Throws <Exception>(() => sut.Link.ToString());

            Assert.That(thrown, Is.SameAs(exception));
        }
Example #18
0
        public void PushNewRemote(ObjectRepository sample, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            var(tempPath, repository) = PushNewRemoteImpl(sample, container, signature, message);

            // Assert
            using (var repo = new Repository(tempPath))
            {
                var lastCommit = repo.Branches["master"].Tip;
                Assert.That(lastCommit.Id, Is.EqualTo(repository.CommitId));
            }
        }
Example #19
0
        public void CherryPickConflictsCanResolvedAndContinued(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            var cherryPick = CreateConflictingCherryPick(sut, container, signature, message);

            cherryPick.ModifiedProperties.Single(c => c.IsInConflict).Resolve("resolved");
            cherryPick.Commit();

            // Assert
            Assert.That(cherryPick.Status, Is.EqualTo(CherryPickStatus.CherryPicked));
            Assert.That(container.Repositories.Single().Applications[0].Pages[0].Name, Is.EqualTo("resolved"));
        }
Example #20
0
        public ComputeTreeChanges(IObjectRepositoryContainer container, RepositoryDescription repositoryDescription,
                                  IModelDataAccessorProvider modelDataProvider, IObjectRepositoryLoader objectRepositoryLoader,
                                  IRepositoryProvider repositoryProvider, ILogger <ComputeTreeChanges> logger)
        {
            _container             = container ?? throw new ArgumentNullException(nameof(container));
            _repositoryDescription = repositoryDescription ?? throw new ArgumentNullException(nameof(repositoryDescription));

            _modelDataProvider      = modelDataProvider ?? throw new ArgumentNullException(nameof(modelDataProvider));
            _objectRepositoryLoader = objectRepositoryLoader ?? throw new ArgumentNullException(nameof(objectRepositoryLoader));
            _repositoryProvider     = repositoryProvider ?? throw new ArgumentNullException(nameof(repositoryProvider));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }
Example #21
0
        public void MergeBlobConflictsCanResolvedAndContinued(BlobRepository sut, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message)
        {
            // Act
            CreateConflictingChange(sut, container, signature, message);
            var merge = container.Merge(sut.Id, "master");

            merge.ModifiedProperties.Single(c => c.IsInConflict).Resolve(new StringBlob("y\nb\nd"));
            merge.Apply(signature);

            // Assert
            Assert.That(container.Repositories.Single().Blob, Is.EqualTo(new StringBlob("y\nb\nd")));
        }
        public void RebaseConflictsCanResolvedAndContinued(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Act
            var rebase = CreateConflictingRebase(sut, container, signature, message);

            rebase.ModifiedProperties.Single(c => c.IsInConflict).Resolve("resolved");
            rebase.Continue();

            // Assert
            Assert.That(rebase.Status, Is.EqualTo(RebaseStatus.Complete));
            Assert.That(rebase.TotalStepCount, Is.EqualTo(1));
            Assert.That(container.Repositories.Single().Applications[0].Pages[0].Name, Is.EqualTo("resolved"));
        }
        /// <inheritdoc/>
        public IList <IModelObject> Grep(IObjectRepositoryContainer container, string content, StringComparison comparison = StringComparison.OrdinalIgnoreCase)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }
            if (content == null)
            {
                throw new ArgumentNullException(nameof(content));
            }

            return(container.Repositories.SelectMany(r => Grep(r, content, comparison)).ToList());
        }
Example #24
0
        static void CreateConflictingChange(BlobRepository sut, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message)
        {
            // master:    A---B
            //             \    (B & C change same value)
            // newBranch:   C   ->   A---B---C
            var a          = container.AddRepository(sut, signature, message); // A
            var updateName = a.With(a, r => r.Blob, new StringBlob("x\nb\nc"));

            container.Commit(updateName.Repository, signature, message); // B
            container.Checkout(a.Id, "newBranch", createNewBranch: true, "HEAD~1");
            var updates = a.With(a, r => r.Blob, new StringBlob("z\nb\nd"));

            container.Commit(updates, signature, message);
        }
        public void ThrowIfMissingDependency(IObjectRepositoryContainer <ObjectRepository> container, ObjectRepository repository, Signature signature, string message)
        {
            // Arrange
            var wrongDependency = new RepositoryDependency(UniqueId.CreateNew(), "foo", new System.Version(1, 0));

            repository = repository.With(repository, r => r.Dependencies, repository.Dependencies.Add(wrongDependency));
            container.AddRepository(repository, signature, message);

            // Act
            var result = container.Validate();

            // Assert
            Assert.That(result.ToString(), Does.Contain("could not be found"));
        }
        /// <inheritdoc />
        public IObjectRepository LoadFrom(IObjectRepositoryContainer container, RepositoryDescription repositoryDescription, ObjectId commitId = null)
        {
            if (container == null)
            {
                throw new ArgumentNullException(nameof(container));
            }
            if (repositoryDescription == null)
            {
                throw new ArgumentNullException(nameof(repositoryDescription));
            }

            return(_repositoryProvider.Execute(repositoryDescription, repository =>
                                               LoadFrom(container, repositoryDescription, repository, commitId)));
        }
Example #27
0
        public void RebaseBlobConflictsCanResolvedAndContinued(BlobRepository sut, IObjectRepositoryContainer <BlobRepository> container, Signature signature, string message)
        {
            // Act
            CreateConflictingChange(sut, container, signature, message);
            var rebase = container.Rebase(sut.Id, "master");

            rebase.ModifiedProperties.Single(c => c.IsInConflict).Resolve(new StringBlob("y\nb\nd"));
            rebase.Continue();

            // Assert
            Assert.That(rebase.Status, Is.EqualTo(RebaseStatus.Complete));
            Assert.That(rebase.TotalStepCount, Is.EqualTo(1));
            Assert.That(container.Repositories.Single().Blob, Is.EqualTo(new StringBlob("y\nb\nd")));
        }
Example #28
0
        public void ResolveLinkReferers(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var linkField = sut.Flatten().OfType <Field>().First(
                f => f.Content.MatchOrDefault(matchLink: l => true));
            var target = linkField.Content.MatchOrDefault(matchLink: c => c.Target).Link;

            // Act
            var referrers = sut.GetReferrers(target);

            // Assert
            Assert.That(referrers, Does.Contain(linkField));
        }
 private ILazyChildren LoadEntryChildren(IObjectRepositoryContainer container, ObjectId commitId, string path, ChildPropertyInfo childProperty) =>
 LazyChildrenHelper.Create(childProperty, (parent, repository) =>
 {
     var childPath = string.IsNullOrEmpty(path) ? childProperty.FolderName : $"{path}/{childProperty.FolderName}";
     var commit    = repository.Lookup <Commit>(commitId);
     var entry     = commit[childPath];
     if (entry == null)
     {
         return(Enumerable.Empty <IModelObject>());
     }
     var subTree = (Tree)entry.Target;
     return(subTree.Any() ?
            LoadEntryChildren(container, commitId, childPath, subTree) :
            Enumerable.Empty <IModelObject>());
 });
Example #30
0
        public void ResolveLinkReferersUsingIndex(ObjectRepository sut, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message)
        {
            // Arrange
            sut = container.AddRepository(sut, signature, message);
            var linkField = sut.Flatten().OfType <Field>().First(
                f => f.Content.MatchOrDefault(matchLink: l => true));
            var target = linkField.Content.MatchOrDefault(matchLink: c => c.Target).Link;

            // Act
            var index     = sut.Indexes.Single(i => i is LinkFieldReferrerIndex);
            var referrers = index[target.Path.FullPath];

            // Assert
            Assert.That(referrers, Does.Contain(linkField));
        }