Esempio n. 1
0
        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]);
        }
Esempio n. 2
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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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);
        }