From 0598b8e45af9507fc9ba8abf304e78fc7d434e04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20=C3=87A=C4=9EDA=C5=9E?= Date: Mon, 7 Sep 2020 17:35:03 +0300 Subject: [PATCH] added more unit tests and GitRepositoryHelper implementation --- .../Cli/Build/DefaultBuildStatusGenerator.cs | 128 +++++++++++------- .../Cli/Build/DefaultChangedProjectFinder.cs | 29 ++-- .../Abp/Cli/Build/GitRepositoryExtensions.cs | 31 +++++ .../Abp/Cli/Build/IBuildStatusGenerator.cs | 2 +- .../Volo/Abp/Cli/Commands/BuildCommand.cs | 2 +- .../Cli/Build/BuildStatusGenerator_Tests.cs | 122 +++++++++++++++++ 6 files changed, 247 insertions(+), 67 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/GitRepositoryExtensions.cs create mode 100644 framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/Build/BuildStatusGenerator_Tests.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs index a1b90ff47e..d1ad0f0094 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using LibGit2Sharp; using Volo.Abp.DependencyInjection; @@ -7,37 +8,65 @@ namespace Volo.Abp.Cli.Build { public class DefaultBuildStatusGenerator : IBuildStatusGenerator, ITransientDependency { - public GitRepositoryBuildStatus Generate(GitRepository gitRepository, List changedProjects, + private readonly IGitRepositoryHelper _gitRepositoryHelper; + + public DefaultBuildStatusGenerator(IGitRepositoryHelper gitRepositoryHelper) + { + _gitRepositoryHelper = gitRepositoryHelper; + } + + public GitRepositoryBuildStatus Generate( + DotNetProjectBuildConfig buildConfig, + List changedProjects, List buildSucceededProjects) { - using (var repo = new Repository(string.Concat(gitRepository.RootPath, @"\.git"))) + var lastCommitId = _gitRepositoryHelper.GetLastCommitId(buildConfig.GitRepository); + var repoFriendlyName = _gitRepositoryHelper.GetFriendlyName(buildConfig.GitRepository); + + var status = new GitRepositoryBuildStatus( + buildConfig.GitRepository.Name, + repoFriendlyName + ); + + if (ShouldUpdateRepositoryCommitId(buildConfig, changedProjects, buildSucceededProjects)) { - var lastCommitId = repo.Head.Tip.Id.ToString(); - var status = new GitRepositoryBuildStatus( - gitRepository.Name, - repo.Head.FriendlyName + status.CommitId = lastCommitId; + } + + status.SucceedProjects = changedProjects.Where(p => + p.RepositoryName == buildConfig.GitRepository.Name && + buildSucceededProjects.Contains(p.CsProjPath) ) + .Select(e => new DotNetProjectBuildStatus() { + CsProjPath = e.CsProjPath, CommitId = lastCommitId - }; + }).ToList(); - status.SucceedProjects = changedProjects.Where(p => - p.RepositoryName == gitRepository.Name && - buildSucceededProjects.Contains(p.CsProjPath) - ) - .Select(e => new DotNetProjectBuildStatus() - { - CsProjPath = e.CsProjPath, - CommitId = lastCommitId - }).ToList(); + foreach (var dependingRepository in buildConfig.GitRepository.DependingRepositories) + { + GenerateBuildStatusInternal(dependingRepository, changedProjects, buildSucceededProjects, status); + } - foreach (var dependingRepository in gitRepository.DependingRepositories) - { - GenerateBuildStatusInternal(dependingRepository, changedProjects, buildSucceededProjects, status); - } + return status; + } - return status; + private bool ShouldUpdateRepositoryCommitId( + DotNetProjectBuildConfig buildConfig, + List changedProjects, + List buildSucceededProjects) + { + if (!buildConfig.SlFilePath.IsNullOrEmpty()) + { + return false; } + + if (changedProjects.Count == 0 || buildSucceededProjects.Count == 0) + { + return false; + } + + return changedProjects.Count == buildSucceededProjects.Count; } private void GenerateBuildStatusInternal( @@ -46,39 +75,38 @@ namespace Volo.Abp.Cli.Build List buildSucceededProjects, GitRepositoryBuildStatus status) { - using (var repo = new Repository(string.Concat(gitRepository.RootPath, @"\.git"))) + var lastCommitId = _gitRepositoryHelper.GetLastCommitId(gitRepository); + var repoFriendlyName = _gitRepositoryHelper.GetFriendlyName(gitRepository); + + var dependingRepositoryStatus = new GitRepositoryBuildStatus( + gitRepository.Name, + repoFriendlyName + ) { - var lastCommitId = repo.Head.Tip.Id.ToString(); - var dependingRepositoryStatus = new GitRepositoryBuildStatus( - gitRepository.Name, - repo.Head.FriendlyName + CommitId = lastCommitId + }; + + dependingRepositoryStatus.SucceedProjects = changedProjects.Where(p => + p.RepositoryName == gitRepository.Name && + buildSucceededProjects.Contains(p.CsProjPath) ) + .Select(e => new DotNetProjectBuildStatus() { + CsProjPath = e.CsProjPath, CommitId = lastCommitId - }; - - dependingRepositoryStatus.SucceedProjects = changedProjects.Where(p => - p.RepositoryName == gitRepository.Name && - buildSucceededProjects.Contains(p.CsProjPath) - ) - .Select(e => new DotNetProjectBuildStatus() - { - CsProjPath = e.CsProjPath, - CommitId = lastCommitId - }).ToList(); - - foreach (var dependingRepository in gitRepository.DependingRepositories) - { - GenerateBuildStatusInternal( - dependingRepository, - changedProjects, - buildSucceededProjects, - dependingRepositoryStatus - ); - } + }).ToList(); - status.DependingRepositories.Add(dependingRepositoryStatus); + foreach (var dependingRepository in gitRepository.DependingRepositories) + { + GenerateBuildStatusInternal( + dependingRepository, + changedProjects, + buildSucceededProjects, + dependingRepositoryStatus + ); } + + status.DependingRepositories.Add(dependingRepositoryStatus); } } -} \ No newline at end of file +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs index 759f0734ff..27b67ceca5 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs @@ -11,10 +11,14 @@ namespace Volo.Abp.Cli.Build public class DefaultChangedProjectFinder : IChangedProjectFinder, ITransientDependency { private readonly IRepositoryBuildStatusStore _repositoryBuildStatusStore; - - public DefaultChangedProjectFinder(IRepositoryBuildStatusStore repositoryBuildStatusStore) + private readonly IGitRepositoryHelper _gitRepositoryHelper; + + public DefaultChangedProjectFinder( + IRepositoryBuildStatusStore repositoryBuildStatusStore, + IGitRepositoryHelper gitRepositoryHelper) { _repositoryBuildStatusStore = repositoryBuildStatusStore; + _gitRepositoryHelper = gitRepositoryHelper; } public List Find(DotNetProjectBuildConfig buildConfig) @@ -23,7 +27,7 @@ namespace Volo.Abp.Cli.Build { return FindByRepository(buildConfig); } - + return FindBySlnFile(buildConfig.GitRepository, buildConfig.SlFilePath); } @@ -146,7 +150,7 @@ namespace Volo.Abp.Cli.Build } private void AddAllCsProjFiles( - GitRepository repository, + GitRepository repository, List changedFiles, GitRepositoryBuildStatus status) { @@ -165,12 +169,7 @@ namespace Volo.Abp.Cli.Build } // Filter already built files. - // TODO: create a class for repository extensions like getting last commitId - var lastCommitId = string.Empty; - using (var repo = new Repository(string.Concat(repository.RootPath, @"\.git"))) - { - lastCommitId = repo.Head.Tip.Id.ToString(); - } + var lastCommitId = _gitRepositoryHelper.GetLastCommitId(repository); foreach (var file in allCsProjFiles) { @@ -179,21 +178,21 @@ namespace Volo.Abp.Cli.Build changedFiles.Add( new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file)) ); - + continue; } - - if (status.GetSelfOrChild(repository.Name).SucceedProjects.Any(e=> e.CsProjPath == file)) + + if (status.GetSelfOrChild(repository.Name).SucceedProjects.Any(e => e.CsProjPath == file && e.CommitId == lastCommitId)) { continue; } - + changedFiles.Add( new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file)) ); } } - + private void AddChangedCsProjFiles( GitRepository repository, List changedFiles, diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/GitRepositoryExtensions.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/GitRepositoryExtensions.cs new file mode 100644 index 0000000000..937f3e3af5 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/GitRepositoryExtensions.cs @@ -0,0 +1,31 @@ +using LibGit2Sharp; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Cli.Build +{ + public class GitRepositoryHelper : IGitRepositoryHelper, ITransientDependency + { + public string GetLastCommitId(GitRepository repository) + { + using (var repo = new Repository(string.Concat(repository.RootPath, @"\.git"))) + { + return repo.Head.Tip.Id.ToString(); + } + } + + public string GetFriendlyName(GitRepository repository) + { + using (var repo = new Repository(string.Concat(repository.RootPath, @"\.git"))) + { + return repo.Head.FriendlyName; + } + } + } + + public interface IGitRepositoryHelper + { + string GetLastCommitId(GitRepository repository); + + string GetFriendlyName(GitRepository repository); + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs index bfd8d0a2ee..f9cf0b8254 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs @@ -5,7 +5,7 @@ namespace Volo.Abp.Cli.Build public interface IBuildStatusGenerator { GitRepositoryBuildStatus Generate( - GitRepository gitRepository, + DotNetProjectBuildConfig buildConfig, List changedProjects, List buildSucceededProjects ); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs index 1e1a24d77c..cc1b0d5ba9 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs @@ -75,7 +75,7 @@ namespace Volo.Abp.Cli.Commands ); var buildStatus = BuildStatusGenerator.Generate( - buildConfig.GitRepository, + buildConfig, changedProjectFiles, buildSucceededProjects ); diff --git a/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/Build/BuildStatusGenerator_Tests.cs b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/Build/BuildStatusGenerator_Tests.cs new file mode 100644 index 0000000000..15cf27afbf --- /dev/null +++ b/framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/Build/BuildStatusGenerator_Tests.cs @@ -0,0 +1,122 @@ +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; +using NSubstitute; +using Shouldly; +using Xunit; + +namespace Volo.Abp.Cli.Build +{ + public class BuildStatusGenerator_Tests : AbpCliTestBase + { + private readonly IBuildStatusGenerator _buildStatusGenerator; + private IGitRepositoryHelper _gitRepositoryHelper; + + public BuildStatusGenerator_Tests() + { + _buildStatusGenerator = GetRequiredService(); + } + + protected override void AfterAddApplication(IServiceCollection services) + { + _gitRepositoryHelper = Substitute.For(); + services.AddTransient(provider => _gitRepositoryHelper); + } + + [Fact] + public void Should_Set_Repository_CommitId_When_All_Projects_Built() + { + var buildConfig = new DotNetProjectBuildConfig + { + GitRepository = new GitRepository("volo", "dev", "") + { + DependingRepositories = new List() + { + new GitRepository("abp", "dev", "") + } + } + }; + + var changedProjects = new List() + { + new DotNetProjectInfo("volo", "project1.csproj") + }; + + var builtProjects = new List() + { + "project1.csproj" + }; + + var lastCommitId = "1"; + _gitRepositoryHelper.GetLastCommitId(buildConfig.GitRepository).Returns(lastCommitId); + _gitRepositoryHelper.GetFriendlyName(buildConfig.GitRepository).Returns("volo"); + + var status = _buildStatusGenerator.Generate(buildConfig, changedProjects, builtProjects); + status.CommitId.ShouldBe(lastCommitId); + } + + [Fact] + public void Should_Set_Repository_CommitId_When_All_Projects_Built_For_Child_Repository() + { + var buildConfig = new DotNetProjectBuildConfig + { + GitRepository = new GitRepository("volo", "dev", "") + { + DependingRepositories = new List() + { + new GitRepository("abp", "dev", "") + } + } + }; + + var changedProjects = new List() + { + new DotNetProjectInfo("abp", "project1.csproj") + }; + + var builtProjects = new List() + { + "project1.csproj" + }; + + var lastCommitId = "1"; + _gitRepositoryHelper.GetLastCommitId(buildConfig.GitRepository).Returns(lastCommitId); + _gitRepositoryHelper.GetFriendlyName(buildConfig.GitRepository).Returns("abp"); + + var status = _buildStatusGenerator.Generate(buildConfig, changedProjects, builtProjects); + status.CommitId.ShouldBe(lastCommitId); + } + + [Fact] + public void Should_Not_Set_Repository_CommitId_When_Building_Single_Solution() + { + var buildConfig = new DotNetProjectBuildConfig + { + GitRepository = new GitRepository("volo", "dev", "") + { + DependingRepositories = new List() + { + new GitRepository("abp", "dev", "") + } + }, + SlFilePath = "test.sln" + }; + + var changedProjects = new List() + { + new DotNetProjectInfo("volo", "project1.csproj") + }; + + var builtProjects = new List() + { + "project1.csproj" + }; + + var lastCommitId = "1"; + _gitRepositoryHelper.GetLastCommitId(buildConfig.GitRepository).Returns(lastCommitId); + _gitRepositoryHelper.GetFriendlyName(buildConfig.GitRepository).Returns("volo"); + + var status = _buildStatusGenerator.Generate(buildConfig, changedProjects, builtProjects); + status.CommitId.ShouldBeNull(); + } + } +}