コード例 #1
0
        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);
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #5
0
        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);
        }
コード例 #8
0
        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");
        }
コード例 #9
0
        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");
        }