aspnetcore/tools/TCDependencyManager/Program.cs

81 lines
2.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Net;
namespace TCDependencyManager
{
class Program
{
private static readonly string[] _excludedRepos = new[] { "xunit", "kruntime", "coreclr", "universe", "rolsyn" };
static int Main(string[] args)
{
var teamCityUrl = GetEnv("TEAMCITY_SERVERURL");
var teamCityUser = GetEnv("TEAMCITY_USER");
var teamCityPass = GetEnv("TEAMCITY_PASSWORD");
var githubCreds = GetEnv("GITHUB_CREDS");
var teamCity = new TeamCityAPI(teamCityUrl,
new NetworkCredential(teamCityUser, teamCityPass));
var gitHub = new GitHubAPI(githubCreds);
Console.WriteLine("Listing GitHub repos");
var repos = gitHub.GetRepos()
.Where(repo => !_excludedRepos.Contains(repo.Name, StringComparer.OrdinalIgnoreCase))
.ToList();
Console.WriteLine("Listing projects under repos");
var projects = repos.AsParallel()
.SelectMany(repo => gitHub.GetProjects(repo))
.ToList();
Console.WriteLine("Creating dependency tree");
MapRepoDependencies(projects);
Console.WriteLine("Ensuring dependencies are consistent on TeamCity");
foreach (var repo in repos.Where(p => p.Dependencies.Any()))
{
var dependencies = repo.Dependencies
.Select(r => r.Name)
.Concat(new[] { "CoreCLR" });
teamCity.EnsureDependencies(repo.Name, dependencies);
}
return 0;
}
private static void MapRepoDependencies(List<Project> projects)
{
var projectLookup = projects.ToDictionary(project => project.ProjectName, StringComparer.OrdinalIgnoreCase);
foreach (var project in projects)
{
foreach (var dependency in project.Dependencies)
{
Project dependencyProject;
if (projectLookup.TryGetValue(dependency, out dependencyProject) &&
project.Repo != dependencyProject.Repo)
{
project.Repo.Dependencies.Add(dependencyProject.Repo);
}
}
}
}
private static string GetEnv(string key)
{
var envValue = Environment.GetEnvironmentVariable(key);
if (String.IsNullOrEmpty(envValue))
{
throw new ArgumentNullException(key);
}
return envValue;
}
}
}