public void PreMergeGetsFiredWhenPulling(GitHooks sut, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> origin, IObjectRepositoryContainerFactory containerFactory, Signature signature, string message) { // Arrange - Create origin and local repositories repository = origin.AddRepository(repository, signature, message); var tempPath = RepositoryFixture.GetAvailableFolderPath(); var clientContainer = containerFactory.Create <ObjectRepository>(tempPath); clientContainer.Clone(origin.Repositories.Single().RepositoryDescription.Path); // Arrange - Commit change on origin var change = repository.With(repository.Applications[0].Pages[0], p => p.Description, "foo"); origin.Commit(change.Repository, signature, message); // Arrange - suscribe to hook MergeStartedEventArgs lastEvent = null; sut.MergeStarted += (_, args) => lastEvent = args; // Act - Pull commit from origin var pullResult = clientContainer.Pull(clientContainer.Repositories.Single().Id); var result = pullResult.Apply(signature); // Assert Assert.That(lastEvent, Is.Not.Null); Assert.That(result, Is.Not.Null); }
internal MergeProcessor(ObjectRepositoryMerge objectRepositoryMerge, ComputeTreeChangesFactory computeTreeChangesFactory, GitHooks hooks) { _merge = objectRepositoryMerge ?? throw new ArgumentNullException(nameof(objectRepositoryMerge)); _computeTreeChangesFactory = computeTreeChangesFactory ?? throw new ArgumentNullException(nameof(computeTreeChangesFactory)); _hooks = hooks ?? throw new ArgumentNullException(nameof(hooks)); }
public void PreCommitCancelsCommitIfRequested(GitHooks sut, ObjectRepository instance, Signature signature, string message, InMemoryBackend inMemoryBackend) { // Arrange sut.CommitStarted += (_, args) => args.Cancel = true; // Act var commit = instance.SaveInNewRepository(signature, message, RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); // Assert Assert.That(commit, Is.Null); }
public void PreCommitCancelsCommitIfRequested(GitHooks sut, ObjectRepository instance, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message) { // Arrange sut.CommitStarted += (_, args) => args.Cancel = true; // Act var update = container.AddRepository(instance, signature, message); // Assert Assert.That(update, Is.Null); }
public void PostCommitWhenPropertyChangeGetsFired(GitHooks sut, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message) { // Arrange CommitCompletedEventArgs lastEvent = null; sut.CommitCompleted += (_, args) => lastEvent = args; // Act repository = container.AddRepository(repository, signature, message); var modifiedPage = repository.With(repository.Applications[0].Pages[0], p => p.Name, "modified"); var commit = container.Commit(modifiedPage.Repository, signature, message); // Assert Assert.That(lastEvent, Is.Not.Null); Assert.That(lastEvent.CommitId, Is.EqualTo(commit.CommitId)); }
public void PostCommitWhenPropertyChangeGetsFired(GitHooks sut, ObjectRepository instance, Page page, Signature signature, string message, InMemoryBackend inMemoryBackend) { // Arrange CommitCompletedEventArgs lastEvent = null; sut.CommitCompleted += (_, args) => lastEvent = args; // Act instance.SaveInNewRepository(signature, message, RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); var modifiedPage = page.With(p => p.Name == "modified"); var commit = instance.Commit(modifiedPage.Repository, signature, message); // Assert Assert.That(lastEvent, Is.Not.Null); Assert.That(lastEvent.CommitId, Is.EqualTo(commit)); }
public void PreCommitWhenPropertyChangeGetsFired(GitHooks sut, ObjectRepository instance, Page page, LinkField field, Page newLinkedPage, Signature signature, string message, InMemoryBackend inMemoryBackend) { // Arrange CommitStartedEventArgs lastEvent = null; sut.CommitStarted += (_, args) => lastEvent = args; // Act instance.SaveInNewRepository(signature, message, RepositoryFixture.GetRepositoryDescription(inMemoryBackend)); var composer = new PredicateComposer() .And(field, f => f.Name == "modified field name" && f.PageLink == new LazyLink <Page>(newLinkedPage)) .And(page, p => p.Name == "modified page name"); var modified = field.With(composer); instance.Commit(modified.Repository, signature, message); // Assert Assert.That(lastEvent, Is.Not.Null); Assert.That(lastEvent.Changes, Has.Count.EqualTo(2)); }
public void PreCommitWhenPropertyChangeGetsFired(GitHooks sut, ObjectRepository repository, IObjectRepositoryContainer <ObjectRepository> container, Signature signature, string message) { // Arrange repository = container.AddRepository(repository, signature, message); CommitStartedEventArgs lastEvent = null; sut.CommitStarted += (_, args) => lastEvent = args; var field = repository.Flatten().OfType <Field>().First( f => f.Content.MatchOrDefault(matchLink: l => true)); // Act var page = repository.Applications[0].Pages[1]; var newLinkedPage = repository.Applications[1].Pages[2]; var modified = repository.With(c => c .Update(field, f => f.Name, "modified field name") .Update(field, f => f.Content, FieldContent.NewLink(new FieldLinkContent(new LazyLink <Page>(container, newLinkedPage)))) .Update(page, p => p.Name, "modified page name")); container.Commit(modified.Repository, signature, message); // Assert Assert.That(lastEvent, Is.Not.Null); Assert.That(lastEvent.Changes, Has.Count.EqualTo(2)); }
/// <summary> /// Initializes a new instance of the <see cref="MetadataTreeMergeProcessor"/> class. /// </summary> /// <param name="serviceProvider">The service provider.</param> /// <param name="repositoryDescription">The repository description.</param> /// <param name="metadataTreeMerge">The metadata tree merge.</param> /// <exception cref="ArgumentNullException"> /// serviceProvider /// or /// repositoryDescription /// </exception> internal MetadataTreeMergeProcessor(IServiceProvider serviceProvider, RepositoryDescription repositoryDescription, MetadataTreeMerge metadataTreeMerge) { if (serviceProvider == null) { throw new ArgumentNullException(nameof(serviceProvider)); } _repositoryDescription = repositoryDescription ?? throw new ArgumentNullException(nameof(repositoryDescription)); _metadataTreeMerge = metadataTreeMerge ?? throw new ArgumentNullException(nameof(metadataTreeMerge)); _repositoryProvider = serviceProvider.GetRequiredService <IRepositoryProvider>(); _computeTreeChangesFactory = serviceProvider.GetRequiredService <Func <RepositoryDescription, IComputeTreeChanges> >(); _serializer = new Lazy <JsonSerializer>(() => serviceProvider.GetRequiredService <IObjectRepositoryLoader>().GetJsonSerializer()); _hooks = serviceProvider.GetRequiredService <GitHooks>(); _changes = _metadataTreeMerge.ModifiedChunks.ToLookup(c => c.Path, StringComparer.OrdinalIgnoreCase); Guid tempGuid; _forceVisit = new HashSet <Guid>(from path in _metadataTreeMerge.AllImpactedPaths from part in path.Split('/') where Guid.TryParse(part, out tempGuid) let guid = tempGuid select guid); }
/// <summary> /// Initializes a new instance of the <see cref="ObjectRepositoryContainer{TRepository}"/> class. /// </summary> /// <param name="path">The path.</param> /// <param name="repositoryLoader">The repository loader.</param> /// <param name="computeTreeChangesFactory">The <see cref="IComputeTreeChanges"/> factory.</param> /// <param name="objectRepositoryMergeFactory">The <see cref="IObjectRepositoryMerge"/> factory.</param> /// <param name="objectRepositoryRebaseFactory">The <see cref="IObjectRepositoryRebase"/> factory.</param> /// <param name="objectRepositoryCherryPickFactory">The <see cref="IObjectRepositoryCherryPick"/> factory.</param> /// <param name="repositoryProvider">The repository provider.</param> /// <param name="hooks">The hooks.</param> /// <param name="serializerFactory">The <see cref="IObjectRepositorySerializer"/> factory.</param> /// <param name="logger">The logger.</param> public ObjectRepositoryContainer(string path, IObjectRepositoryLoader repositoryLoader, ComputeTreeChangesFactory computeTreeChangesFactory, ObjectRepositoryMergeFactory objectRepositoryMergeFactory, ObjectRepositoryRebaseFactory objectRepositoryRebaseFactory, ObjectRepositoryCherryPickFactory objectRepositoryCherryPickFactory, IRepositoryProvider repositoryProvider, GitHooks hooks, ObjectRepositorySerializerFactory serializerFactory, ILogger <ObjectRepositoryContainer> logger) { _repositoryLoader = repositoryLoader ?? throw new ArgumentNullException(nameof(repositoryLoader)); _computeTreeChangesFactory = computeTreeChangesFactory ?? throw new ArgumentNullException(nameof(computeTreeChangesFactory)); _objectRepositoryMergeFactory = objectRepositoryMergeFactory ?? throw new ArgumentNullException(nameof(objectRepositoryMergeFactory)); _objectRepositoryRebaseFactory = objectRepositoryRebaseFactory ?? throw new ArgumentNullException(nameof(objectRepositoryRebaseFactory)); _objectRepositoryCherryPickFactory = objectRepositoryCherryPickFactory ?? throw new ArgumentNullException(nameof(objectRepositoryCherryPickFactory)); _repositoryProvider = repositoryProvider ?? throw new ArgumentNullException(nameof(repositoryProvider)); _hooks = hooks ?? throw new ArgumentNullException(nameof(hooks)); _serializerFactory = serializerFactory ?? throw new ArgumentNullException(nameof(serializerFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); Path = path ?? throw new ArgumentNullException(nameof(path)); Directory.CreateDirectory(path); Repositories = LoadRepositories(); _logger.ContainerCreated(path); }
internal static Commit CommitChanges(this IRepository repository, ObjectRepositoryChangeCollection changes, IObjectRepositorySerializer serializer, string message, Signature author, Signature committer, GitHooks hooks, CommitOptions options = null, Commit mergeParent = null) { TreeDefinition definition; Commit startCommit; if (changes.OldRepository?.CommitId != null) { if (repository.Head.Tip.Id != changes.OldRepository.CommitId) { throw new GitObjectDbException("Changes are not based on the HEAD commit."); } startCommit = repository.Lookup <Commit>(changes.OldRepository.CommitId); definition = TreeDefinition.From(startCommit); } else if (repository.Info.IsHeadUnborn) { startCommit = null; definition = new TreeDefinition(); } else { throw new GitObjectDbException("Changes are not based on the HEAD commit."); } if (!hooks.OnCommitStarted(changes, message)) { return(null); } repository.UpdateTreeDefinition(changes, definition, serializer, startCommit); var result = Commit(repository, definition, message, author, committer, options, mergeParent); hooks.OnCommitCompleted(changes, message, result.Id); return(result); }
/// <summary> /// Inserts a <see cref="LibGit2Sharp.Commit" /> into the object database by applying a <see cref="TreeDefinition"/>. /// </summary> /// <param name="repository">The repository.</param> /// <param name="changes">The changes.</param> /// <param name="message">The message.</param> /// <param name="author">The author.</param> /// <param name="committer">The committer.</param> /// <param name="hooks">The hooks.</param> /// <param name="options">The options.</param> /// <param name="mergeParent">The parent commit for a merge.</param> /// <returns>The created <see cref="LibGit2Sharp.Commit" />.</returns> internal static Commit CommitChanges(this IRepository repository, MetadataTreeChanges changes, string message, Signature author, Signature committer, GitHooks hooks, CommitOptions options = null, Commit mergeParent = null) { TreeDefinition definition; if (changes.OldRepository?.CommitId != null) { if (repository.Head.Tip.Id != changes.OldRepository.CommitId) { throw new NotSupportedException("Changes are not based on the HEAD commit."); } var startCommit = repository.Lookup <Commit>(changes.OldRepository.CommitId); definition = TreeDefinition.From(startCommit); } else if (repository.Info.IsHeadUnborn) { definition = new TreeDefinition(); } else { throw new NotSupportedException("Changes are not based on the HEAD commit."); } if (!hooks.OnCommitStarted(changes, message)) { return(null); } changes.UpdateTreeDefinition(repository, definition); var result = Commit(repository, definition, message, author, committer, options, mergeParent); hooks.OnCommitCompleted(changes, message, result.Id); return(result); }