File: Commands\Package\Update\PackageUpdateCommand.cs
Web Access
Project: src\src\nuget-client\src\NuGet.Core\NuGet.CommandLine.XPlat\NuGet.CommandLine.XPlat.csproj (NuGet.CommandLine.XPlat)
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

#nullable enable

using System;
using System.Collections.Generic;
using System.CommandLine;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Common;

namespace NuGet.CommandLine.XPlat.Commands.Package.Update;

internal static class PackageUpdateCommand
{
    internal static void Register(Command packageCommand, Option<bool> interactiveOption, IVirtualProjectBuilder? virtualProjectBuilder = null)
    {
        Register(packageCommand, interactiveOption, (args, ct) => PackageUpdateCommandRunner.Run(args, virtualProjectBuilder, ct));
    }

    internal static void Register(Command packageCommand, Option<bool> interactiveOption, Func<PackageUpdateArgs, CancellationToken, Task<int>> action)
    {
        var command = new DocumentedCommand("update", Strings.PackageUpdateCommand_Description, "https://aka.ms/dotnet/package/update");

        var packagesArguments = new Argument<IReadOnlyList<PackageWithVersionRange>>("packages")
        {
            Description = Strings.PackageUpdate_PackageArgumentDescription,
            Arity = ArgumentArity.ZeroOrMore,
            CustomParser = PackageWithVersionRange.Parse
        };
        command.Arguments.Add(packagesArguments);

        var projectOption = new Option<FileSystemInfo>("--project", "--file").AcceptExistingOnly();
        projectOption.Description = Strings.PackageUpdateCommand_ProjectOptionDescription;
        command.Options.Add(projectOption);

        var vulnerableOption = new Option<bool>("--vulnerable");
        vulnerableOption.Description = Strings.PackageUpdateCommand_VulnerableOptionDescription;
        command.Options.Add(vulnerableOption);

        command.Options.Add(interactiveOption);

        var verbosityOption = CommonOptions.GetVerbosityOption();
        command.Options.Add(verbosityOption);

        packageCommand.Subcommands.Add(command);
        command.SetAction(async (args, cancellationToken) =>
        {
            FileSystemInfo? project = args.GetValue(projectOption);
            IReadOnlyList<PackageWithVersionRange> packages = args.GetValue(packagesArguments) ?? [];
            bool interactive = args.GetValue(interactiveOption);
            VerbosityEnum verbosity = args.GetValue(verbosityOption) ?? VerbosityEnum.normal;
            LogLevel logLevel = verbosity.ToLogLevel();
            bool vulnerable = args.GetValue(vulnerableOption);

            var commandArgs = new PackageUpdateArgs
            {
                Project = project?.FullName ?? Environment.CurrentDirectory,
                Packages = packages,
                Interactive = interactive,
                LogLevel = logLevel,
                Vulnerable = vulnerable,
            };

            return await action(commandArgs, cancellationToken);
        });
    }
}