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 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<DotNetProjectInfo> changedProjects,
private readonly IGitRepositoryHelper _gitRepositoryHelper;
public DefaultBuildStatusGenerator(IGitRepositoryHelper gitRepositoryHelper)
{
_gitRepositoryHelper = gitRepositoryHelper;
}
public GitRepositoryBuildStatus Generate(
DotNetProjectBuildConfig buildConfig,
List<DotNetProjectInfo> changedProjects,
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();
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<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(
@ -46,39 +75,38 @@ namespace Volo.Abp.Cli.Build
List<string> 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);
}
}
}
}

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
{
private readonly IRepositoryBuildStatusStore _repositoryBuildStatusStore;
public DefaultChangedProjectFinder(IRepositoryBuildStatusStore repositoryBuildStatusStore)
private readonly IGitRepositoryHelper _gitRepositoryHelper;
public DefaultChangedProjectFinder(
IRepositoryBuildStatusStore repositoryBuildStatusStore,
IGitRepositoryHelper gitRepositoryHelper)
{
_repositoryBuildStatusStore = repositoryBuildStatusStore;
_gitRepositoryHelper = gitRepositoryHelper;
}
public List<DotNetProjectInfo> 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<DotNetProjectInfo> 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<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
{
GitRepositoryBuildStatus Generate(
GitRepository gitRepository,
DotNetProjectBuildConfig buildConfig,
List<DotNetProjectInfo> changedProjects,
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(
buildConfig.GitRepository,
buildConfig,
changedProjectFiles,
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