Skip to content

Commit

Permalink
Merge pull request #1103 from opentap/1102-hide-unlisted
Browse files Browse the repository at this point in the history
Hide unlisted packages in list action
  • Loading branch information
Denrask committed Apr 25, 2023
2 parents 866ccdc + 04af816 commit 75f020a
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 87 deletions.
35 changes: 25 additions & 10 deletions Package/IPackageRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,29 @@ public interface IPackageRepository
[DebuggerDisplay("{Name} : {Version.ToString()}")]
public class PackageVersion : PackageIdentifier, IEquatable<PackageVersion>
{
internal bool IsUnlisted { get; private set; }
internal static PackageVersion FromDictionary(Dictionary<string, object> dict)
{
var name = dict["Name"] as string;
Enum.TryParse(dict["Architecture"] as string, out CpuArchitecture arch);
var version = SemanticVersion.Parse(dict["Version"] as string);
var os = dict["OS"] as string;
var date = (DateTime)dict["Date"];
var licenses = new List<string>();
if (dict.TryGetValue("LicenseRequired", out var licenseRequired))
{
if (licenseRequired is string license)
licenses.Add(license);
else if (licenseRequired is string[] licenseArray)
licenses.AddRange(licenseArray);
}

return new PackageVersion(name, version, os, arch, date, licenses)
{
IsUnlisted = dict.TryGetValue("IsUnlisted", out var unlisted) && unlisted is bool b && b
};
}

/// <summary>
/// Initializes a new instance of a PackageVersion.
/// </summary>
Expand Down Expand Up @@ -159,21 +182,13 @@ static void ParallelTryForEach<TSource>(IEnumerable<TSource> source, Action<TSou
PackageSpecifier id, params IPackageIdentifier[] compatibleWith)
{
var list = new List<PackageDef>();
var version = id.Version == VersionSpecifier.AnyRelease ? "" : id.Version.ToString();

ParallelTryForEach(repositories, repo =>
{
if (repo is HttpPackageRepository httprepo)
{
var parameters = new Dictionary<string, object>()
{
["type"] = "TapPackage",
["distinctName"] = true,
["directory"] = "/Packages/",
["version"] = version,
["os"] = id.OS,
["architecture"] = id.Architecture.ToString()
};
var parameters = HttpPackageRepository.GetQueryParameters(version: id.Version, os: id.OS,
architecture: id.Architecture, distinctName: true);
var repoClient = HttpPackageRepository.GetAuthenticatedClient(new Uri(httprepo.Url, UriKind.Absolute));
var result = repoClient.Query(parameters, CancellationToken.None, "name", "version");
Expand Down
14 changes: 4 additions & 10 deletions Package/Image/PackageDependencyQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,10 @@ static class PackageDependencyQuery
{
var sw = Stopwatch.StartNew();
var repoClient = HttpPackageRepository.GetAuthenticatedClient(new Uri(repoUrl, UriKind.Absolute));
var parameters = new Dictionary<string, object>()
{
["type"] = "TapPackage",
["directory"] = "/Packages/",
["version"] = preRelease,
["os"] = os,
["architecture"] = deploymentInstallationArchitecture.ToString()
};
if (name != null)
parameters["name"] = name;

var parameters = HttpPackageRepository.GetQueryParameters(version: VersionSpecifier.TryParse(preRelease, out var spec) ? spec : VersionSpecifier.AnyRelease, os: os,
architecture: deploymentInstallationArchitecture, name: name);

var result = repoClient.Query(parameters, CancellationToken.None, "name", "version",
new QuerySelection("dependencies", new List<QuerySelection>() { "name", "version" }));
var graph = new PackageDependencyGraph();
Expand Down
4 changes: 2 additions & 2 deletions Package/PackageActionHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ static class PackageActionHelpers
}


internal static List<PackageDef> GatherPackagesAndDependencyDefs(Installation installation, PackageSpecifier[] pkgRefs, string[] packageNames, string Version, CpuArchitecture arch, string OS, List<IPackageRepository> repositories,
bool force, bool includeDependencies, bool ignoreDependencies, bool askToIncludeDependencies, bool noDowngrade)
internal static List<PackageDef> GatherPackagesAndDependencyDefs(Installation installation, PackageSpecifier[] pkgRefs, string[] packageNames,
string Version, CpuArchitecture arch, string OS, List<IPackageRepository> repositories, bool force, bool noDowngrade)
{
List<PackageDef> directlyReferencesPackages = new List<PackageDef>();

Expand Down
2 changes: 1 addition & 1 deletion Package/PackageActions/Download.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ protected override int LockedExecute(CancellationToken cancellationToken)

List<PackageDef> PackagesToDownload = PackageActionHelpers.GatherPackagesAndDependencyDefs(
destinationInstallation, PackageReferences, Packages, Version, Architecture, OS, repositories,
ForceInstall, InstallDependencies, false, false, false);
ForceInstall, false);

if (PackagesToDownload?.Any() != true)
return (int)ExitCodes.ArgumentError;
Expand Down
6 changes: 3 additions & 3 deletions Package/PackageActions/Install.cs
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ private int DoExecute(CancellationToken cancellationToken)
{
packagesToInstall = PackageActionHelpers.GatherPackagesAndDependencyDefs(
targetInstallation, PackageReferences, Packages, Version, Architecture, OS, repositories, Force,
InstallDependencies, Force, askToInstallDependencies, NoDowngrade);
NoDowngrade);
}
catch (ImageResolveException ex) when (ex.Result is FailedImageResolution fir)
{
Expand All @@ -189,8 +189,8 @@ private int DoExecute(CancellationToken cancellationToken)
try
{
packagesToInstall = PackageActionHelpers.GatherPackagesAndDependencyDefs(
targetInstallation, PackageReferences, Packages, "beta", Architecture, OS, repositories, Force,
InstallDependencies, Force, askToInstallDependencies, NoDowngrade);
targetInstallation, PackageReferences, Packages, "beta", Architecture, OS, repositories,
Force, NoDowngrade);
}
catch
{
Expand Down
8 changes: 4 additions & 4 deletions Package/PackageActions/List.cs
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ protected override int LockedExecute(CancellationToken cancellationToken)

if (All)
{
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name).Distinct().ToList();
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name).Where(v => v.IsUnlisted == false).Distinct().ToList();
var versionsCount = versions.Count;
if (versionsCount == 0) // No versions
{
Expand All @@ -140,13 +140,13 @@ protected override int LockedExecute(CancellationToken cancellationToken)
else
{
var opentap = new Installation(Target).GetOpenTapPackage();
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name, opentap).Distinct().ToList();
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name, opentap).Where(v => v.IsUnlisted == false).Distinct().ToList();

versions = versions.Where(s => s.IsPlatformCompatible(Architecture, OS)).ToList();
versions = versions.Where(s => s.IsUnlisted == false && s.IsPlatformCompatible(Architecture, OS)).ToList();

if (versions.Any() == false) // No compatible versions
{
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name).ToList();
versions = PackageRepositoryHelpers.GetAllVersionsFromAllRepos(repositories, Name).Where(v => v.IsUnlisted == false).ToList();
if (versions.Any())
{
log.Warning($"There are no compatible versions of '{Name}'.");
Expand Down
100 changes: 43 additions & 57 deletions Package/Repositories/HttpPackageRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ public void DownloadPackage(IPackageIdentifier package, string destination, Canc
}

/// <summary>
/// Get the names of the available packages in the repository
/// Get the names of the available packages in the repository. Unlisted packages are not included
/// </summary>
/// <param name="cancellationToken"></param>
/// <param name="compatibleWith"></param>
Expand All @@ -350,17 +350,46 @@ public string[] GetPackageNames(CancellationToken cancellationToken, params IPac
{
if (IsInError()) return Array.Empty<string>();

var parameters = new Dictionary<string, object>()
{
["type"] = "TapPackage",
["distinctName"] = true,
["directory"] = "/Packages/",
};

var parameters = GetQueryParameters(includeUnlisted: false);
var packages = RepoClient.Query(parameters, cancellationToken, "Name");
return packages.Select(p => p["Name"] as string).ToArray();
}

internal static Dictionary<string, object> GetQueryParameters(
string type = "TapPackage",
string directory = "/Packages/",
string name = null,
string os = null,
string @class = null,
bool distinctName = false,
bool includeUnlisted = true,
VersionSpecifier version = null,
CpuArchitecture architecture = CpuArchitecture.Unspecified)
{
var parameters = new Dictionary<string, object>();

if (type != null)
parameters["type"] = type;
if (directory != null)
parameters["directory"] = directory;
if (includeUnlisted == false)
parameters["IsUnlisted"] = false;
if (name != null)
parameters["name"] = name;
if (version != null && version != VersionSpecifier.AnyRelease)
parameters["version"] = version.ToString();
if (architecture != CpuArchitecture.Unspecified && architecture != CpuArchitecture.AnyCPU)
parameters["architecture"] = architecture.ToString();
if (os != null)
parameters["os"] = os;
if (@class != null)
parameters["class"] = @class;
if (distinctName)
parameters["distinctName"] = true;

return parameters;
}

/// <summary>
/// Get the names of the available packages in the repository with the specified class
/// </summary>
Expand All @@ -369,12 +398,7 @@ public string[] GetPackageNames(CancellationToken cancellationToken, params IPac
public string[] GetPackageNames(string @class, CancellationToken cancellationToken, params IPackageIdentifier[] compatibleWith)
{
if (IsInError()) return Array.Empty<string>();
var parameters = new Dictionary<string, object>()
{
["class"] = @class,
["distinctName"] = true,
["directory"] = "/Packages/",
};
var parameters = GetQueryParameters(@class: @class, distinctName: true);

var packages = RepoClient.Query(parameters, cancellationToken, "Name");
return packages.Select(p => p["Name"] as string).ToArray();
Expand All @@ -393,33 +417,11 @@ public PackageVersion[] GetPackageVersions(string packageName, CancellationToken
CheckRepoApiVersion();
if (IsInError()) return Array.Empty<PackageVersion>();

var parameters = new Dictionary<string, object>()
{
["type"] = "TapPackage",
["name"] = packageName,
["directory"] = "/Packages/",
};
var parameters = GetQueryParameters(name: packageName);

var packageVersions = RepoClient.Query(parameters, cancellationToken, "Name", "Version", "OS", "Architecture", "LicenseRequired", "Date");
var packageVersions = RepoClient.Query(parameters, cancellationToken, "Name", "IsUnlisted", "Version", "OS", "Architecture", "LicenseRequired", "Date");

return packageVersions.Select(p =>
{
var name = p["Name"] as string;
Enum.TryParse(p["Architecture"] as string, out CpuArchitecture arch);
var version = SemanticVersion.Parse(p["Version"] as string);
var os = p["OS"] as string;
var date = (DateTime)p["Date"];
var licenses = new List<string>();
if (p.TryGetValue("LicenseRequired", out var licenseRequired))
{
if (licenseRequired is string license)
licenses.Add(license);
else if (licenseRequired is string[] licenseArray)
licenses.AddRange(licenseArray);
}
return new PackageVersion(name, version, os, arch, date, licenses);
}).ToArray();
return packageVersions.Select(PackageVersion.FromDictionary).ToArray();
}

/// <summary>
Expand All @@ -434,24 +436,8 @@ public PackageVersion[] GetPackageVersions(string packageName, CancellationToken
{
if (IsInError()) return Array.Empty<PackageDef>();

var parameters = new Dictionary<string, object>()
{
["type"] = "TapPackage",
["directory"] = "/Packages/",
["distinctName"] = true,
};

if (!string.IsNullOrWhiteSpace(package.Name))
{
parameters["name"] = package.Name;
}

if (package.Version != VersionSpecifier.AnyRelease)
parameters["version"] = package.Version.ToString();
if (!string.IsNullOrWhiteSpace(package.OS))
parameters["os"] = package.OS;
if (package.Architecture != CpuArchitecture.AnyCPU)
parameters["architecture"] = package.Architecture.ToString();
var parameters = GetQueryParameters(name: package.Name, version: package.Version, os: package.OS,
architecture: package.Architecture);

var packages = RepoClient.Query(parameters, cancellationToken, "PackageDef");
return packages.Select(p => p["PackageDef"] as string).Where(xml => !string.IsNullOrWhiteSpace(xml))
Expand Down

0 comments on commit 75f020a

Please sign in to comment.