public async Task FindSource(PackageURL purl) { var purlNoVersion = new PackageURL(purl.Type, purl.Namespace, purl.Name, null, purl.Qualifiers, purl.Subpath); Logger.Debug("Searching for source code for {0}", purlNoVersion.ToString()); // Use reflection to find the correct downloader class var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes() .Where(type => type.IsSubclassOf(typeof(BaseProjectManager))) .Where(type => type.Name.Equals($"{purl.Type}ProjectManager", StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(); if (projectManagerClass != null) { var ctor = projectManagerClass.GetConstructor(Array.Empty <Type>()); var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>())); var content = await projectManager.GetMetadata(purlNoVersion); foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content)) { var githubUrl = $"https://github.com/{githubPurl.Namespace}/{githubPurl.Name}"; Logger.Info("Found: {0} ({1})", githubPurl.ToString(), githubUrl); } } else { throw new ArgumentException("Invalid Package URL type: {0}", purlNoVersion.Type); } }
public async Task <HealthMetrics> CheckHealth(PackageURL purl) { // Use reflection to find the correct package management class var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes() .Where(type => type.IsSubclassOf(typeof(BaseProjectManager))) .Where(type => type.Name.Equals($"{purl.Type}ProjectManager", StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(); if (projectManagerClass != default) { var ctor = projectManagerClass.GetConstructor(Array.Empty <Type>()); var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>())); var content = await projectManager.GetMetadata(purl); if (!string.IsNullOrWhiteSpace(content)) { foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content)) { try { var healthAlgorithm = new GitHubHealthAlgorithm(githubPurl); var health = await healthAlgorithm.GetHealth(); return(health); } catch (Exception ex) { Logger.Warn(ex, "Unable to calculate health for {0}: {1}", githubPurl, ex.Message); } } } else { Logger.Warn("No metadata found for {0}", purl.ToString()); } } else { throw new ArgumentException("Invalid Package URL type: {0}", purl.Type); } return(default);
public async Task <IEnumerable <PackageURL> > FindSource(PackageURL purl) { var purlNoVersion = new PackageURL(purl.Type, purl.Namespace, purl.Name, null, purl.Qualifiers, purl.Subpath); Logger.Debug("Searching for source code for {0}", purlNoVersion.ToString()); // Use reflection to find the correct downloader class var projectManagerClass = typeof(BaseProjectManager).Assembly.GetTypes() .Where(type => type.IsSubclassOf(typeof(BaseProjectManager))) .Where(type => type.Name.Equals($"{purl.Type}ProjectManager", StringComparison.InvariantCultureIgnoreCase)) .FirstOrDefault(); var sourceList = new List <PackageURL>(); if (projectManagerClass != default) { var ctor = projectManagerClass.GetConstructor(Array.Empty <Type>()); var projectManager = (BaseProjectManager)(ctor.Invoke(Array.Empty <object>())); var content = await projectManager.GetMetadata(purlNoVersion); if (!string.IsNullOrWhiteSpace(content)) { foreach (var githubPurl in BaseProjectManager.ExtractGitHubPackageURLs(content)) { sourceList.Add(githubPurl); Logger.Debug("Identified GitHub Source: {0})", githubPurl.ToString()); } } else { Logger.Warn("No metadata found for {0}", purlNoVersion.ToString()); } } else { throw new ArgumentException("Invalid Package URL type: {0}", purlNoVersion.Type); } return(sourceList); }