package com.hubspot.blazar.discovery; import java.io.IOException; import java.util.HashSet; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; import org.kohsuke.github.GHRepository; import org.kohsuke.github.GHTree; import org.kohsuke.github.GHTreeEntry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.base.Throwables; import com.hubspot.blazar.base.BuildConfig; import com.hubspot.blazar.base.BuildConfigDiscoveryResult; import com.hubspot.blazar.base.DiscoveredBuildConfig; import com.hubspot.blazar.base.GitInfo; import com.hubspot.blazar.base.MalformedFile; import com.hubspot.blazar.util.GitHubHelper; @Singleton public class BuildConfigDiscovery { private static final Logger LOG = LoggerFactory.getLogger(BuildConfigDiscovery.class); private final GitHubHelper gitHubHelper; @Inject public BuildConfigDiscovery(GitHubHelper gitHubHelper) { this.gitHubHelper = gitHubHelper; } public BuildConfigDiscoveryResult discover(GitInfo branch) throws IOException { GHRepository repository = gitHubHelper.repositoryFor(branch); GHTree tree = gitHubHelper.treeFor(repository, branch); Set<String> buildConfigFilePaths = new HashSet<>(); for (GHTreeEntry entry : tree.getTree()) { if (isBuildConfig(entry.getPath())) { buildConfigFilePaths.add(entry.getPath()); } } Set<DiscoveredBuildConfig> discoveredBuildConfigs = new HashSet<>(); Set<MalformedFile> malformedFiles = new HashSet<>(); for (String buildConfigFilePath : buildConfigFilePaths) { final BuildConfig buildConfig; try { buildConfig = gitHubHelper.configFor(buildConfigFilePath, repository, branch).get(); } catch (JsonProcessingException e) { LOG.warn("Error parsing config at path {} for repository {}@{}", buildConfigFilePath, branch.getFullRepositoryName(), branch.getBranch()); malformedFiles.add(new MalformedFile(branch.getId().get(), "config", buildConfigFilePath, Throwables.getStackTraceAsString(e))); continue; } String glob = (buildConfigFilePath.contains("/") ? buildConfigFilePath.substring(0, buildConfigFilePath.lastIndexOf('/') + 1) : "") + "**"; discoveredBuildConfigs.add(new DiscoveredBuildConfig(buildConfig, buildConfigFilePath, glob)); } return new BuildConfigDiscoveryResult(discoveredBuildConfigs, malformedFiles); } private static boolean isBuildConfig(String path) { return ".blazar.yaml".equals(path) || path.endsWith("/.blazar.yaml"); } }