Browse Source

added more unit tests and GitRepositoryHelper implementation

pull/5418/head
İsmail ÇAĞDAŞ 6 years ago
parent
commit
0598b8e45a
  1. 128
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultBuildStatusGenerator.cs
  2. 29
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/DefaultChangedProjectFinder.cs
  3. 31
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/GitRepositoryExtensions.cs
  4. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs
  5. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/BuildCommand.cs
  6. 122
      framework/test/Volo.Abp.Cli.Core.Tests/Volo/Abp/Cli/Build/BuildStatusGenerator_Tests.cs

128
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 System.Linq;
using LibGit2Sharp; using LibGit2Sharp;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
@ -7,37 +8,65 @@ namespace Volo.Abp.Cli.Build
{ {
public class DefaultBuildStatusGenerator : IBuildStatusGenerator, ITransientDependency public class DefaultBuildStatusGenerator : IBuildStatusGenerator, ITransientDependency
{ {
public GitRepositoryBuildStatus Generate(GitRepository gitRepository, List<DotNetProjectInfo> changedProjects, private readonly IGitRepositoryHelper _gitRepositoryHelper;
public DefaultBuildStatusGenerator(IGitRepositoryHelper gitRepositoryHelper)
{
_gitRepositoryHelper = gitRepositoryHelper;
}
public GitRepositoryBuildStatus Generate(
DotNetProjectBuildConfig buildConfig,
List<DotNetProjectInfo> changedProjects,
List<string> buildSucceededProjects) List<string> 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(); status.CommitId = lastCommitId;
var status = new GitRepositoryBuildStatus( }
gitRepository.Name,
repo.Head.FriendlyName status.SucceedProjects = changedProjects.Where(p =>
p.RepositoryName == buildConfig.GitRepository.Name &&
buildSucceededProjects.Contains(p.CsProjPath)
) )
.Select(e => new DotNetProjectBuildStatus()
{ {
CsProjPath = e.CsProjPath,
CommitId = lastCommitId CommitId = lastCommitId
}; }).ToList();
status.SucceedProjects = changedProjects.Where(p => foreach (var dependingRepository in buildConfig.GitRepository.DependingRepositories)
p.RepositoryName == gitRepository.Name && {
buildSucceededProjects.Contains(p.CsProjPath) GenerateBuildStatusInternal(dependingRepository, changedProjects, buildSucceededProjects, status);
) }
.Select(e => new DotNetProjectBuildStatus()
{
CsProjPath = e.CsProjPath,
CommitId = lastCommitId
}).ToList();
foreach (var dependingRepository in gitRepository.DependingRepositories) return status;
{ }
GenerateBuildStatusInternal(dependingRepository, changedProjects, buildSucceededProjects, status);
}
return status; private bool ShouldUpdateRepositoryCommitId(
DotNetProjectBuildConfig buildConfig,
List<DotNetProjectInfo> changedProjects,
List<string> buildSucceededProjects)
{
if (!buildConfig.SlFilePath.IsNullOrEmpty())
{
return false;
} }
if (changedProjects.Count == 0 || buildSucceededProjects.Count == 0)
{
return false;
}
return changedProjects.Count == buildSucceededProjects.Count;
} }
private void GenerateBuildStatusInternal( private void GenerateBuildStatusInternal(
@ -46,39 +75,38 @@ namespace Volo.Abp.Cli.Build
List<string> buildSucceededProjects, List<string> buildSucceededProjects,
GitRepositoryBuildStatus status) 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(); CommitId = lastCommitId
var dependingRepositoryStatus = new GitRepositoryBuildStatus( };
gitRepository.Name,
repo.Head.FriendlyName dependingRepositoryStatus.SucceedProjects = changedProjects.Where(p =>
p.RepositoryName == gitRepository.Name &&
buildSucceededProjects.Contains(p.CsProjPath)
) )
.Select(e => new DotNetProjectBuildStatus()
{ {
CsProjPath = e.CsProjPath,
CommitId = lastCommitId CommitId = lastCommitId
}; }).ToList();
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
);
}
status.DependingRepositories.Add(dependingRepositoryStatus); foreach (var dependingRepository in gitRepository.DependingRepositories)
{
GenerateBuildStatusInternal(
dependingRepository,
changedProjects,
buildSucceededProjects,
dependingRepositoryStatus
);
} }
status.DependingRepositories.Add(dependingRepositoryStatus);
} }
} }
} }

29
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 public class DefaultChangedProjectFinder : IChangedProjectFinder, ITransientDependency
{ {
private readonly IRepositoryBuildStatusStore _repositoryBuildStatusStore; private readonly IRepositoryBuildStatusStore _repositoryBuildStatusStore;
private readonly IGitRepositoryHelper _gitRepositoryHelper;
public DefaultChangedProjectFinder(IRepositoryBuildStatusStore repositoryBuildStatusStore)
public DefaultChangedProjectFinder(
IRepositoryBuildStatusStore repositoryBuildStatusStore,
IGitRepositoryHelper gitRepositoryHelper)
{ {
_repositoryBuildStatusStore = repositoryBuildStatusStore; _repositoryBuildStatusStore = repositoryBuildStatusStore;
_gitRepositoryHelper = gitRepositoryHelper;
} }
public List<DotNetProjectInfo> Find(DotNetProjectBuildConfig buildConfig) public List<DotNetProjectInfo> Find(DotNetProjectBuildConfig buildConfig)
@ -23,7 +27,7 @@ namespace Volo.Abp.Cli.Build
{ {
return FindByRepository(buildConfig); return FindByRepository(buildConfig);
} }
return FindBySlnFile(buildConfig.GitRepository, buildConfig.SlFilePath); return FindBySlnFile(buildConfig.GitRepository, buildConfig.SlFilePath);
} }
@ -146,7 +150,7 @@ namespace Volo.Abp.Cli.Build
} }
private void AddAllCsProjFiles( private void AddAllCsProjFiles(
GitRepository repository, GitRepository repository,
List<DotNetProjectInfo> changedFiles, List<DotNetProjectInfo> changedFiles,
GitRepositoryBuildStatus status) GitRepositoryBuildStatus status)
{ {
@ -165,12 +169,7 @@ namespace Volo.Abp.Cli.Build
} }
// Filter already built files. // Filter already built files.
// TODO: create a class for repository extensions like getting last commitId var lastCommitId = _gitRepositoryHelper.GetLastCommitId(repository);
var lastCommitId = string.Empty;
using (var repo = new Repository(string.Concat(repository.RootPath, @"\.git")))
{
lastCommitId = repo.Head.Tip.Id.ToString();
}
foreach (var file in allCsProjFiles) foreach (var file in allCsProjFiles)
{ {
@ -179,21 +178,21 @@ namespace Volo.Abp.Cli.Build
changedFiles.Add( changedFiles.Add(
new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file)) new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file))
); );
continue; 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; continue;
} }
changedFiles.Add( changedFiles.Add(
new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file)) new DotNetProjectInfo(repository.Name, Path.Combine(repository.RootPath, file))
); );
} }
} }
private void AddChangedCsProjFiles( private void AddChangedCsProjFiles(
GitRepository repository, GitRepository repository,
List<DotNetProjectInfo> changedFiles, List<DotNetProjectInfo> changedFiles,

31
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);
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Build/IBuildStatusGenerator.cs

@ -5,7 +5,7 @@ namespace Volo.Abp.Cli.Build
public interface IBuildStatusGenerator public interface IBuildStatusGenerator
{ {
GitRepositoryBuildStatus Generate( GitRepositoryBuildStatus Generate(
GitRepository gitRepository, DotNetProjectBuildConfig buildConfig,
List<DotNetProjectInfo> changedProjects, List<DotNetProjectInfo> changedProjects,
List<string> buildSucceededProjects List<string> buildSucceededProjects
); );

2
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( var buildStatus = BuildStatusGenerator.Generate(
buildConfig.GitRepository, buildConfig,
changedProjectFiles, changedProjectFiles,
buildSucceededProjects buildSucceededProjects
); );

122
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<IBuildStatusGenerator>();
}
protected override void AfterAddApplication(IServiceCollection services)
{
_gitRepositoryHelper = Substitute.For<IGitRepositoryHelper>();
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<GitRepository>()
{
new GitRepository("abp", "dev", "")
}
}
};
var changedProjects = new List<DotNetProjectInfo>()
{
new DotNetProjectInfo("volo", "project1.csproj")
};
var builtProjects = new List<string>()
{
"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<GitRepository>()
{
new GitRepository("abp", "dev", "")
}
}
};
var changedProjects = new List<DotNetProjectInfo>()
{
new DotNetProjectInfo("abp", "project1.csproj")
};
var builtProjects = new List<string>()
{
"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<GitRepository>()
{
new GitRepository("abp", "dev", "")
}
},
SlFilePath = "test.sln"
};
var changedProjects = new List<DotNetProjectInfo>()
{
new DotNetProjectInfo("volo", "project1.csproj")
};
var builtProjects = new List<string>()
{
"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();
}
}
}
Loading…
Cancel
Save