예제 #1
0
        private async Task BrowseImpl(IOwinContext context, DirectoryInfo root, string path)
        {
            var s = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (s.Any(x => x.Length > 0 && x.All(c => c == '.')))
            {
                await context.Response.Error(404, new ErrorModel("Illegal Path")).ConfigureAwait(false);

                return;
            }

            using (var package = new PackageFolderReader(root))
            {
                if (path == "" || path.EndsWith("/", StringComparison.Ordinal))
                {
                    var dir = new DirectoryInfo(Path.Combine(root.FullName, Path.Combine(s)));
                    if (!dir.Exists)
                    {
                        goto NOT_FOUND;
                    }

                    await context.Response.View(new Views.FileList(), new FileListModel
                    {
                        Identity    = package.GetIdentity(),
                        Breadcrumbs = s,
                        Directories = dir.EnumerateDirectories().Where(d => !d.Attributes.HasFlag(FileAttributes.Hidden)),
                        Files       = dir.EnumerateFiles().Where(f => !f.Attributes.HasFlag(FileAttributes.Hidden))
                    }).ConfigureAwait(false);
                }
                else
                {
                    var file = new FileInfo(Path.Combine(root.FullName, Path.Combine(s)));
                    if (!file.Exists)
                    {
                        goto NOT_FOUND;
                    }

                    var gen = new FilePreviewGenerator(file);
                    if (gen.NeedsGenerate)
                    {
                        await gen.GenerateHtml(context, new HeaderModel
                        {
                            Identity    = package.GetIdentity(),
                            Breadcrumbs = s
                        }).ConfigureAwait(false);
                    }

                    context.Request.CallCancelled.ThrowIfCancellationRequested();
                    await this.filePreviewApp(context.Environment).ConfigureAwait(false);
                }
            }

            GC.Collect(); // to release a handle of nuspec file
            return;

NOT_FOUND:
            await this.Next.Invoke(context).ConfigureAwait(false);
        }
        public void PackageFolderReader_Basic()
        {
            using (var packageFile = TestPackages.GetLegacyTestPackage())
            {
                using (var zip = new ZipArchive(File.OpenRead(packageFile)))
                    using (var zipReader = new PackageArchiveReader(zip))
                    {
                        var folder = Path.Combine(Path.GetDirectoryName(packageFile), Guid.NewGuid().ToString());

                        using (var zipFile = new ZipArchive(File.OpenRead(packageFile)))
                        {
                            zipFile.ExtractAll(folder);

                            var folderReader = new PackageFolderReader(folder);

                            Assert.Equal(zipReader.GetIdentity(), folderReader.GetIdentity(), new PackageIdentityComparer());

                            Assert.Equal(zipReader.GetLibItems().Count(), folderReader.GetLibItems().Count());

                            Assert.Equal(zipReader.GetReferenceItems().Count(), folderReader.GetReferenceItems().Count());

                            Assert.Equal(zipReader.GetReferenceItems().First().Items.First(), folderReader.GetReferenceItems().First().Items.First());
                        }
                    }
            }
        }
예제 #3
0
        public void PackageFolderReader_Basic()
        {
            using (var packageFile = TestPackagesCore.GetLegacyTestPackage())
            {
                using (var zip = new ZipArchive(File.OpenRead(packageFile)))
                    using (var zipReader = new PackageArchiveReader(zip))
                        using (var testDirectory = TestDirectory.Create())
                            using (var zipFile = new ZipArchive(File.OpenRead(packageFile)))
                            {
                                zipFile.ExtractAll(testDirectory);

                                using (var folderReader = new PackageFolderReader(testDirectory))
                                {
                                    Assert.Equal(zipReader.GetIdentity(), folderReader.GetIdentity(), new PackageIdentityComparer());

                                    Assert.Equal(zipReader.GetLibItems().Count(), folderReader.GetLibItems().Count());
                                    var referenceItems = zipReader.GetReferenceItems();
                                    var folderItems    = folderReader.GetReferenceItems();

                                    Assert.Equal(referenceItems.Count(), folderItems.Count());

                                    Assert.Equal(referenceItems.First().Items.First(), folderItems.First().Items.First());
                                }
                            }
            }
        }
예제 #4
0
        public void PackagesEndedWithResourcesShouldBeProcessed()
        {
            var packageName = "solution.resources";

            using (var packageFile = TestPackagesCore.GetLegacyResourcesPackage(packageName))
            {
                using (var zip = new ZipArchive(File.OpenRead(packageFile)))
                    using (var zipReader = new PackageArchiveReader(zip))
                    {
                        var folder = Path.Combine(Path.GetDirectoryName(packageFile), Guid.NewGuid().ToString());

                        using (var zipFile = new ZipArchive(File.OpenRead(packageFile)))
                        {
                            zipFile.ExtractAll(folder);

                            var folderReader = new PackageFolderReader(folder);

                            Assert.Equal(zipReader.GetIdentity(), folderReader.GetIdentity(), new PackageIdentityComparer());
                            var libs1 = zipReader.GetLibItems().Count();
                            var libs2 = folderReader.GetLibItems().Count();
                            Assert.Equal(libs1, libs2);

                            var group1 = zipReader.GetReferenceItems();
                            var group2 = folderReader.GetReferenceItems();

                            Assert.Equal(group1.Count(), group2.Count());

                            // Check that assemblies with the 'resource' in a title are not filtered out.
                            Assert.True(group1.First().Items.Any(p => p.EndsWith("resources.dll")));
                            // Check that resource assembly not filtered out.
                            Assert.True(group2.First().Items.Any(p => p.EndsWith("resources.dll")));

                            foreach (var item in group1)
                            {
                                Assert.False(item.Items.Any(p => p.EndsWith(packageName)));
                            }

                            foreach (var item in group2)
                            {
                                Assert.False(item.Items.Any(p => p.EndsWith(packageName)));
                            }
                        }
                    }
            }
        }
예제 #5
0
        public void PackageFolderReader_Basic()
        {
            var packageNupkg = TestPackages.GetLegacyTestPackage();
            var zip = new ZipArchive(packageNupkg.OpenRead());
            PackageReader zipReader = new PackageReader(zip);

            var folder = Path.Combine(packageNupkg.Directory.FullName, Guid.NewGuid().ToString());

            var zipFile = new ZipArchive(File.OpenRead(packageNupkg.FullName));

            zipFile.ExtractAll(folder);

            var folderReader = new PackageFolderReader(folder);

            Assert.Equal(zipReader.GetIdentity(), folderReader.GetIdentity(), new PackageIdentityComparer());

            Assert.Equal(zipReader.GetLibItems().Count(), folderReader.GetLibItems().Count());

            Assert.Equal(zipReader.GetReferenceItems().Count(), folderReader.GetReferenceItems().Count());

            Assert.Equal(zipReader.GetReferenceItems().First().Items.First(), folderReader.GetReferenceItems().First().Items.First());
        }
예제 #6
0
        public void PackageFolderReader_Basic()
        {
            FileInfo      packageNupkg = TestPackages.GetLegacyTestPackage();
            var           zip          = new ZipArchive(packageNupkg.OpenRead());
            PackageReader zipReader    = new PackageReader(zip);

            string folder = Path.Combine(packageNupkg.Directory.FullName, Guid.NewGuid().ToString());

            var zipFile = new ZipArchive(File.OpenRead(packageNupkg.FullName));

            zipFile.ExtractAll(folder);

            var folderReader = new PackageFolderReader(folder);

            Assert.Equal(zipReader.GetIdentity(), folderReader.GetIdentity(), new PackageIdentityComparer());

            Assert.Equal(zipReader.GetLibItems().Count(), folderReader.GetLibItems().Count());

            Assert.Equal(zipReader.GetReferenceItems().Count(), folderReader.GetReferenceItems().Count());

            Assert.Equal(zipReader.GetReferenceItems().First().Items.First(), folderReader.GetReferenceItems().First().Items.First());
        }
예제 #7
0
        private static void Run(CommandLineApplication cmd, ILogger log)
        {
            cmd.Description = "Create a nupkg from a folder.";
            cmd.HelpOption(Constants.HelpOption);
            var output = cmd.Option("-o|--output", "Output folder, the nupkg will be added here.", CommandOptionType.SingleValue);

            var argRoot = cmd.Argument(
                "[root]",
                "Nupkg folder path",
                multipleValues: false);

            var required = new List <CommandOption>()
            {
                output
            };

            cmd.OnExecute(() =>
            {
                // Validate parameters
                foreach (var requiredOption in required)
                {
                    if (!requiredOption.HasValue())
                    {
                        throw new ArgumentException($"Missing required parameter --{requiredOption.LongName}.");
                    }
                }

                // Normalize dir ending
                var inputFolder = argRoot.Value.TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar;

                if (string.IsNullOrEmpty(inputFolder) || !Directory.Exists(inputFolder))
                {
                    throw new ArgumentException("Specify the path to a folder containg nupkg files.");
                }

                Directory.CreateDirectory(output.Value());

                var folderReader = new PackageFolderReader(inputFolder);
                var identity     = folderReader.GetIdentity();

                var nupkgName  = $"{identity.Id}.{identity.Version.ToString()}.nupkg";
                var outputPath = Path.Combine(output.Value(), nupkgName);

                log.LogMinimal($"compressing {inputFolder} -> {outputPath}");

                using (var stream = File.Create(outputPath))
                    using (var zip = new ZipArchive(stream, ZipArchiveMode.Create))
                    {
                        foreach (var file in Directory.GetFiles(inputFolder, "*", SearchOption.AllDirectories))
                        {
                            log.LogInformation($"adding {file}");

                            var zipPath = file.Substring(inputFolder.Length).Replace("\\", "/");
                            var entry   = zip.CreateEntry(zipPath, CompressionLevel.Optimal);

                            using (var entryStream = entry.Open())
                                using (var inputStream = File.OpenRead(file))
                                {
                                    inputStream.CopyTo(entryStream);
                                }
                        }
                    }

                return(0);
            });
        }
예제 #8
0
        public override async Task Invoke(IOwinContext context)
        {
            if (context.RespondNotModified())
            {
                return;
            }

            var q               = context.Request.Query;
            var hash            = q["hash"];
            var source          = q["source"];
            var packageId       = q["packageId"];
            var version         = q["version"];
            var targetFramework = q["targetFramework"];

            var model = new CompatibilityModel
            {
                PackageSelector = new PackageSelectorModel
                {
                    DefaultSource          = source,
                    DefaultPackageId       = packageId,
                    DefaultVersion         = version,
                    DefaultTargetFramework = targetFramework
                }
            };
            var statusCode = 200;

            try
            {
                PackageFolderReader package;

                if (string.IsNullOrEmpty(hash))
                {
                    if (string.IsNullOrWhiteSpace(packageId))
                    {
                        // Homepage of NuGetCalc Online
                        await context.Response.View(new Views.CompatibilityStatic(), model.PackageSelector).ConfigureAwait(false);

                        return;
                    }
                    if (string.IsNullOrWhiteSpace(targetFramework))
                    {
                        statusCode  = 400;
                        model.Error = "Target Framework is required.";
                        goto RESPOND;
                    }

                    NuGetVersion nugetVersion = null;
                    if (!string.IsNullOrWhiteSpace(version) && !NuGetVersion.TryParse(version, out nugetVersion))
                    {
                        statusCode  = 400;
                        model.Error = "Version is not valid as NuGetVersion.";
                        goto RESPOND;
                    }

                    var packageDir = NuGetUtility.GetPackage(source, packageId, nugetVersion).Result; // avoid compile error on mono
                    package = new PackageFolderReader(packageDir);
                }
                else
                {
                    package = new PackageFolderReader(NuGetUtility.GetUploadedPackage(hash));
                    model.PackageSelector.UploadHash      = hash;
                    model.PackageSelector.UploadedPackage = package.GetIdentity();
                }

                using (package)
                {
                    context.Request.CallCancelled.ThrowIfCancellationRequested();

                    var identity = package.GetIdentity();
                    model.PackageSelector.DefaultPackageId = identity.Id;
                    model.PackageSelector.DefaultVersion   = identity.Version.ToString();
                    // NuGetFramework.Parse will throw only ArgumentNullException
                    var nugetFramework = NuGetFramework.Parse(targetFramework);

                    var referenceItems = NuGetUtility.FindMostCompatibleReferenceGroup(package, nugetFramework);
                    if (referenceItems != null)
                    {
                        model.ReferenceAssemblies = referenceItems.Items;
                    }

                    var depenencyItems = NuGetUtility.FindMostCompatibleDependencyGroup(package, nugetFramework);
                    if (depenencyItems != null)
                    {
                        model.Dependencies = depenencyItems.Packages;
                    }
                }

                GC.Collect(); // to release a handle of nuspec file
            }
            catch (NuGetUtilityException ex)
            {
                statusCode  = 500;
                model.Error = ex.Message;
                if (ex.InnerException != null)
                {
                    model.Exception = ex.InnerException;
                }
            }

RESPOND:
            context.Response.StatusCode = statusCode;
            await context.Response.View(new Views.Compatibility(), model).ConfigureAwait(false);
        }