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 }