public async Task ExecuteAsync(CancellationToken token)
        {
            if (!NuGetVersion.TryParse(Version, out var parsedVersion))
            {
                _logger.LogError("The version '{Version}' could not be parsed.", Version);
                return;
            }

            var isSemVer2 = parsedVersion.IsSemVer2 || SemVer2;

            var state = new PackageConsistencyState();
            PackageQueryContext context;

            if (Gallery)
            {
                context = await _contextBuilder.GetPackageQueryContextFromGalleryAsync(Id, Version, state);
            }
            else if (Database)
            {
                context = await _contextBuilder.GetPackageQueryContextFromDatabaseAsync(Id, Version);

                if (context == null)
                {
                    _logger.LogError("The package {Id} {Version} could not be found in the database.", Id, Version);
                    return;
                }
            }
            else if (Deleted)
            {
                context = _contextBuilder.CreateDeletedPackageQueryContext(Id, Version);
            }
            else
            {
                context = _contextBuilder.CreateAvailablePackageQueryContext(Id, Version, isSemVer2, !Unlisted);
            }

            var report = await _service.GetReportAsync(context, state, NullProgressReporter.Instance);

            var reportJson = JsonConvert.SerializeObject(
                report,
                new JsonSerializerSettings
            {
                Converters =
                {
                    new NuspecJsonConverter(),
                    new StringEnumConverter(),
                },
                Formatting = Formatting.Indented,
            });

            _logger.LogInformation(reportJson);
        }
Exemple #2
0
        private async Task StartInternalAsync(string id, string version)
        {
            if (string.IsNullOrWhiteSpace(id))
            {
                await InvokeErrorAsync("You must provide a package ID.");

                return;
            }

            if (!StrictPackageIdValidator.IsValid(id))
            {
                await InvokeErrorAsync("The ID you provided is invalid.");

                return;
            }

            if (string.IsNullOrWhiteSpace(version))
            {
                await InvokeErrorAsync("You must provide a package version.");

                return;
            }

            if (!NuGetVersion.TryParse(version, out var parsedVersion))
            {
                await InvokeErrorAsync("The version you provided is invalid.");

                return;
            }

            await InvokeProgressAsync(0, $"Initializing package report for {id} {version}.");

            var state   = new PackageConsistencyState();
            var context = await _packageQueryContextBuilder.GetPackageQueryContextFromGalleryAsync(id, version, state);

            var    packageDeletedStatus = state.Gallery.PackageState.PackageDeletedStatus;
            var    isAvailable          = packageDeletedStatus == PackageDeletedStatus.NotDeleted;
            string availability;

            switch (packageDeletedStatus)
            {
            case PackageDeletedStatus.NotDeleted:
                availability = "is available";
                break;

            case PackageDeletedStatus.SoftDeleted:
                availability = "was soft deleted";
                break;

            case PackageDeletedStatus.Unknown:
                availability = "was hard deleted or never published";
                break;

            default:
                throw new NotImplementedException(
                          $"The package deleted status {packageDeletedStatus} is not supported.");
            }

            await InvokeProgressAsync(
                0,
                $"{context.Package.Id} {context.Package.Version} {availability}" +
                $"{(isAvailable && context.IsSemVer2 ? " and is SemVer 2.0.0" : string.Empty)}. " +
                $"The consistency report will now be generated.");

            var report = await _packageConsistencyService.GetReportAsync(context, state, new ProgressReporter(this));

            await InvokeCompleteAsync(report);
        }