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);
            }
        }
    }
Пример #3
0
    private void AddToUniqueName(GitRepositoryBuildStatus gitRepository, string name)
    {
        name += "_" + gitRepository.RepositoryName + "_" + gitRepository.BranchName;

        foreach (var dependingRepository in gitRepository.DependingRepositories)
        {
            AddToUniqueName(dependingRepository, name);
        }
    }
Пример #4
0
    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");
    }
Пример #6
0
    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);
    }
Пример #7
0
    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");
    }
Пример #10
0
    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");
    }
Пример #11
0
    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);
        }
    }
Пример #12
0
    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
                );
        }
    }
Пример #13
0
    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");
    }