public void Add_New_Build_Status_Test() { var existingBuildStatus = new GitRepositoryBuildStatus("volo", "dev") { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "project1.csproj", CommitId = "1" } } }; var newBuildStatus = new GitRepositoryBuildStatus( existingBuildStatus.RepositoryName, existingBuildStatus.BranchName ) { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "project2.csproj", CommitId = "2" } } }; existingBuildStatus.MergeWith(newBuildStatus); existingBuildStatus.SucceedProjects.Count.ShouldBe(2); }
public void Set(string buildNamePrefix, GitRepository repository, GitRepositoryBuildStatus status) { var existingRepositoryStatus = Get(buildNamePrefix, repository); var buildStatusFile = Path.Combine( CliPaths.Build, status.GetUniqueName(buildNamePrefix) ) + ".json"; if (File.Exists(buildStatusFile)) { FileHelper.DeleteIfExists(buildStatusFile); } if (existingRepositoryStatus != null) { existingRepositoryStatus.MergeWith(status); using (var file = File.CreateText(buildStatusFile)) { new JsonSerializer { Formatting = Formatting.Indented }.Serialize(file, existingRepositoryStatus); } } else { using (var file = File.CreateText(buildStatusFile)) { new JsonSerializer { Formatting = Formatting.Indented }.Serialize(file, status); } } }
private void AddToUniqueName(GitRepositoryBuildStatus gitRepository, string name) { name += "_" + gitRepository.RepositoryName + "_" + gitRepository.BranchName; foreach (var dependingRepository in gitRepository.DependingRepositories) { AddToUniqueName(dependingRepository, name); } }
private void MarkChangedProjectsForBuild( GitRepository repository, GitRepositoryBuildStatus status, List <DotNetProjectInfo> allProjectList) { using (var repo = new Repository(string.Concat(repository.RootPath, @"\.git"))) { var firstCommit = status.CommitId.IsNullOrEmpty() ? null : repo.Lookup <Commit>(status.CommitId); var repoDifferences = repo.Diff.Compare <Patch>(firstCommit?.Tree, repo.Head.Tip.Tree); var fileExtensionPredicate = PredicateBuilder.New <PatchEntryChanges>(true); foreach (var changeDetectionFileExtension in _changeDetectionFileExtensions) { fileExtensionPredicate = fileExtensionPredicate.Or( e => e.Path.EndsWith(changeDetectionFileExtension) ); } var files = repoDifferences .Where(fileExtensionPredicate) .Where(e => e.Status != ChangeKind.Deleted) .Select(e => e) .ToList(); var affectedCsProjFiles = FindAffectedCsProjFiles(repository.RootPath, files); var lastCommitId = _gitRepositoryHelper.GetLastCommitId(repository); foreach (var file in affectedCsProjFiles) { var csProjPath = Path.Combine(repository.RootPath, file); if (status.SucceedProjects.Any(p => p.CsProjPath == csProjPath && p.CommitId == lastCommitId)) { continue; } // Filter ignored directories var isIgnored = repository.IgnoredDirectories.Any(ignoredDirectory => csProjPath.StartsWith(Path.Combine(repository.RootPath, ignoredDirectory))); if (isIgnored) { continue; } allProjectList.MarkForBuild(repository.Name, csProjPath); AddDependingProjectsToList(repository.Name, csProjPath, allProjectList); } } }
public void Should_Update_Repository_CommitId_When_New_CommitId_Is_Not_Empty() { var existingBuildStatus = new GitRepositoryBuildStatus("volo", "dev"); var newBuildStatus = new GitRepositoryBuildStatus( existingBuildStatus.RepositoryName, existingBuildStatus.BranchName ) { CommitId = "42" }; existingBuildStatus.MergeWith(newBuildStatus); existingBuildStatus.CommitId.ShouldBe("42"); }
private void GenerateBuildStatusInternal( DotNetProjectBuildConfig buildConfig, GitRepository gitRepository, List <DotNetProjectInfo> changedProjects, List <string> buildSucceededProjects, GitRepositoryBuildStatus status) { var lastCommitId = _gitRepositoryHelper.GetLastCommitId(gitRepository); var repoFriendlyName = _gitRepositoryHelper.GetFriendlyName(gitRepository); var dependingRepositoryStatus = new GitRepositoryBuildStatus( gitRepository.Name, repoFriendlyName ); if (ShouldUpdateRepositoryCommitId(buildConfig, changedProjects, buildSucceededProjects)) { dependingRepositoryStatus.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( buildConfig, dependingRepository, changedProjects, buildSucceededProjects, dependingRepositoryStatus ); } status.DependingRepositories.Add(dependingRepositoryStatus); }
private GitRepositoryBuildStatus GetChildInternal(GitRepositoryBuildStatus repositoryBuildStatus, string repositoryName) { if (repositoryBuildStatus.RepositoryName == repositoryName) { return(repositoryBuildStatus); } foreach (var dependingRepository in repositoryBuildStatus.DependingRepositories) { var child = GetChildInternal(dependingRepository, repositoryName); if (child != null) { return(child); } } return(null); }
public void GetUniqueName_Test() { var existingBuildStatus = new GitRepositoryBuildStatus("repo-1", "dev") { DependingRepositories = new List <GitRepositoryBuildStatus>() { new GitRepositoryBuildStatus("repo-2", "dev") { DependingRepositories = new List <GitRepositoryBuildStatus>() { new GitRepositoryBuildStatus("repo-3", "dev") } }, new GitRepositoryBuildStatus("repo-4", "dev") } }; existingBuildStatus.GetUniqueName("").ShouldBe("B25C935F97D7B3375530A96B392B7644"); existingBuildStatus.GetUniqueName("production").ShouldBe("production_B25C935F97D7B3375530A96B392B7644"); }
public void GetChild_Test() { var existingBuildStatus = new GitRepositoryBuildStatus("repo-1", "dev") { DependingRepositories = new List <GitRepositoryBuildStatus>() { new GitRepositoryBuildStatus("repo-2", "dev") { DependingRepositories = new List <GitRepositoryBuildStatus>() { new GitRepositoryBuildStatus("repo-3", "dev") } }, new GitRepositoryBuildStatus("repo-4", "dev") } }; existingBuildStatus.GetChild("repo-3").RepositoryName.ShouldBe("repo-3"); existingBuildStatus.GetChild("repo-4").RepositoryName.ShouldBe("repo-4"); }
public void Update_Existing_Build_Status_Test() { var existingBuildStatus = new GitRepositoryBuildStatus("volo", "dev") { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "project1.csproj", CommitId = "1" } } }; var newBuildStatus = new GitRepositoryBuildStatus( existingBuildStatus.RepositoryName, existingBuildStatus.BranchName ) { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "project1.csproj", CommitId = "2" }, new DotNetProjectBuildStatus { CsProjPath = "project2.csproj", CommitId = "2" } } }; existingBuildStatus.MergeWith(newBuildStatus); existingBuildStatus.SucceedProjects.Count.ShouldBe(2); existingBuildStatus.GetSelfOrChild("volo").SucceedProjects.First(p => p.CsProjPath == "project1.csproj") .CommitId.ShouldBe("2"); existingBuildStatus.GetSelfOrChild("volo").SucceedProjects.First(p => p.CsProjPath == "project2.csproj") .CommitId.ShouldBe("2"); }
public void MergeWith(GitRepositoryBuildStatus newBuildStatus) { if (!newBuildStatus.CommitId.IsNullOrEmpty()) { CommitId = newBuildStatus.CommitId; } foreach (var succeedProject in newBuildStatus.SucceedProjects) { AddOrUpdateProjectStatus(succeedProject); } foreach (var dependingRepositoryBuildStatus in newBuildStatus.DependingRepositories) { var existingDependingRepositoryBuildStatus = GetChild(dependingRepositoryBuildStatus.RepositoryName); var newDependingRepositoryBuildStatus = newBuildStatus.GetChild( dependingRepositoryBuildStatus.RepositoryName ); existingDependingRepositoryBuildStatus.MergeWith(newDependingRepositoryBuildStatus); } }
private void MarkProjectsForBuild( GitRepository repository, GitRepositoryBuildStatus repositoryBuildStatus, bool forceBuild, List <DotNetProjectInfo> allProjectList) { if (forceBuild || repositoryBuildStatus == null || repositoryBuildStatus.CommitId.IsNullOrEmpty()) { // Mark all projects for build allProjectList.ForEach(e => e.ShouldBuild = true); } else { MarkChangedProjectsForBuild( repository, repositoryBuildStatus, allProjectList ); } if (!repository.DependingRepositories.Any()) { return; } foreach (var dependingRepository in repository.DependingRepositories) { var dependingRepositoryBuildStatus = repositoryBuildStatus?.GetChild(dependingRepository.Name); MarkProjectsForBuild( dependingRepository, dependingRepositoryBuildStatus, forceBuild, allProjectList ); } }
public void AddOrUpdateProjectStatus_Test() { var existingBuildStatus = new GitRepositoryBuildStatus("repo-1", "dev") { DependingRepositories = new List <GitRepositoryBuildStatus>() { new GitRepositoryBuildStatus("repo-2", "dev") { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "A.csproj", CommitId = "42" } }, DependingRepositories = new List <GitRepositoryBuildStatus> { new GitRepositoryBuildStatus("repo-3", "dev") { SucceedProjects = new List <DotNetProjectBuildStatus> { new DotNetProjectBuildStatus { CsProjPath = "B.csproj", CommitId = "42" } } } } }, new GitRepositoryBuildStatus("repo-4", "dev") { SucceedProjects = new List <DotNetProjectBuildStatus>() { new DotNetProjectBuildStatus { CsProjPath = "C.csproj", CommitId = "42" } } } } }; var repo2 = existingBuildStatus.GetChild("repo-2"); repo2.AddOrUpdateProjectStatus(new DotNetProjectBuildStatus { CommitId = "21", CsProjPath = "A.csproj" }); var repo3 = existingBuildStatus.GetChild("repo-3"); repo3.AddOrUpdateProjectStatus(new DotNetProjectBuildStatus { CommitId = "21", CsProjPath = "X.csproj" }); repo2.SucceedProjects.Count.ShouldBe(1); repo2.SucceedProjects.ShouldContain(e => e.CsProjPath == "A.csproj" && e.CommitId == "21"); repo3.SucceedProjects.Count.ShouldBe(2); repo3.SucceedProjects.ShouldContain(e => e.CsProjPath == "X.csproj" && e.CommitId == "21"); }