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

Commit

Permalink
Add github-up sync command
Browse files Browse the repository at this point in the history
  • Loading branch information
caesay committed Aug 20, 2022
1 parent 1477f21 commit 4c20e31
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/Squirrel.CommandLine/Squirrel.CommandLine.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<ItemGroup>
<PackageReference Include="AWSSDK.S3" Version="3.7.9.41" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="Octokit" Version="2.0.1" />
<PackageReference Include="System.IO" Version="4.3.0" />
<PackageReference Include="System.Net.Http" Version="4.3.4" />
<PackageReference Include="System.Security.Cryptography.Algorithms" Version="4.3.1" />
Expand Down
1 change: 1 addition & 0 deletions src/Squirrel.CommandLine/SquirrelHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public static int Main(string[] args)
{ "s3-down", "Download latest release from S3 API", new SyncS3Options(), o => Download(new S3Repository(o)) },
{ "s3-up", "Upload releases to S3 API", new SyncS3Options(), o => Upload(new S3Repository(o)) },
{ "github-down", "Download latest release from GitHub", new SyncGithubOptions(), o => Download(new GitHubRepository(o)) },
{ "github-up", "Upload latest release to GitHub", new SyncGithubOptions(), o => Upload(new GitHubRepository(o)) },
};

if (verbose) {
Expand Down
92 changes: 88 additions & 4 deletions src/Squirrel.CommandLine/Sync/GitHubRepository.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using System;
using System;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Octokit;
using Squirrel.SimpleSplat;
using Squirrel.Sources;

Expand Down Expand Up @@ -60,9 +62,91 @@ public async Task DownloadRecentPackages()
Log.Info("Done.");
}

public Task UploadMissingPackages()
public async Task UploadMissingPackages()
{
throw new NotImplementedException();
if (String.IsNullOrWhiteSpace(_options.token))
throw new InvalidOperationException("Must provide access token to create a GitHub release.");

var releaseDirectoryInfo = _options.GetReleaseDirectory();

var repoUri = new Uri(_options.repoUrl);
var repoParts = repoUri.AbsolutePath.Trim('/').Split('/');
if (repoParts.Length != 2)
throw new Exception($"Invalid GitHub URL, '{repoUri.AbsolutePath}' should be in the format 'owner/repo'");

var repoOwner = repoParts[0];
var repoName = repoParts[1];

var client = new GitHubClient(new ProductHeaderValue("Clowd.Squirrel")) {
Credentials = new Credentials(_options.token)
};

var releasesPath = Path.Combine(releaseDirectoryInfo.FullName, "RELEASES");
if (!File.Exists(releasesPath))
ReleaseEntry.BuildReleasesFile(releaseDirectoryInfo.FullName);

var releases = ReleaseEntry.ParseReleaseFile(File.ReadAllText(releasesPath)).ToArray();
if (releases.Length == 0)
throw new Exception("There are no nupkg's in the releases directory to upload");

var ver = releases.Select(r => r.Version).Max();
if (ver == null)
throw new Exception("There are no nupkg's in the releases directory to upload");

Log.Info($"Preparing to upload latest local release to GitHub");

var newReleaseReq = new NewRelease(ver.ToString()) {
Body = "TODO", // TODO, this should use the release notes from the release, if they exist
Draft = true,
Prerelease = ver.HasMetadata || ver.IsPrerelease,
Name = ver.ToString(),
};

Log.Info($"Creating draft release titled '{ver.ToString()}'");

var existingReleases = await client.Repository.Release.GetAll(repoOwner, repoName);
if (existingReleases.Any(r => r.Name == ver.ToString())) {
throw new Exception($"There is already an existing release titled '{ver}'. Please delete this release or choose a new version number.");
}

var release = await client.Repository.Release.Create(repoOwner, repoName, newReleaseReq);

// locate files to upload
var files = releaseDirectoryInfo.GetFiles("*", SearchOption.TopDirectoryOnly);
var msiFile = files.Where(f => f.FullName.EndsWith(".msi", StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault();
var setupFile = files.Where(f => f.FullName.EndsWith("Setup.exe", StringComparison.InvariantCultureIgnoreCase))
.ContextualSingle("release directory", "Setup.exe file");

var releasesToUpload = releases.Where(x => x.Version == ver).ToArray();
MemoryStream releasesFileToUpload = new MemoryStream();
ReleaseEntry.WriteReleaseFile(releasesToUpload, releasesFileToUpload);
var releasesBytes = releasesFileToUpload.ToArray();

// upload nupkg's
foreach (var r in releasesToUpload) {
var path = Path.Combine(releaseDirectoryInfo.FullName, r.Filename);
await UploadFileAsAsset(client, release, path);
}

// other files
await UploadFileAsAsset(client, release, setupFile.FullName);
if (msiFile != null) await UploadFileAsAsset(client, release, msiFile.FullName);

// RELEASES
Log.Info($"Uploading RELEASES");
var data = new ReleaseAssetUpload("RELEASES", "application/octet-stream", new MemoryStream(releasesBytes), TimeSpan.FromMinutes(1));
await client.Repository.Release.UploadAsset(release, data, CancellationToken.None);

Log.Info($"Done creating draft GitHub release.");
Log.Info("Release URL: " + release.HtmlUrl);
}

private async Task UploadFileAsAsset(GitHubClient client, Release release, string filePath)
{
Log.Info($"Uploading asset '{Path.GetFileName(filePath)}'");
using var stream = File.OpenRead(filePath);
var data = new ReleaseAssetUpload(Path.GetFileName(filePath), "application/octet-stream", stream, TimeSpan.FromMinutes(30));
await client.Repository.Release.UploadAsset(release, data, CancellationToken.None);
}
}
}
}
2 changes: 1 addition & 1 deletion src/Squirrel.CommandLine/SyncOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ public SyncGithubOptions()
{
Add("repoUrl=", "Full url to the github repository\nexample: 'https://github.com/myname/myrepo'", v => repoUrl = v);
Add("token=", "OAuth token to use as login credentials", v => token = v);
Add("pre", "Fetch the latest pre-release instead of stable", v => pre = true);
Add("pre", "Download pre-release instead of stable", v => pre = true);
}

public override void Validate()
Expand Down

0 comments on commit 4c20e31

Please sign in to comment.