Skip to content

Commit b82ff41

Browse files
authored
Fix Cloudsmith query (#315)
***NO_CI***
1 parent b56ec8b commit b82ff41

File tree

2 files changed

+75
-57
lines changed

2 files changed

+75
-57
lines changed

nanoFirmwareFlasher.Library/FirmwarePackage.cs

Lines changed: 48 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -147,74 +147,75 @@ protected FirmwarePackage(
147147
/// <param name="verbosity">VerbosityLevel to use when outputting progress and error messages.</param>
148148
/// <returns>List of <see cref="CloudSmithPackageDetail"/> with details on target firmware packages.</returns>
149149
public static List<CloudSmithPackageDetail> GetTargetList(
150-
bool communityTargets,
151-
bool preview,
152-
SupportedPlatform? platform,
153-
VerbosityLevel verbosity)
150+
bool communityTargets,
151+
bool preview,
152+
SupportedPlatform? platform,
153+
VerbosityLevel verbosity)
154154
{
155155
string repoName = communityTargets ? CommunityTargetsRepo : preview ? RefTargetsDevRepo : RefTargetsStableRepo;
156156

157157
// NOTE: the query seems to be the opposite, it should be LESS THAN.
158158
// this has been reported to Cloudsmith and it's being checked. Maybe need to revisit this if changes are made in their API.
159159
// Because new stable releases are published on a regular basis and preview very rarely, we query for stable versions published in past month and preview versions published during the past 6 months.
160-
string requestUri = $"{repoName}/?page_size=500&q=uploaded:'>{(preview ? "6" : "1")} month ago' {(platform.HasValue ? "AND tag:" + platform.Value : "")}";
160+
// This is a paged query with page size 100 to improve performance.
161+
string requestUri = $"{repoName}/?page_size=100&q=uploaded:'>{(preview ? "6" : "1")} month ago' {(platform.HasValue ? "AND tag:" + platform.Value : "")}";
161162

162163
List<CloudSmithPackageDetail> targetPackages = [];
164+
int page = 1;
165+
bool morePages = true;
163166

164-
if (verbosity > VerbosityLevel.Normal)
167+
while (morePages)
165168
{
166-
OutputWriter.ForegroundColor = ConsoleColor.White;
167-
168-
OutputWriter.Write($"Listing {platform} targets from '{repoName}' repository");
169-
170-
if (!communityTargets)
169+
if (verbosity > VerbosityLevel.Normal)
171170
{
172-
if (preview)
173-
{
174-
OutputWriter.Write(" [PREVIEW]");
175-
}
176-
else
171+
OutputWriter.ForegroundColor = ConsoleColor.White;
172+
OutputWriter.Write($"Listing {platform} targets from '{repoName}' repository, page {page}...");
173+
174+
if (!communityTargets)
177175
{
178-
OutputWriter.Write(" [STABLE]");
176+
if (preview)
177+
{
178+
OutputWriter.Write(" [PREVIEW]");
179+
}
180+
else
181+
{
182+
OutputWriter.Write(" [STABLE]");
183+
}
179184
}
180-
}
181185

182-
OutputWriter.WriteLine("...");
183-
}
184-
185-
HttpResponseMessage response = s_cloudsmithClient.GetAsync(requestUri).GetAwaiter().GetResult();
186+
OutputWriter.WriteLine("...");
187+
}
186188

187-
string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
189+
HttpResponseMessage response = s_cloudsmithClient.GetAsync($"{requestUri}&page={page}").GetAwaiter().GetResult();
190+
string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
188191

189-
// check for empty array
190-
if (responseBody == "[]")
191-
{
192-
if (verbosity > VerbosityLevel.Quiet)
192+
if (responseBody == "[]" || responseBody.Contains("\"Invalid page.\""))
193193
{
194-
OutputWriter.WriteLine("");
194+
morePages = false;
195+
continue;
195196
}
196197

197-
// can't find this target
198-
return targetPackages;
198+
var options = new JsonSerializerOptions
199+
{
200+
PropertyNameCaseInsensitive = true,
201+
};
202+
203+
List<CloudSmithPackageDetailJson> deserializedPackages = JsonSerializer.Deserialize<List<CloudSmithPackageDetailJson>>(responseBody, options);
204+
targetPackages.AddRange(from p in deserializedPackages
205+
select new CloudSmithPackageDetail()
206+
{
207+
Name = p.Name,
208+
Version = p.Version,
209+
Platform = p.Tags?.Info is null
210+
? null
211+
: (from t in p.Tags.Info
212+
where s_supportedPlatforms.Contains(t)
213+
select t).FirstOrDefault(),
214+
});
215+
216+
page++;
199217
}
200218

201-
var options = new JsonSerializerOptions
202-
{
203-
PropertyNameCaseInsensitive = true,
204-
};
205-
206-
List<CloudSmithPackageDetailJson> deserializedPackages = JsonSerializer.Deserialize<List<CloudSmithPackageDetailJson>>(responseBody, options);
207-
targetPackages.AddRange(from p in deserializedPackages
208-
select new CloudSmithPackageDetail()
209-
{
210-
Name = p.Name,
211-
Version = p.Version,
212-
Platform = p.Tags?.Info is null
213-
? null
214-
: (from t in p.Tags.Info
215-
where s_supportedPlatforms.Contains(t)
216-
select t).FirstOrDefault(),
217-
});
218219
return targetPackages;
219220
}
220221

nanoFirmwareFlasher.Tests/FirmwarePackageTests.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,28 @@ public void FirmwarePackage_ListReferenceTargets()
2323
using var output = new OutputWriterHelper();
2424

2525
#region Get the stable packages
26-
List<CloudSmithPackageDetail> stable = FirmwarePackage.GetTargetList(false, false, null, VerbosityLevel.Diagnostic);
26+
27+
List<CloudSmithPackageDetail> stable = FirmwarePackage.GetTargetList(
28+
false,
29+
false,
30+
null,
31+
VerbosityLevel.Diagnostic);
32+
2733
Assert.IsNotNull(stable);
2834
Assert.AreNotEqual(0, stable.Count);
29-
output.AssertAreEqual("Listing targets from 'nanoframework-images' repository [STABLE]...");
35+
3036
#endregion
3137

3238
#region Get the preview packages
39+
3340
output.Reset();
34-
List<CloudSmithPackageDetail> preview = FirmwarePackage.GetTargetList(false, true, null, VerbosityLevel.Quiet);
41+
List<CloudSmithPackageDetail> preview = FirmwarePackage.GetTargetList(
42+
false,
43+
true,
44+
null,
45+
VerbosityLevel.Quiet);
46+
3547
Assert.IsNotNull(preview);
36-
output.AssertAreEqual("");
3748

3849
// Assert that the preview packages are not part of the stable package list
3950
foreach (CloudSmithPackageDetail previewPackage in preview)
@@ -42,25 +53,31 @@ public void FirmwarePackage_ListReferenceTargets()
4253
where s.Name == previewPackage.Name && s.Version == previewPackage.Version
4354
select s).Any());
4455
}
56+
4557
#endregion
4658

4759
#region Get the stable esp32 packages
60+
4861
output.Reset();
49-
List<CloudSmithPackageDetail> stableEsp32 = FirmwarePackage.GetTargetList(false, false, SupportedPlatform.esp32, VerbosityLevel.Diagnostic);
62+
List<CloudSmithPackageDetail> stableEsp32 = FirmwarePackage.GetTargetList(
63+
false,
64+
false,
65+
SupportedPlatform.esp32,
66+
VerbosityLevel.Diagnostic);
67+
5068
Assert.IsNotNull(stableEsp32);
5169
Assert.AreNotEqual(0, stableEsp32.Count);
52-
output.AssertAreEqual("Listing esp32 targets from 'nanoframework-images' repository [STABLE]...");
5370

5471
// Assert that there are more stable packages than for the esp32
5572
Assert.IsTrue(stableEsp32.Count < stable.Count);
5673

5774
// Assert that all esp32 packages are in the stable list
5875
foreach (CloudSmithPackageDetail esp32Package in stableEsp32)
5976
{
60-
Assert.IsTrue((from s in stable
61-
where s.Name == esp32Package.Name && s.Version == esp32Package.Version
62-
select s).Any());
77+
Assert.IsTrue(stable.Any(s => s.Name == esp32Package.Name && s.Version == esp32Package.Version),
78+
$"Package {esp32Package.Name} with version {esp32Package.Version} is not in the stable list.");
6379
}
80+
6481
#endregion
6582
}
6683

@@ -74,7 +91,7 @@ public void FirmwarePackage_ListCommunityTargets()
7491
List<CloudSmithPackageDetail> stable = FirmwarePackage.GetTargetList(true, false, null, VerbosityLevel.Diagnostic);
7592
Assert.IsNotNull(stable);
7693
Assert.AreNotEqual(0, stable.Count);
77-
output.AssertAreEqual("Listing targets from 'nanoframework-images-community-targets' repository...");
94+
7895
#endregion
7996

8097
#region Get the stable esp32 packages

0 commit comments

Comments
 (0)