feat(releases): add SelfUpdater installer-asset matching
This commit is contained in:
3
src/ClaudeDo.Releases/SelfUpdateResult.cs
Normal file
3
src/ClaudeDo.Releases/SelfUpdateResult.cs
Normal file
@@ -0,0 +1,3 @@
|
||||
namespace ClaudeDo.Releases;
|
||||
|
||||
public sealed record InstallerAssetMatch(ReleaseAsset Asset, string Version);
|
||||
22
src/ClaudeDo.Releases/SelfUpdater.cs
Normal file
22
src/ClaudeDo.Releases/SelfUpdater.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace ClaudeDo.Releases;
|
||||
|
||||
public static partial class SelfUpdater
|
||||
{
|
||||
[GeneratedRegex(@"^ClaudeDo\.Installer-(?<version>[\d\.]+)\.exe$", RegexOptions.IgnoreCase)]
|
||||
private static partial Regex InstallerAssetRegex();
|
||||
|
||||
public static InstallerAssetMatch? FindInstallerAsset(IEnumerable<ReleaseAsset> assets)
|
||||
{
|
||||
foreach (var asset in assets)
|
||||
{
|
||||
var m = InstallerAssetRegex().Match(asset.Name);
|
||||
if (m.Success)
|
||||
{
|
||||
return new InstallerAssetMatch(asset, m.Groups["version"].Value);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
44
tests/ClaudeDo.Releases.Tests/SelfUpdaterTests.cs
Normal file
44
tests/ClaudeDo.Releases.Tests/SelfUpdaterTests.cs
Normal file
@@ -0,0 +1,44 @@
|
||||
namespace ClaudeDo.Releases.Tests;
|
||||
|
||||
public class SelfUpdaterAssetMatchingTests
|
||||
{
|
||||
[Fact]
|
||||
public void FindInstallerAsset_PicksInstallerExeByPattern()
|
||||
{
|
||||
var assets = new[]
|
||||
{
|
||||
new ReleaseAsset("ClaudeDo-0.3.0-win-x64.zip", "https://x/app.zip", 10),
|
||||
new ReleaseAsset("ClaudeDo.Installer-0.3.0.exe", "https://x/inst.exe", 20),
|
||||
new ReleaseAsset("checksums.txt", "https://x/checks", 1),
|
||||
};
|
||||
|
||||
var result = SelfUpdater.FindInstallerAsset(assets);
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Equal("ClaudeDo.Installer-0.3.0.exe", result!.Asset.Name);
|
||||
Assert.Equal("0.3.0", result.Version);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FindInstallerAsset_ReturnsNullWhenAbsent()
|
||||
{
|
||||
var assets = new[]
|
||||
{
|
||||
new ReleaseAsset("ClaudeDo-0.3.0-win-x64.zip", "https://x/app.zip", 10),
|
||||
};
|
||||
|
||||
Assert.Null(SelfUpdater.FindInstallerAsset(assets));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FindInstallerAsset_IgnoresAppZipThatContainsInstaller()
|
||||
{
|
||||
var assets = new[]
|
||||
{
|
||||
new ReleaseAsset("ClaudeDo.Installer.Portable-0.3.0.zip", "https://x/1", 1),
|
||||
new ReleaseAsset("not-the-installer.exe", "https://x/2", 1),
|
||||
};
|
||||
|
||||
Assert.Null(SelfUpdater.FindInstallerAsset(assets));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user