public override void ExecuteCommand()

in Source/NuGetGallery.Operations/Tasks/PopulatePackageFrameworksTask.cs [50:153]


        public override void ExecuteCommand()
        {
            if (!Directory.Exists(WorkDirectory))
            {
                Directory.CreateDirectory(WorkDirectory);
            }

            Log.Info("Getting all package metadata...");
            var packages = GetAllPackages();

            var totalCount = packages.Count;
            var processedCount = 0;
            Log.Info(
                "Populating frameworks for {0} packages on '{1}',",
                totalCount,
                ConnectionString);


            packages
                .AsParallel()
                .AsOrdered()
                .WithDegreeOfParallelism(10)
                .ForAll(package =>
            {
                // Allocate a processed count number for this package
                var thisPackageId = Interlocked.Increment(ref processedCount);
                
                try
                {
                    var reportPath = Path.Combine(WorkDirectory, package.Id + "_" + package.Version + ".json");
                    var bustedReportPath = Path.Combine(WorkDirectory, package.Id + "_" + package.Version + "_" + package.Hash + ".json");

                    var report = new PackageFrameworkReport()
                    {
                        Id = package.Id,
                        Version = package.Version,
                        Key = package.Key,
                        Hash = package.Hash,
                        Created = package.Created.Value,
                        State = PackageReportState.Unresolved
                    };

                    if (File.Exists(bustedReportPath))
                    {
                        File.Move(bustedReportPath, reportPath);
                    }

                    if (File.Exists(reportPath))
                    {
                        using (var reader = File.OpenText(reportPath))
                        {
                            report = (PackageFrameworkReport)_serializer.Deserialize(reader, typeof(PackageFrameworkReport));
                        }
                        ResolveReport(report);
                    }
                    else
                    {
                        try
                        {
                            var downloadPath = DownloadPackage(package);
                            var nugetPackage = new ZipPackage(downloadPath);

                            var supportedFrameworks = GetSupportedFrameworks(nugetPackage);
                            report.PackageFrameworks = supportedFrameworks.ToArray();
                            report = PopulateFrameworks(package, report);

                            File.Delete(downloadPath);

                            // Resolve the report
                            ResolveReport(report);
                        }
                        catch (Exception ex)
                        {
                            report.State = PackageReportState.Error;
                            report.Error = ex.ToString();
                        }
                    }

                    using (var writer = File.CreateText(reportPath))
                    {
                        _serializer.Serialize(writer, report);
                    }

                    Log.Info("[{2}/{3} {4}%] {6} Package: {0}@{1} (created {5})",
                        package.Id,
                        package.Version,
                        thisPackageId.ToString("000000"),
                        totalCount.ToString("000000"),
                        (((double)thisPackageId / (double)totalCount) * 100).ToString("000.00"),
                        package.Created.Value,
                        report.State.ToString().PadRight(_padLength, ' '));
                }
                catch (Exception ex)
                {
                    Log.Error("[{2}/{3} {4}%] Error For Package: {0}@{1}: {5}",
                        package.Id,
                        package.Version,
                        thisPackageId.ToString("000000"),
                        totalCount.ToString("000000"),
                        (((double)thisPackageId / (double)totalCount) * 100).ToString("000.00"),
                        ex.ToString());
                }
            });
        }