Skip to content
This repository has been archived by the owner on Jul 5, 2024. It is now read-only.

Commit

Permalink
Add channel support to differentiate runtimes.
Browse files Browse the repository at this point in the history
  • Loading branch information
caesay committed Dec 19, 2023
1 parent 9718cf5 commit a1d9734
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 137 deletions.
88 changes: 46 additions & 42 deletions src/Squirrel.Csq/Commands/OsxReleasifyCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ public class OsxReleasifyCommand : BaseCommand

public string NotaryProfile { get; private set; }

public string Channel { get; private set; }

public OsxReleasifyCommand()
: base("releasify", "Converts an application bundle into a Squirrel release and installer.")
{
Expand All @@ -49,47 +51,49 @@ public OsxReleasifyCommand()
AddOption<bool>((v) => NoDelta = v, "--noDelta")
.SetDescription("Skip the generation of delta packages.");

if (SquirrelRuntimeInfo.IsOSX) {
AddOption<bool>((v) => NoPackage = v, "--noPkg")
.SetDescription("Skip generating a .pkg installer.");

AddOption<FileInfo>((v) => PackageWelcome = v.ToFullNameOrNull(), "--pkgWelcome")
.SetDescription("Set the installer package welcome content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageReadme = v.ToFullNameOrNull(), "--pkgReadme")
.SetDescription("Set the installer package readme content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageLicense = v.ToFullNameOrNull(), "--pkgLicense")
.SetDescription("Set the installer package license content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageConclusion = v.ToFullNameOrNull(), "--pkgConclusion")
.SetDescription("Set the installer package conclusion content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<string>((v) => SigningAppIdentity = v, "--signAppIdentity")
.SetDescription("The subject name of the cert to use for app code signing.")
.SetArgumentHelpName("SUBJECT");

AddOption<string>((v) => SigningInstallIdentity = v, "--signInstallIdentity")
.SetDescription("The subject name of the cert to use for installation packages.")
.SetArgumentHelpName("SUBJECT");

AddOption<FileInfo>((v) => SigningEntitlements = v.ToFullNameOrNull(), "--signEntitlements")
.SetDescription("Path to entitlements file for hardened runtime signing.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly()
.RequiresExtension(".entitlements");

AddOption<string>((v) => NotaryProfile = v, "--notaryProfile")
.SetDescription("Name of profile containing Apple credentials stored with notarytool.")
.SetArgumentHelpName("NAME");
}
AddOption<string>((v) => Channel = v, "-c", "--channel")
.SetDescription("Release channel to use when creating the package.")
.SetArgumentHelpName("NAME");

AddOption<bool>((v) => NoPackage = v, "--noPkg")
.SetDescription("Skip generating a .pkg installer.");

AddOption<FileInfo>((v) => PackageWelcome = v.ToFullNameOrNull(), "--pkgWelcome")
.SetDescription("Set the installer package welcome content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageReadme = v.ToFullNameOrNull(), "--pkgReadme")
.SetDescription("Set the installer package readme content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageLicense = v.ToFullNameOrNull(), "--pkgLicense")
.SetDescription("Set the installer package license content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<FileInfo>((v) => PackageConclusion = v.ToFullNameOrNull(), "--pkgConclusion")
.SetDescription("Set the installer package conclusion content.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly();

AddOption<string>((v) => SigningAppIdentity = v, "--signAppIdentity")
.SetDescription("The subject name of the cert to use for app code signing.")
.SetArgumentHelpName("SUBJECT");

AddOption<string>((v) => SigningInstallIdentity = v, "--signInstallIdentity")
.SetDescription("The subject name of the cert to use for installation packages.")
.SetArgumentHelpName("SUBJECT");

AddOption<FileInfo>((v) => SigningEntitlements = v.ToFullNameOrNull(), "--signEntitlements")
.SetDescription("Path to entitlements file for hardened runtime signing.")
.SetArgumentHelpName("PATH")
.AcceptExistingOnly()
.RequiresExtension(".entitlements");

AddOption<string>((v) => NotaryProfile = v, "--notaryProfile")
.SetDescription("Name of profile containing Apple credentials stored with notarytool.")
.SetArgumentHelpName("NAME");
}
}
6 changes: 6 additions & 0 deletions src/Squirrel.Csq/Commands/WindowsReleasifyCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public class WindowsReleasifyCommand : WindowsSigningCommand

public string EntryExecutableName { get; private set; }

public string Channel { get; private set; }

public WindowsReleasifyCommand()
: this("releasify", "Take an existing nuget package and convert it into a Squirrel release.")
{
Expand Down Expand Up @@ -55,5 +57,9 @@ protected WindowsReleasifyCommand(string name, string description)
.SetDescription("The file name of the main/entry executable.")
.SetArgumentHelpName("NAME")
.SetRequired();

AddOption<string>((v) => Channel = v, "-c", "--channel")
.SetDescription("Release channel to use when creating the package.")
.SetArgumentHelpName("NAME");
}
}
36 changes: 29 additions & 7 deletions src/Squirrel.Packaging.OSX/Commands/OsxReleasifyCommandRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,29 @@ public void Releasify(OsxReleasifyOptions options)
{
var releaseDir = options.ReleaseDir;

// parse releases in curent channel, and if there are any that don't match the current rid we should bail
var releaseFilePath = Path.Combine(releaseDir.FullName, "RELEASES");
if (!String.IsNullOrWhiteSpace(options.Channel))
releaseFilePath = Path.Combine(releaseDir.FullName, $"RELEASES-{options.Channel}");

var previousReleases = new List<ReleaseEntry>();
if (File.Exists(releaseFilePath)) {
previousReleases.AddRange(ReleaseEntry.ParseReleaseFile(File.ReadAllText(releaseFilePath, Encoding.UTF8)));
}

var mismatchedRid = previousReleases
.Select(p => p.Rid)
.Where(p => p != options.TargetRuntime)
.Distinct()
.Select(p => p.ToString())
.ToArray();

if (mismatchedRid.Any()) {
var message = $"Previous releases were built for a different runtime ({String.Join(", ", mismatchedRid)}) " +
$"than the current one. Please use the same runtime for all releases in a channel.";
throw new ArgumentException(message);
}

var appBundlePath = options.BundleDirectory;
_logger.Info("Creating Squirrel application from app bundle at: " + appBundlePath);

Expand Down Expand Up @@ -90,37 +113,36 @@ public void Releasify(OsxReleasifyOptions options)
var nuget = new NugetConsole(_logger);
var nupkgPath = nuget.CreatePackageFromNuspecPath(tmp, appBundlePath, nuspecPath);

var releaseFilePath = Path.Combine(releaseDir.FullName, "RELEASES");
var releases = new Dictionary<string, ReleaseEntry>();

ReleaseEntry.BuildReleasesFile(releaseDir.FullName);
foreach (var rel in ReleaseEntry.ParseReleaseFile(File.ReadAllText(releaseFilePath, Encoding.UTF8))) {
releases[rel.Filename] = rel;
releases[rel.OriginalFilename] = rel;
}

var rp = new ReleasePackageBuilder(_logger, nupkgPath);
var suggestedName = ReleasePackageBuilder.GetSuggestedFileName(packId, packVersion, options.TargetRuntime.StringWithNoVersion);
var suggestedName = new ReleaseEntryName(packId, SemanticVersion.Parse(packVersion), false, options.TargetRuntime).ToFileName();
var newPkgPath = rp.CreateReleasePackage((i, pkg) => Path.Combine(releaseDir.FullName, suggestedName));

_logger.Info("Creating Delta Packages");
var prev = ReleasePackageBuilder.GetPreviousRelease(_logger, releases.Values, rp, releaseDir.FullName, options.TargetRuntime);
var prev = ReleasePackageBuilder.GetPreviousRelease(_logger, releases.Values, rp, releaseDir.FullName);
if (prev != null && !options.NoDelta) {
var deltaBuilder = new DeltaPackageBuilder(_logger);
var deltaFile = rp.ReleasePackageFile.Replace("-full", "-delta");
var dp = deltaBuilder.CreateDeltaPackage(prev, rp, deltaFile);
var deltaEntry = ReleaseEntry.GenerateFromFile(deltaFile);
releases[deltaEntry.Filename] = deltaEntry;
releases[deltaEntry.OriginalFilename] = deltaEntry;
}

var fullEntry = ReleaseEntry.GenerateFromFile(newPkgPath);
releases[fullEntry.Filename] = fullEntry;
releases[fullEntry.OriginalFilename] = fullEntry;

ReleaseEntry.WriteReleaseFile(releases.Values, releaseFilePath);

// create installer package, sign and notarize
if (!options.NoPackage) {
if (SquirrelRuntimeInfo.IsOSX) {
var pkgPath = Path.Combine(releaseDir.FullName, $"{packId}-{options.TargetRuntime.StringWithNoVersion}.pkg");
var pkgPath = Path.Combine(releaseDir.FullName, $"{packId}-Setup-[{options.TargetRuntime.ToDisplay(RidDisplayType.NoVersion)}].pkg");

Dictionary<string, string> pkgContent = new() {
{"welcome", options.PackageWelcome },
Expand Down
2 changes: 2 additions & 0 deletions src/Squirrel.Packaging.OSX/Commands/OsxReleasifyOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,6 @@ public class OsxReleasifyOptions
public string SigningEntitlements { get; set; }

public string NotaryProfile { get; set; }

public string Channel { get; set; }
}
Loading

0 comments on commit a1d9734

Please sign in to comment.