Skip to content

Commit fe3139e

Browse files
committed
working on test; refactoring to use COM code for update availability
1 parent 71c6e8f commit fe3139e

File tree

5 files changed

+115
-1
lines changed

5 files changed

+115
-1
lines changed

src/AppInstallerCLICore/Commands/DscPackageResource.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,57 @@ namespace AppInstaller::CLI
179179

180180
return result;
181181
}
182+
183+
private:
184+
bool TestVersion()
185+
{
186+
if (Input.Version())
187+
{
188+
if (Output.Version())
189+
{
190+
return Utility::Version{ Input.Version().value() } == Utility::Version{ Output.Version().value() };
191+
}
192+
else
193+
{
194+
return false;
195+
}
196+
}
197+
else
198+
{
199+
return true;
200+
}
201+
}
202+
203+
bool TestScope()
204+
{
205+
if (Input.Scope())
206+
{
207+
if (Output.Scope())
208+
{
209+
return Utility::ToLower(Input.Scope().value()) == Utility::ToLower(Output.Scope().value());
210+
}
211+
else
212+
{
213+
return false;
214+
}
215+
}
216+
else
217+
{
218+
return true;
219+
}
220+
}
221+
222+
bool TestLatest()
223+
{
224+
if (Input.UseLatest())
225+
{
226+
227+
}
228+
else
229+
{
230+
return true;
231+
}
232+
}
182233
};
183234
}
184235

src/AppInstallerCLICore/ExecutionReporter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ namespace AppInstaller::CLI::Execution
4848
Reporter::Reporter(const Reporter& other, clone_t) :
4949
Reporter(other.m_out, other.m_in)
5050
{
51+
SetChannel(other.m_channel);
52+
5153
if (other.m_style.has_value())
5254
{
5355
SetStyle(*other.m_style);

src/AppInstallerRepositoryCore/PackageVersionSelection.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "pch.h"
44
#include "Public/winget/PackageVersionSelection.h"
55
#include "Public/winget/RepositorySource.h"
6+
#include "Public/winget/PinningData.h"
67

78

89
namespace AppInstaller::Repository
@@ -154,4 +155,55 @@ namespace AppInstaller::Repository
154155
{
155156
return GetAvailablePackageFromSource(composite->GetAvailable(), sourceIdentifier);
156157
}
158+
159+
DefaultInstallVersionData GetDefaultInstallVersion(const std::shared_ptr<ICompositePackage>& composite)
160+
{
161+
using namespace AppInstaller::Pinning;
162+
163+
DefaultInstallVersionData result;
164+
165+
auto installedVersion = AppInstaller::Repository::GetInstalledVersion(composite);
166+
auto availableVersions = AppInstaller::Repository::GetAvailableVersionsForInstalledVersion(composite, installedVersion);
167+
168+
PinningData pinningData{ PinningData::Disposition::ReadOnly };
169+
auto evaluator = pinningData.CreatePinStateEvaluator(PinBehavior::ConsiderPins, installedVersion);
170+
171+
AppInstaller::CLI::Execution::COMContext context;
172+
AppInstaller::Repository::IPackageVersion::Metadata installationMetadata =
173+
installedVersion ? installedVersion->GetMetadata() : AppInstaller::Repository::IPackageVersion::Metadata{};
174+
AppInstaller::CLI::Workflow::ManifestComparator manifestComparator{ context, installationMetadata };
175+
176+
auto availableVersionKeys = availableVersions->GetVersionKeys();
177+
for (const auto& availableVersionKey : availableVersionKeys)
178+
{
179+
auto availableVersion = availableVersions->GetVersion(availableVersionKey);
180+
181+
if (installedVersion && !evaluator.IsUpdate(availableVersion))
182+
{
183+
// Version too low or different channel for upgrade
184+
continue;
185+
}
186+
187+
if (evaluator.EvaluatePinType(availableVersion) != AppInstaller::Pinning::PinType::Unknown)
188+
{
189+
// Pinned
190+
continue;
191+
}
192+
193+
auto manifestComparatorResult = manifestComparator.GetPreferredInstaller(availableVersion->GetManifest());
194+
if (!manifestComparatorResult.installer.has_value())
195+
{
196+
// No applicable installer
197+
continue;
198+
}
199+
200+
result.LatestApplicableVersion = availableVersion;
201+
if (installedVersion)
202+
{
203+
result.UpdateAvailable = true;
204+
}
205+
206+
break;
207+
}
208+
}
157209
}

src/AppInstallerRepositoryCore/Public/winget/PackageVersionSelection.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,13 @@ namespace AppInstaller::Repository
2525

2626
// Gets the available IPackage corresponding to the given source identifier.
2727
std::shared_ptr<IPackage> GetAvailablePackageFromSource(const std::shared_ptr<ICompositePackage>& composite, const std::string_view sourceIdentifier);
28+
29+
struct DefaultInstallVersionData
30+
{
31+
std::shared_ptr<AppInstaller::Repository::IPackageVersion> LatestApplicableVersion;
32+
bool UpdateAvailable = false;
33+
};
34+
35+
// Determines the default install version and whether an update is available.
36+
DefaultInstallVersionData GetDefaultInstallVersion(const std::shared_ptr<ICompositePackage>& composite);
2837
}

src/Microsoft.Management.Deployment/CatalogPackage.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ namespace winrt::Microsoft::Management::Deployment::implementation
7474
{
7575
using namespace AppInstaller::Pinning;
7676

77-
auto availableVersions = AppInstaller::Repository::GetAvailableVersionsForInstalledVersion(m_package);
7877
auto installedVersion = AppInstaller::Repository::GetInstalledVersion(m_package);
78+
auto availableVersions = AppInstaller::Repository::GetAvailableVersionsForInstalledVersion(m_package, installedVersion);
7979

8080
PinningData pinningData{ PinningData::Disposition::ReadOnly };
8181
auto evaluator = pinningData.CreatePinStateEvaluator(PinBehavior::ConsiderPins, installedVersion);

0 commit comments

Comments
 (0)