private static MyNugetPackage find_dependency_pacakge_using_http_request(MyNugetPackageDependency dependencyPkg, ChocolateyConfiguration configuration) { bool allowPreRelease = configuration.Prerelease; List <MyNugetPackage> totalFoundBestPkgs = new List <MyNugetPackage>(); foreach (string sourceUri in configuration.Sources.Split(';')) { bool isUriOk = Uri.IsWellFormedUriString(sourceUri.Trim(), UriKind.Absolute); if (!isUriOk) { "chocolatey".Log().Debug("Skipping search in unsupported source: '{0}' - Only WEB sources are supported for this command".format_with(sourceUri)); continue; } ChocolateyConfiguration tempConf = configuration.deep_copy(); tempConf.Sources = sourceUri.Trim(); string responseStr = query_for_package_using_http_request(dependencyPkg, tempConf); if (responseStr == null) { continue; } List <MyNugetPackage> foundPackagesList = parseHttpQueryPackageDetailsRequestResponse(dependencyPkg, responseStr); if (foundPackagesList.Count() == 0) { "chocolatey".Log().Debug("Failed to find any 'entry' child nodes of pkg: '{0}' in source: '{1}'".format_with(dependencyPkg.Id, sourceUri)); continue; } // Sort results based on their version so that higher is first foundPackagesList.Sort(delegate(MyNugetPackage x, MyNugetPackage y) { return(y.Version.CompareTo(x.Version)); }); MyNugetPackage bestMatchingPkg = foundPackagesList[0]; //Latest version found if (dependencyPkg.VersionSpec != null) // If want a specific version // Attempt to get the best matching package { bestMatchingPkg = getBestMatchingDependencyPkgFromList(foundPackagesList, dependencyPkg); } if (bestMatchingPkg == null) { "chocolatey".Log().Debug("Failed to determine best package from found 'entry' child nodes of pkg: '{0}' in source: '{1}'".format_with(dependencyPkg.Id, sourceUri)); continue; } totalFoundBestPkgs.Add(bestMatchingPkg); } if (totalFoundBestPkgs.Count() == 0) { "chocolatey".Log().Warn("Failed to find a dependency package '{0}' that satisfies version spec: {1}".format_with(dependencyPkg.Id, dependencyPkg.VersionSpec.ToString())); return(null); } // Sort results based on their version so that higher is first totalFoundBestPkgs.Sort(delegate(MyNugetPackage x, MyNugetPackage y) { return(y.Version.CompareTo(x.Version)); }); return(totalFoundBestPkgs[0]); }
private static List <MyNugetPackage> parseHttpQueryPackageDetailsRequestResponse(MyNugetPackageDependency dependencyPkg, string httpResponseStr) { "chocolatey".Log().Debug("Attempting to parse http response into an XML obj"); XmlDocument xmlDoc = new XmlDocument(); try { xmlDoc.LoadXml(httpResponseStr); } catch (Exception e) { "chocolatey".Log().Debug(e.ToString()); "chocolatey".Log().Debug("Failed to parse http response into an XML obj"); return(null); } XmlElement rootNode = xmlDoc.DocumentElement; XmlNodeList rootNodeChildren = rootNode.ChildNodes; if (xmlDoc.DocumentElement.Name.ToLower() == "entry") { //Create a new node. XmlElement node = xmlDoc.CreateElement("feed"); //Add the node to the document. rootNode.PrependChild(node); rootNodeChildren = rootNode.ParentNode.ChildNodes; } "chocolatey".Log().Debug("Looping on XML obj to get all 'entry' child nodes"); List <MyNugetPackage> foundPackagesList = new List <MyNugetPackage>(); foreach (XmlNode docChildNode in rootNodeChildren) { // Looking for 'entry' child nodes only if (docChildNode.Name.ToLower() != "entry") { continue; } MyNugetPackage package = parseXmlNodeForPackageDetails(dependencyPkg, docChildNode); if (package == null) { continue; } foundPackagesList.Add(package); // Add found dependecy package details // Check if looking for only 1 depenedncy if (dependencyPkg.IsExactVersion && dependencyPkg.VersionSpec != null && package.Version.CompareTo(dependencyPkg.VersionSpec.MaxVersion) == 0) { break; } // Found what we were looking for - no need to search further more } return(foundPackagesList); }
public static void delete_package(MyNugetPackage packageToDelete, ChocolateyConfiguration config) { var timeout = TimeSpan.FromSeconds(Math.Abs(config.CommandExecutionTimeoutSeconds)); if (timeout.Seconds <= 0) { int timeoutMinutes = 10; "chocolatey".Log().Debug(ChocolateyLoggers.Verbose, "Updating timeout to: {0} minutes because configured timeout value is invalid: {1}".format_with(timeoutMinutes, config.CommandExecutionTimeoutSeconds)); timeout = TimeSpan.FromMinutes(timeoutMinutes); // Default to 10 minutes hours if there is a zero (infinite) timeout } var packageServer = new PackageServer(config.Sources, ApplicationParameters.UserAgent); packageServer.SendingRequest += (sender, e) => { if (config.Verbose) { "chocolatey".Log().Info(ChocolateyLoggers.Verbose, "{0} {1}".format_with(e.Request.Method, e.Request.RequestUri)); } }; string packageId = packageToDelete.Id; string packageVersion = packageToDelete.Version.ToString(); string packageFullName = "{0}-{1}".format_with(packageId, packageVersion); try { packageServer.DeletePackage( config.PushCommand.Key, packageId, packageVersion); } catch (InvalidOperationException ex) { var message = ex.Message; if (!string.IsNullOrWhiteSpace(message)) { if (message.Contains("(404)")) { // Let this fall through so the actual error message is shown when the exception is re-thrown "chocolatey".Log().Error("An error has occurred. It's very much possible that the package version doesn't exist on the repository. See error below..."); } } throw; } "chocolatey".Log().Info(ChocolateyLoggers.Important, () => "{0} was successfully deleted from source: {1}".format_with(packageFullName, config.Sources)); }
public static IEnumerable <IDictionary <string, object> > GetPackageDependencies(MyNugetPackage pacakge, ChocolateyConfiguration configuration, ILogger nugetLogger, int printSpaceLevel) { List <IDictionary <string, object> > packagesDictList = new List <IDictionary <string, object> >(); foreach (var pkgDependency in pacakge.DependenciesList) { "chocolatey".Log().Debug("Getting details of dependency Package '{0}'".format_with(pkgDependency.Id)); var resolvedDependencyPkg = find_dependency_pacakge_using_http_request(pkgDependency, configuration); if (resolvedDependencyPkg == null) { if (configuration.SkipMissingDependencies) { continue; } throw new Exception("Failed getting details of dependency of package '{0} : {1}'".format_with(pkgDependency.Id, pkgDependency.VersionSpec.ToString())); } IDictionary <string, object> packageDict = new Dictionary <string, object>(); packageDict.Add("PACKAGE", resolvedDependencyPkg); packageDict.Add("PRINT_SPACE_LEVEL", printSpaceLevel); packageDict.Add("DEPENDENCIES", new List <IDictionary <string, object> >()); packagesDictList.Add(packageDict); // Add the packages that were looking for it's dependencies "chocolatey".Log().Debug("Searching for dependencies of package '{0} {1}'".format_with(resolvedDependencyPkg.Id, resolvedDependencyPkg.Version.ToString())); var dependsPackagesDictList = GetPackageDependencies(resolvedDependencyPkg, configuration, nugetLogger, printSpaceLevel + 1); packageDict["DEPENDENCIES"] = dependsPackagesDictList; "chocolatey".Log().Debug("Found {0} dependencies of package '{1} {2}'".format_with(dependsPackagesDictList.Count(), resolvedDependencyPkg.Id, resolvedDependencyPkg.Version.ToString())); } return(packagesDictList); }