// TODO: add HasLocalInstalledPackage() ?
        // ReSharper disable once CyclomaticComplexity
        public static IEnumerable <InstalledPackage> GetLocalInstalledPackages(
            string packagesConfigFile = null,
            bool includeDependencies  = false)
        {
            packagesConfigFile = packagesConfigFile ?? GetBuildPackagesConfigFile();
            ControlFlow.Assert(!IncludesDependencies(packagesConfigFile) || includeDependencies,
                               $"!IncludesDependencies({packagesConfigFile}) || includeDependencies");
            var packagesDirectory = GetPackagesDirectory(packagesConfigFile);

            var packageIds = XmlTasks.XmlPeek(
                packagesConfigFile,
                IsLegacyFile(packagesConfigFile)
                    ? ".//package/@id"
                    : ".//*[local-name() = 'PackageReference']/@Include");

            var installedPackages = new HashSet <InstalledPackage>(InstalledPackage.Comparer.Instance);

            foreach (var packageId in packageIds)
            {
                // TODO: use xml namespaces
                // TODO: version as tag
                var version = XmlTasks.XmlPeekSingle(
                    packagesConfigFile,
                    IsLegacyFile(packagesConfigFile)
                            ? $".//package[@id='{packageId}']/@version"
                            : $".//*[local-name() = 'PackageReference'][@Include='{packageId}']/@Version")
                              .NotNull("version != null");

                var packageData = GetGlobalInstalledPackage(packageId, version, packagesDirectory);
                if (packageData == null)
                {
                    continue;
                }

                installedPackages.Add(packageData);
                yield return(packageData);
            }

            if (includeDependencies)
            {
                var packagesToCheck = new Queue <InstalledPackage>(installedPackages);
                while (packagesToCheck.Any())
                {
                    var packageToCheck = packagesToCheck.Dequeue();

                    foreach (var dependentPackage in GetDependentPackages(packageToCheck, packagesDirectory))
                    {
                        if (installedPackages.Contains(dependentPackage))
                        {
                            continue;
                        }

                        installedPackages.Add(dependentPackage);
                        packagesToCheck.Enqueue(dependentPackage);

                        yield return(dependentPackage);
                    }
                }
            }
        }
        public void TestPrettyXML_uneven()
        {
            var input = new SplitXMLFileInput()
            {
                InputFilePath = _prettyInputPath, OutputFilesDirectory = _tempOutputFolder, SplitAtElementName = "Product"
            };
            var opt = new SplitXMLFileOptions()
            {
                ElementCountInEachFile = 10, OutputFileRootNodeName = "root"
            };

            var result = XmlTasks.SplitXMLFile(input, opt, new CancellationToken());

            //12 products should be split into 2 files
            Assert.AreEqual(2, result.FilePaths.Count);

            //Last file should have 2 Products
            var productCount = ExecuteXpath(result.FilePaths.Last(), "string(count(/root/Product))");

            Assert.AreEqual("2", productCount);

            //The Last Product of first file should have id 10
            var id = ExecuteXpath(result.FilePaths.First(), "string(/root/Product[last()]/id)");

            Assert.AreEqual("10", id);
        }
        public void TestPrettyXML_notfull()
        {
            string expectedRootElement = "TestRoot";

            var input = new SplitXMLFileInput()
            {
                InputFilePath = _prettyInputPath, OutputFilesDirectory = _tempOutputFolder, SplitAtElementName = "Product"
            };
            var opt = new SplitXMLFileOptions()
            {
                ElementCountInEachFile = 20, OutputFileRootNodeName = expectedRootElement
            };

            var result = XmlTasks.SplitXMLFile(input, opt, new CancellationToken());

            //Check root element
            var rootElementName = ExecuteXpath(result.FilePaths.Last(), "local-name(/*)");

            Assert.AreEqual(expectedRootElement, rootElementName);

            //The Last Product of first file should have id 12
            var id = ExecuteXpath(result.FilePaths.First(), "string(/TestRoot/Product[last()]/id)");

            Assert.AreEqual("12", id);
        }
示例#4
0
    public override object GetValue(MemberInfo member, object instance)
    {
        var rssFile = NukeBuild.TemporaryDirectory / $"{_groupId}-{_artifactId ?? _groupId}.xml";

        HttpTasks.HttpDownloadFile($"https://{_repository.TrimStart("https").TrimStart("http").TrimStart("://").TrimEnd("/")}/m2/{_groupId.Replace(".", "/")}/{_artifactId ?? _groupId}/maven-metadata.xml", rssFile);
        return(XmlTasks.XmlPeek(rssFile, ".//version").Last());
    }
示例#5
0
        private static IEnumerable <InstalledPackage> GetLocalInstalledPackagesFromConfigFile(
            string packagesConfigFile,
            bool resolveDependencies = true)
        {
            var packageIds = XmlTasks.XmlPeek(
                packagesConfigFile,
                IsLegacyFile(packagesConfigFile)
                        ? ".//package/@id"
                        : ".//*[local-name() = 'PackageReference' or local-name() = 'PackageDownload']/@Include")
                             .Distinct();

            var installedPackages = new HashSet <InstalledPackage>(InstalledPackage.Comparer.Instance);

            foreach (var packageId in packageIds)
            {
                // TODO: use xml namespaces
                // TODO: version as tag
                var versions = XmlTasks.XmlPeek(
                    packagesConfigFile,
                    IsLegacyFile(packagesConfigFile)
                            ? $".//package[@id='{packageId}']/@version"
                            : $".//*[local-name() = 'PackageReference' or local-name() = 'PackageDownload'][@Include='{packageId}']/@Version")
                               .SelectMany(x => x.Split(';'));

                foreach (var version in versions)
                {
                    var package = GetGlobalInstalledPackage(packageId, version, packagesConfigFile);
                    if (package == null)
                    {
                        continue;
                    }

                    installedPackages.Add(package);
                    yield return(package);
                }
            }

            if (resolveDependencies && !IsLegacyFile(packagesConfigFile))
            {
                var packagesToCheck = new Queue <InstalledPackage>(installedPackages);
                while (packagesToCheck.Any())
                {
                    var packageToCheck = packagesToCheck.Dequeue();

                    foreach (var dependentPackage in GetDependentPackages(packageToCheck, packagesConfigFile))
                    {
                        if (installedPackages.Contains(dependentPackage))
                        {
                            continue;
                        }

                        installedPackages.Add(dependentPackage);
                        packagesToCheck.Enqueue(dependentPackage);

                        yield return(dependentPackage);
                    }
                }
            }
        }
示例#6
0
        public override object GetValue(MemberInfo member, object instance)
        {
            var endpoint = _repository.TrimStart("https").TrimStart("http").TrimStart("://").TrimEnd("/");
            var uri      = $"https://{endpoint}/m2/{_groupId.Replace(".", "/")}/{_artifactId ?? _groupId}/maven-metadata.xml";
            var content  = HttpTasks.HttpDownloadString(uri);

            return(XmlTasks.XmlPeekFromString(content, ".//version").Last());
        }
        public override object GetValue(MemberInfo member, object instance)
        {
            var content = HttpTasks.HttpDownloadString($"https://www.myget.org/RSS/{_feed}");

            return(XmlTasks.XmlPeekFromString(content, ".//title")
                   // TODO: regex?
                   .First(x => x.Contains($"/{_package} "))
                   .Split('(').Last()
                   .Split(')').First()
                   .TrimStart("version "));
        }
    public override object GetValue(MemberInfo member, object instance)
    {
        var rssFile = NukeBuild.TemporaryDirectory / $"{_feed}.xml";

        HttpTasks.HttpDownloadFile($"https://www.myget.org/RSS/{_feed}", rssFile);
        return(XmlTasks.XmlPeek(rssFile, ".//title")
               // TODO: regex?
               .First(x => x.Contains($"/{_package} "))
               .Split('(').Last()
               .Split(')').First()
               .TrimStart("version "));
    }
示例#9
0
        // TODO: check for config ( repositoryPath / globalPackagesFolder )
        public static string GetPackagesDirectory(string packagesConfigFile)
        {
            var packagesDirectory = EnvironmentInfo.Variable("NUGET_PACKAGES");

            if (packagesDirectory != null)
            {
                return(packagesDirectory);
            }

            var configSetting = GetConfigFiles(packagesConfigFile)
                                .Select(x => new
            {
                File    = x,
                Setting = XmlTasks.XmlPeek(x, ".//add[@key='globalPackagesFolder']/@value").FirstOrDefault()
            })
                                .Where(x => x.Setting != null)
                                .FirstOrDefault();

            if (configSetting != null)
            {
                return(Path.IsPathRooted(configSetting.Setting)
                    ? configSetting.Setting
                    : Path.Combine(Path.GetDirectoryName(configSetting.File).NotNull(), configSetting.Setting));
            }

            if (packagesConfigFile == null || !IsLegacyFile(packagesConfigFile))
            {
                return(Path.Combine(
                           EnvironmentInfo.SpecialFolder(SpecialFolders.UserProfile)
                           .NotNull("EnvironmentInfo.SpecialFolder(SpecialFolders.UserProfile) != null"),
                           ".nuget",
                           "packages"));
            }

            if (NukeBuild.Instance != null)
            // TODO SK
#pragma warning disable 618
            {
                return(Path.Combine(Path.GetDirectoryName(NukeBuild.Instance.SolutionFile).NotNull(), "packages"));
            }
#pragma warning restore 618

            packagesDirectory = new FileInfo(packagesConfigFile).Directory.NotNull()
                                .DescendantsAndSelf(x => x.Parent)
                                .SingleOrDefault(x => x.GetFiles("*.sln").Any() && x.GetDirectories("packages").Any())
                                ?.FullName;

            return(packagesDirectory.NotNull("GetPackagesDirectory != null"));
        }
示例#10
0
        private static string GetPackagesDirectory([CanBeNull] string packagesConfigFile)
        {
            string TryGetFromEnvironmentVariable()
            => EnvironmentInfo.GetVariable <string>("NUGET_PACKAGES");

            string TryGetGlobalDirectoryFromConfig()
            => GetConfigFiles(packagesConfigFile)
            .Select(x => new
            {
                File    = x,
                Setting = XmlTasks.XmlPeekSingle(x, ".//add[@key='globalPackagesFolder']/@value")
            })
            .Where(x => x.Setting != null)
            .Select(x => Path.IsPathRooted(x.Setting)
                        ? x.Setting
                        : Path.Combine(Path.GetDirectoryName(x.File).NotNull(), x.Setting))
            .FirstOrDefault();

            string TryGetDefaultGlobalDirectory()
            => packagesConfigFile == null || !IsLegacyFile(packagesConfigFile)
                    ? Path.Combine(
                EnvironmentInfo.SpecialFolder(SpecialFolders.UserProfile)
                .NotNull("EnvironmentInfo.SpecialFolder(SpecialFolders.UserProfile) != null"),
                ".nuget",
                "packages")
                    : null;

            string TryGetLocalDirectory()
            => packagesConfigFile != null
                    ? new FileInfo(packagesConfigFile).Directory.NotNull()
            .DescendantsAndSelf(x => x.Parent)
            .Where(x => x.GetFiles("*.sln").Any())
            .Select(x => Path.Combine(x.FullName, "packages"))
            .FirstOrDefault(Directory.Exists)
                    : null;

            var packagesDirectory = TryGetFromEnvironmentVariable() ??
                                    TryGetGlobalDirectoryFromConfig() ??
                                    TryGetDefaultGlobalDirectory() ??
                                    TryGetLocalDirectory();

            return(packagesDirectory != null && Directory.Exists(packagesDirectory)
                ? packagesDirectory
                : null);
        }
示例#11
0
    void ReportTestCount()
    {
        IEnumerable <string> GetOutcomes(AbsolutePath file)
        => XmlTasks.XmlPeek(
            file,
            "/xn:TestRun/xn:Results/xn:UnitTestResult/@outcome",
            ("xn", "http://microsoft.com/schemas/VisualStudio/TeamTest/2010"));

        var resultFiles  = TestResultDirectory.GlobFiles("*.trx");
        var outcomes     = resultFiles.SelectMany(GetOutcomes).ToList();
        var passedTests  = outcomes.Count(x => x == "Passed");
        var failedTests  = outcomes.Count(x => x == "Failed");
        var skippedTests = outcomes.Count(x => x == "NotExecuted");

        ReportSummary(_ => _
                      .When(failedTests > 0, _ => _
                            .AddPair("Failed", failedTests.ToString()))
                      .AddPair("Passed", passedTests.ToString())
                      .When(skippedTests > 0, _ => _
                            .AddPair("Skipped", skippedTests.ToString())));
    }
        public void TestMinifiedXML_even()
        {
            var input = new SplitXMLFileInput()
            {
                InputFilePath = _minifiedInputPath, OutputFilesDirectory = _tempOutputFolder, SplitAtElementName = "Product"
            };
            var opt = new SplitXMLFileOptions()
            {
                ElementCountInEachFile = 4, OutputFileRootNodeName = "root"
            };

            var result = XmlTasks.SplitXMLFile(input, opt, new CancellationToken());

            //12 products should be split into 3 files
            Assert.AreEqual(3, result.FilePaths.Count);

            //Last file should have 4 Products
            var productCount = ExecuteXpath(result.FilePaths.Last(), "string(count(/root/Product))");

            Assert.AreEqual("4", productCount);

            //The Last Product of first file should have id 4
            var id = ExecuteXpath(result.FilePaths.First(), "string(/root/Product[last()]/id)");

            Assert.AreEqual("4", id);

            //The second file should have 4 products
            var productCount2nd = ExecuteXpath(result.FilePaths[1], "string(count(/root/Product))");

            Assert.AreEqual("4", productCount2nd);

            //The Last Product of second file should have id 8
            var id2nd = ExecuteXpath(result.FilePaths[1], "string(/root/Product[last()]/id)");

            Assert.AreEqual("8", id2nd);
        }