winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

RepairCommand.cpp (5299B)


      1 // Copyright (c) Microsoft Corporation.
      2 // Licensed under the MIT License.
      3 #include "pch.h"
      4 #include "RepairCommand.h"
      5 #include "Workflows/RepairFlow.h"
      6 #include "Workflows/CompletionFlow.h"
      7 #include "Workflows/DownloadFlow.h"
      8 #include "Workflows/InstallFlow.h"
      9 
     10 namespace AppInstaller::CLI
     11 {
     12     using namespace AppInstaller::CLI::Execution;
     13     using namespace AppInstaller::CLI::Workflow;
     14 
     15     std::vector<Argument> RepairCommand::GetArguments() const
     16     {
     17         return {
     18             Argument::ForType(Args::Type::Query),                            // -q
     19             Argument::ForType(Args::Type::Manifest),                         // -m
     20             Argument::ForType(Args::Type::Id),                               // -id
     21             Argument::ForType(Args::Type::Name),                             // -n
     22             Argument::ForType(Args::Type::Channel),
     23             Argument::ForType(Args::Type::Moniker),                          // -mn
     24             Argument::ForType(Args::Type::TargetVersion),                    // -v
     25             Argument::ForType(Args::Type::ProductCode),
     26             Argument::ForType(Args::Type::InstallArchitecture),              // -arch
     27             Argument{ Execution::Args::Type::InstallScope, Resource::String::InstalledScopeArgumentDescription, ArgumentType::Standard, Argument::Visibility::Help },
     28             Argument::ForType(Args::Type::Source),                           // -s
     29             Argument::ForType(Args::Type::Interactive),                      // -i
     30             Argument::ForType(Args::Type::Silent),                           // -h
     31             Argument::ForType(Args::Type::Log),                              // -o
     32             Argument::ForType(Args::Type::IgnoreLocalArchiveMalwareScan),    // -ignore-local-archive-malware-scan
     33             Argument::ForType(Args::Type::AcceptSourceAgreements),           // -accept-source-agreements
     34             Argument::ForType(Args::Type::AcceptPackageAgreements),
     35             Argument::ForType(Args::Type::Locale),
     36             Argument::ForType(Args::Type::CustomHeader),
     37             Argument::ForType(Args::Type::AuthenticationMode),
     38             Argument::ForType(Args::Type::AuthenticationAccount),
     39             Argument::ForType(Args::Type::Force),
     40             Argument::ForType(Args::Type::HashOverride),
     41             Argument::ForType(Args::Type::Exact),
     42         };
     43     }
     44 
     45     Resource::LocString RepairCommand::ShortDescription() const
     46     {
     47         return { Resource::String::RepairCommandShortDescription };
     48     }
     49 
     50     Resource::LocString RepairCommand::LongDescription() const
     51     {
     52         return { Resource::String::RepairCommandLongDescription };
     53     }
     54 
     55     void RepairCommand::Complete(Execution::Context& context, Execution::Args::Type valueType) const
     56     {
     57         if (valueType == Execution::Args::Type::Manifest ||
     58             valueType == Execution::Args::Type::Log)
     59         {
     60             // Intentionally output nothing to allow pass through to filesystem.
     61             return;
     62         }
     63 
     64         context <<
     65             Workflow::OpenSource() <<
     66             Workflow::OpenCompositeSource(Repository::PredefinedSource::Installed);
     67 
     68         switch (valueType)
     69         {
     70         case Execution::Args::Type::Id:
     71         case Execution::Args::Type::Name:
     72         case Execution::Args::Type::Moniker:
     73         case Execution::Args::Type::TargetVersion:
     74         case Execution::Args::Type::Channel:
     75         case Execution::Args::Type::Source:
     76             context <<
     77                 Workflow::CompleteWithSingleSemanticsForValueUsingExistingSource(valueType);
     78             break;
     79         }
     80     }
     81 
     82     Utility::LocIndView RepairCommand::HelpLink() const
     83     {
     84         // TODO: point to the right place
     85         return "https://aka.ms/winget-command-repair"_liv;
     86     }
     87 
     88     void RepairCommand::ValidateArgumentsInternal(Execution::Args& execArgs) const
     89     {
     90         Argument::ValidateCommonArguments(execArgs);
     91     }
     92 
     93     void RepairCommand::ExecuteInternal(Execution::Context& context) const
     94     {
     95         context.SetFlags(Execution::ContextFlag::InstallerExecutionUseRepair);
     96 
     97         context <<
     98             Workflow::InitializeInstallerDownloadAuthenticatorsMap <<
     99             Workflow::ReportExecutionStage(ExecutionStage::Discovery) <<
    100             Workflow::OpenSource() <<
    101             Workflow::OpenCompositeSource(DetermineInstalledSource(context));
    102 
    103         if (context.Args.Contains(Args::Type::Manifest))
    104         {
    105             context <<
    106                 Workflow::GetManifestFromArg <<
    107                 Workflow::ReportManifestIdentity <<
    108                 Workflow::SearchSourceUsingManifest <<
    109                 Workflow::EnsureOneMatchFromSearchResult(OperationType::Repair);
    110         }
    111         else
    112         {
    113             context <<
    114                 Workflow::SearchSourceForSingle <<
    115                 Workflow::HandleSearchResultFailures <<
    116                 Workflow::EnsureOneMatchFromSearchResult(OperationType::Repair) <<
    117                 Workflow::ReportPackageIdentity;
    118         }
    119 
    120         context <<
    121             Workflow::GetInstalledPackageVersion <<
    122             Workflow::SelectApplicableInstallerIfNecessary <<
    123             Workflow::RepairSinglePackage;
    124     }
    125 }